KDT Unity 2주차~4주차 - 개인학습4
해당 내용의 전부는 학원에서 배우는 것이기 때문에 공개가 어렵습니다.
해당 내용의 자세한 강의가 필요하신 분들은 이곳에서 확인하시면 됩니다.
2023-11-09 TIL
알고리즘 문제
오늘의 알고리즘 문제 : 문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
- s의 길이는 1 이상 5이하입니다.
- s의 맨앞에는 부호(+, -)가 올 수 있습니다.
- s는 부호와 숫자로만 이루어져있습니다.
- s는 “0”으로 시작하지 않습니다.
1
2
3
4
5
6
public class Solution {
public int solution(string s) {
int answer = 0;
return answer;
}
}
해결
일단 앞의 부호가 붙었는지 안붙었는지 확인을 합니다.
s.FirstOrDefault();을 사용해서 문자열의 0번째 문자를 가져옵니다.
해당 문자가 -일시 -를 제외한 나머지 문자를 int타입으로 변환한 뒤 -1을 곱합니다.
아니면 바로 int타입으로 변환합니다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Solution {
public int solution(string s) {
int answer = 0;
char firstCh = s.FirstOrDefault();
if (firstCh == '-')
{
answer = int.Parse(s.Substring(1))*-1;
}
else
{
answer = int.Parse(s);
}
return answer;
}
}
다른 풀이를 보다 충격적인 사실을 발견했습니다.
int.Parse()은 생각보다 똑똑하다는걸 말입니다.
int.Parse()은 문자열로 된 숫자 앞에 부호까지 스스로 판별해 값을 바꾸어줍니다.
그러므로 숫자 앞에 부호만 있다는 가정하에는 위의 제 풀이보다는 그냥 int.Parse()를 쓰는 방법이 더욱 효율적입니다.
1
2
3
4
5
6
7
public class Solution {
public int solution(string s)
{
int answer = int.Parse(s);
return answer;
}
}
콘솔창 기반의 RPG 게임 개발
구현 화면 먼저 보여드리겠습니다.
- 게임 진입
- 캐릭터 상태
해당화면 구현시 어려웠던 점
캐릭터를 어떻게 만들고 어떻게 가져와야 할지?
오늘 하나밖에 없는 문제점이자 제일 큰 문제였습니다. 캐릭터를 생성할 때 어떻게 생성을 해야하며 무슨 값들을 주어야할지 막막했습니다.
나중에 몬스터도 만들어야하는데 어떡하지? 라는 생각과 함께 인터페이스가 생각이 났습니다.
해당화면 구현시 해결법
인터페이스를 사용해보자 몬스터와 캐릭터가 공유하는 값을 인터페이스화 해서 같이 사용하는 방법이 생각났습니다. 그렇게 하면 인터페이스만 확실히 해놓으면 다른 몬스터를 구현할 때 헤매지 않을 것 같습니다.
인터페이스와 상속받은 캐릭터 구현시 각각 파일을 따로 만들었습니다. 직업은 2가지로 상정하고 만들었습니다.
인터페이스.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
internal interface ICharacter
{
// 해당 캐릭터와 몬스터의 레벨
int Level { get; set; }
// 해당 캐릭터와 몬스터의 이름
string Name { get; }
//해당 캐릭터와 몬스터의 공격력
int Attack { get; }
//해당 캐릭터와 몬스터의 방어력
int Defense { get; set; }
//해당 캐릭터와 몬스터의 체력
int Health { get; set; }
//캐릭터 소유시 사용가능한 화폐 몬스터에게 갈시 드랍 골드
int Gold { get; set; }
//해당 캐릭터와 몬스터의 죽음
bool IsDead { get; }
//해당 캐릭터와 몬스터의 데미지 계산식
void BeDamaged(int damage);
}
캐릭터.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
internal class Character
{
public class Player : ICharacter
{
//플래이어 캐릭터의 직업
public string JobClass { get; }
//상속받은 레벨
public int Level { get; set; }
//상속받은 이름
public string Name { get; }
//상속받은 공격 메소드 실행시 작동할 실제 공격력 값
public int Attack => new Random().Next((JobClass == "전사" ? 5 : 0) + AttackForce, (JobClass == "전사" ? 10 : 20) + AttackForce);
//플레이어 캐릭터의 표시될 공격력
public int AttackForce { get; set; }
//상속받은 방어력
public int Defense { get; set; }
//상속받은 체력
public int Health { get; set; }
//플레이어의 증가할수 있는 최대체력
public int MaxHealth { get; set; }
//상속받은 골드
public int Gold { get; set; }
//상속받은 사망판단
public bool IsDead => Health <= 0;
//플레이어의 직업 특수 능력
public string Ability { get; }
//플레이어의 생존일
public int LiveDay { get; }
//상속받은 데미지 계산식
public void BeDamaged(int damage)
{
if (IsDead) { Console.WriteLine("사망씬 구현"); }
else { Console.WriteLine($"{Name}의 남은 체력 : {Health}"); }
}
//플레이어 캐릭터 생성 메서드(이름 , 직업)
public Player(string name, string jobClass)
{
JobClass = jobClass;
Ability = JobClass == "전사" ? "레벨업시 최대체력이 증가합니다" : "레벨업시 골드 획득량이 증가합니다";
Name = name;
Level = 1;
MaxHealth = 100;
Health = 100;
Gold = 100;
Defense = jobClass == "전사" ? new Random().Next(4, 7) : new Random().Next(0, 3);
AttackForce = JobClass == "전사" ? 5 : 0;
LiveDay = 1;
}
//전에 하던 플레이어 캐릭터 불러오기 메서드(이름, 직업, 레벨, 체력, 최대체력, 돈, 생존요일)
public Player(string name, string jobClass, int level, int health, int maxHealth, int gold, int liveDay)
{
JobClass = jobClass;
Ability = JobClass == "전사" ? "레벨업시 최대체력이 증가합니다" : "레벨업시 골드 획득량이 증가합니다";
Name = name;
Level = level;
MaxHealth = maxHealth;
Health = health;
Gold = gold;
AttackForce = JobClass == "전사" ? 5 : 0;
LiveDay = liveDay;
}
}
}
구동되는 최상단에 클래스에 static Player player = null;으로 플레이어 캐릭터를 담을 공간을 할당해줍니다.
메인클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static void Main(string[] args)
{
bool gameEnd = false;
Console.Title = "KDT PROJECT HOME";
/*
*/
while(!gameEnd)
{
int gameStart = StartScene();
switch (gameStart)
{
case 0:
CampScene(gameStart);
break;
case 1:
CampScene(gameStart);
break;
case 2:
gameEnd = true;
break;
}
}
if(gameEnd)
{
return;
}
CampScene(gameStart);
}
StartScene마지막 switch문
1
2
3
4
5
6
7
8
9
10
11
12
13
switch (selectMenu)
{
case 0:
sceneEnd = true;
break;
case 1:
SubMethod.UpdateInfo("구현중...", 40, 12);
break;
case 2:
Console.SetCursorPosition(0, 26);
sceneEnd = true;
break;
}
CampScene클래스
1
2
3
4
5
6
7
8
9
10
11
static void CampScene(int gmaeCheck)
{
switch (gmaeCheck)
{
case 0:
player = new Player("테스트", "전사");
break;
case 1:
break;
}
}
받은 값을 통해 캐릭터를 할당합니다.
이어하기는 구현이 아직 안되었으므로 새로하기만 가능합니다.
StartScene에서 switch을 통해 CampScene(gameStart);으로 매개변수를 보내주고 해당 값에 따라 행동합니다
1
2
3
Draw.ClearBox(map);
Draw.ClearBox(selectCampMenu);
SubMethod.PlayerInfo(player, keyInfo);
CampScene클래스에서 상세정보로 넘어가기입니다. 큰 틀 박스안에 있는 작은 박스와 중간 박스의 내용을 지워줍니다.
그후 상세정보 출력 메서드로 넘어갑니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public static void PlayerInfo(Character.Player player, ConsoleKeyInfo keyInfo)
{
// 뒤로가기 버튼 생성
Draw.WriteText(">", 68, 22);
Console.ForegroundColor = ConsoleColor.Black;
Console.BackgroundColor = ConsoleColor.White;
Draw.WriteText("뒤로 가기",70, 22);
Console.ResetColor();
플레이어 캐릭터 정보 출력
Draw.WriteText($"Lv. {player.Level} {player.Name} ({player.JobClass})", 4, 7);
Draw.WriteText($"체력 : {player.Health}/{player.MaxHealth}", 4, 9);
Draw.WriteText($"능력 : {player.Ability}",4,11);
if (Program.Equipment[0] > -1) Draw.WriteText($"공격력 : {player.AttackForce} + ({Program.weapons[Program.Equipment[0]].ItemAbility})", 4, 13);
else Draw.WriteText($"공격력 : {player.AttackForce}", 4, 13);
if (Program.Equipment[1] > -1) Draw.WriteText($"방어력 : {player.Defense} + ({Program.armors[Program.Equipment[1]].ItemAbility})", 29, 13);
else Draw.WriteText($"방어력 : {player.Defense}", 29, 13);
Draw.WriteText($"돈 : {player.Gold} 원", 4, 15);
Draw.WriteText($"생존 요일 : {player.LiveDay}일차", 4, 17);
while (true)
{
keyInfo = Console.ReadKey();
if (keyInfo.Key == ConsoleKey.Enter)
{
break;
}
}
}
상세정보에는 버튼이 하나밖에 없으므로 keyInfo.Key == ConsoleKey.Enter로 Enter 버튼 입력시 바로 CampScene으로 돌아갑니다.
이렇게 인터페이스를 사용한 캐릭터 생성에 대해 공부해봤습니다.
오늘의 정리
오늘은 인터페이스를 사용해봤다. 처음에는 이해하는데 큰 어려움이 있었지만 사용하다보니 익숙해졌다. 결국 큰틀을 잡아주는 것이 인터페이스인것 같다. 결국 비슷한 기능을 하는 것들은 크게 인터페이스로 묶어 상속 받아 사용하면 매우 편리한 기능일거 같다.


