개발일지

240927(금) [해설 강의를 통해 추가로 알게 된 부분 정리]

게임 프로그래머 2024. 9. 27. 21:29

저번에 적은 내용은 제외하고 정리했다.

 

먼저 문자에 대한 예외 처리

int result;

while (true) // 반복해서 실행할 수 있도록
{
    string input = Console.ReadLine();
    bool isNumber = int.TryParse(input, out result); // 문자에 대한 예외처리 코드
    
    if(isNumber)
    {
        break;
    }
    Console.WriteLine("잘못된 입력입니다");
}

 

해설

더보기

사용자가 입력한 값이 input 변수에 저장되고 TryParse에 int 결과가 들어감

 

입력한 값이 숫자가 아니라면 TryParse 의 값이 False 처리되므로  if문을 빠져나가고 while문을 다시 반복

입력한 값이 숫자라면 TryParse 의 값이 True 처리되므로 if문에 break가 작동하고 while문을 빠져나감

Tryparse는 손에 익을때까지 계속 쳐봐야겠다.

 

추가 공격력 구현

if(extraAtk == 0)         
    Console.WriteLine($"공격력 : {atk}");
else
{
    Console.WriteLine($"공격력 : {atk} (+{extraAtk})");
}

 

왜 변수로 extraAtk를 선언 해볼 생각을 못했을까 느낀 부분

 

삼항연산자

string displayAtk;
displayAtk = extraAtk == 0 ? $"공격력 : {atk}" : $"공격력 : {atk} (+{extraAtk})";
Console.WriteLine(displayAtk);

// 최종정리
Console.WriteLine(extraAtk == 0 ? $"공격력 : {atk}" : $"공격력 : {atk} (+{extraAtk})");

같은 구문이지만 삼항연산자를 통해 코드의 가독성을 높힐 수 있다.

 

 

아이템목록 나타내기

// 배열선언
private static string[] itemName = { "수련자 갑옷", "무쇠갑옷", "스파르타의 갑옷", "낡은 검", "청동 도끼", "스파르타의 창"};
private static int[] itemType = { 1, 1, 1, 0, 0, 0 }; // 0 : 무기, 1 : 방어구
private static int[] itemValue = { 5, 9, 15, 2, 5, 7 };  
private static string[] itemDesc = {"수련에 도움을 주는 갑옷입니다.", "무쇠로 만들어져 튼튼한 갑옷입니다.", "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.", "쉽게 볼 수 있는 낡은 검 입니다.", "어디선가 사용됐던거 같은 도끼입니다.", "스파르타의 전사들이 사용했다는 전설의 창입니다."};
private static int[] itemPrice = {1000, 2000, 3500, 600, 1500, 2500};

 

[아이템목록]
Console.WriteLine($"- {itemName[0]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[0]}  |  {itemDesc[0]}  | {itemPrice[0]}  G");
Console.WriteLine($"- {itemName[1]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[1]}  |  {itemDesc[1]}  | {itemPrice[1]}  G");
Console.WriteLine($"- {itemName[2]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[2]}  |  {itemDesc[2]}  | {itemPrice[2]}  G");
Console.WriteLine($"- {itemName[3]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[3]}  |  {itemDesc[3]}  | {itemPrice[3]}  G");
Console.WriteLine($"- {itemName[4]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[4]}  |  {itemDesc[4]}  | {itemPrice[4]}  G");
Console.WriteLine($"- {itemName[5]}  |  {(itemType[0] == 0 ? "공격력" : "방어력")} +{itemValue[5]}  |  {itemDesc[5]}  | {itemPrice[5]}  G");

 

물론 이렇게도 구현 가능하지만, 굉장히 복잡하고 코드가 지저분하며

인덱스에 접근 시 숫자를 잘못 기입하는 문제 발생할 수 있다.

 

반복문을 통해 해결할 수 있다.(배열과 반복문은 항상 같이 생각한다.)

for(int i = 0; i < itemName.Length; i++)
{
    Console.WriteLine($"- {itemName[i]}  |  {(itemType[i] == 0 ? "공격력" : "방어력")} +{itemValue[i]}  |  {itemDesc[i]}  | {itemPrice[i]}  G");
}

 

itemName의 개수(Length)만큼 반복문을 처리한 것이다. (배열을 쓰는 장점 중 하나)  

 

인벤토리 구현

리스트를 사용한다.

private static List<int> inventory = new List<int>();
private static string[] itemName = { "수련자 갑옷", "무쇠갑옷", "스파르타의 갑옷", "낡은 검", "청동 도끼", "스파르타의 창"};

배열 순서대로 0, 1, 2, 3, 4, 5

어떤걸 선택하냐에 따라 inventory에 추가하는 행위가 된다.

List.add();

 

이외 내용은 너무 길기도 하고 단순 내용 정리외엔 별 의미가 없는 것 같아서 적다가 지웠다.

추가로 알게된 부분은 배열과 리스트 사용시 반복문에 조건식에 기재되는 내용에 차이가 있다.

배열은 Length, 리스트는 Count

반복문의 조건식은 단순히 숫자만 들어가는것이 아닌 개수(Length, Count)만큼 기입 가능한점은

응용할 수 있다면 좋은 스킬인 것 같다.