ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.1.5
    TIL 2024. 1. 5. 22:06

    개인과제 제출일입니다.

    어제 완성해서 오늘은 세부 조정이나 추가하고 싶었던 기능 추가정도만 했습니다.

    게임 저장하기 기능을 추가해보고 싶었는데 어떻게 하는건지 몰라서(찾아봐도 안나오더라구요. 찾는 방법도 모르겠네요.) 시간 부족으로 구현하지 못했습니다.


    개인과제

     

    필수사항

     

    1. 게임 시작 화면

    2. 상태보기

    3. 인벤토리

    3-1. 장착 관리

    4. 상점

     

    선택사항

     

    1. 아이템 정보를 클래스 / 구조체로 활용해보기

    2. 아이템 정보를 배열로 관리하기

    3. 아이템 추가하기

    3-1. 나만의 새로운 아이템을 추가하기

    4. 아이템 판매하기

    5. 장착 개선

    6. 던전입장 기능 추가 : 클리어 시 아이템 드랍되도록 설정

    class Item 
    {
        void MakeName(float a, float b, float c) 
        {
            int n = random1.Next(10);
            int nn = random1.Next(10);
            int nnn = random1.Next(5);
    
            int secondLength = secondName.Length;
    
            if (n < a)//나무, 낡은 아이템 드랍
            {
                if (nn < 2)//갑옷, 망토 아이템만 드랍
                {
                    name = firstName[nnn % 2] + secondName[nnn % 2];
                }
                else { name = firstName[nnn % 2] + secondName[nnn % secondLength]; }
    
            }
        }
    }

    던전의 난이도에 따라 나오는 아이템 드랍률이 다르기 때문에 class Item에서 드랍률에 손을 좀 보게 되었다.

    a+b+c == 10이 되도록 설정해야한다는 단점이 있는데 먼저 만들어둔 class Item을 거의 바꾸지 않고 하기 위해서 이렇게 하게 되었다. 드랍률을 생각했다면 다른 식으로 아이템을 생성하는걸로 변경했을거같다.

    class Dungeon
    {
        void EasyDungeon()
        {
            int needStrike = 10 + chain.state.Lv;
            int needDepence = 5 + chain.state.Lv;
            int needHP = 20 + random.Next(6);
            int clearpercent = ClearPercent(0, needStrike, needDepence) * 10;
        }
    
        int ClearPercent(int level, int Strike, int Depence)
        {
            return clearPercent;
        }
        void Clear(int hp, int gold, int difficult)
        {
            ClearCount(difficult);
        }
    
        void ClearCount(int difficult)
        {
            int levelup = 10 * chain.state.Lv;
    
            clearCount += difficult;
            witch (difficult)
            {
                case 1:
                    Item easydropitem = new Item(7, 2.5f, 0.5f);
                    easydropitem.goldInt *= 85;
                    easydropitem.goldInt /= 100;
                    easydropitem.gold = $"{easydropitem.goldInt}G";
                    Console.WriteLine("\n아이템을 얻었습니다.\n");
                    Console.WriteLine($"[ {easydropitem.name}  | + {easydropitem.stats}  |  {easydropitem.comment} ]");
                    chain.itemlist.InventoryItem(easydropitem);
                    break;
            }
            if (clearCount > levelup)
            {
                LevelUp();
            }
        }
    }

    어제 적었듯 필요한 공격력, 방어력, 체력 설정을 ViewDungeon에서 난이도 별 던전 함수 안으로 넣었음.

    그리고 던전 클리어가 될 확률을 보여주면 좋을 것 같아서 권장되는 공격력, 방어력, 체력을 받아서 클리어 확률을 보여주는 함수를 새로 만들어서 계산식들을 옮겨주고 클리어 확률로 쓰일 인수를 return 시킴.

    어제 만든 EnterDungeon 함수에 return 값을 받아서 클리어인지 아닌지 확인하고, 클리어가 되면 그에 맞는 아이템이 드랍될 수 있도록 추가해줌. 단, 골드는 구매하는 것이 아니기 때문에 판매가격으로 계산해서 저장시켜줌.

     

    7. 휴식기능 추가

    8. 레벨업 기능 추가

    void LevelUp()
    {
        Console.WriteLine("\n축하합니다! 레벨이 오르셨습니다!\n");
        Console.WriteLine($"LV : {chain.state.Lv} -> LV : {chain.state.Lv + 1}");
        chain.state.Lv++;
        chain.state.Strike += 0.5f;
        chain.state.Depence += 1;
        chain.state.HP += 10;
        clearCount = 0;
    }

    레벨 업의 경우 ClearCount함수에 넣어줬는데, ClearCount 함수의 위치가 Clear 시 나오는 Write 사이에 들어가기 때문에 나가기가 따로 필요 없어서 나가기를 없애고 레벨 업 시 올라가는 스탯들을 계산하는 식을 추가해줌.

     

    9. 게임 저장하기 추가 : 어떻게 해야할지 찾아봐야함


     

    개인과제 해설

    해설보고 작성한 부분입니다. 개인 과제 제출에서는 사용되지 않습니다.

     

     

    do-while : do 내용을 먼저 실행하고 while이 true면 do 내용을 또 실행함.

    private static int CheckInput(int min, int max)
    {
        bool check;
        int input;
        do
        {
            Console.Write("원하시는 행동을 입력해주세요.\n>>");
    
            check = int.TryParse(Console.ReadLine(), out input);
        } while (check == false || CheckInput(input, min, max) == false);
        return input;
    }

    플레이어가 입력한 값을 확인하는 함수.

    정수로 입력하지 않을 경우 : check == false

    선택지에서 벗어난 정수를 입력할 경우 : CheckInput(input, min, max) == false

    두 경우가 되면 while(true)가 되기 때문에 do가 실행됨.

    while(false) 경우 input 값이 return 됨.

     

    -> 사용했던 Number함수와 유사함.

     static int Number()
    {
        int n;
        Console.Write("원하시는 행동을 입력해주세요.\n>>");
    
        bool check = int.TryParse(Console.ReadLine(), out n);
        int number = check ? n : -1;
        return number;
    }
    
     n = Number();
     switch (n)
     {
         case 0:
             Console.Clear();
             break;
         default:
             Console.WriteLine("잘못된 입력입니다.\n");
             //원래 화면으로 보여줌.
             break;
     }

    선택된 화면으로 이동해야하기 때문에 switch를 사용하는 것은 동일하지만, 선택지에 없는 값을 입력하거나 정수를 입력하지 않을 경우 원래 화면으로 돌아갈 수 있도록 설정해줌.


     

    Console.ForegroundColor : 텍스트 색상 변경.

    private static void ChangeTextColorMagenta(string text)
    {
        Console.ForegroundColor = ConsoleColor.Magenta;
        Console.WriteLine(text);
        Console.ResetColor();
    }

    원하는 색상을 ConsoleColor을 이용하여 선택해준다.

    텍스트를 입력하면 색상이 바뀐다.

    단, ResetColor()를 해주지 않으면 계속 바뀐 상태로 출력되기 때문에 원하는 텍스트만 색상 변경하고 ResetColor를 해주는 것을 잊지 말아야한다.


     

    ToString("00") : string으로 변하는 수가 한자리일 경우 앞에 0이 생략되지 않도록 설정.

    Console.WriteLine("LV : " + Lv.ToString("00"));

    가이드에서 Lv을 보여줄 때 01로 나타나기 때문에 사용해주면 좋다.


     

    조건문 ? 참 : 거짓 : 조건문이 참일 경우 참 값을, 거짓일 경우 거짓 값을 반환.

    if (items[i].stats1 != 0) Console.WriteLine($"공격력 {(items[i].stats1 > 0 ? "+" : "")} {items[i].stats1}");
    if (items[i].stats2 != 0) Console.WriteLine($"방어력 {(items[i].stats2 > 0 ? "+" : "")} {items[i].stats2}");

    Number 함수에서도 사용한 삼항연산자이다.

    가이드에서는 모든 아이템들이 공격력 스탯과 방어력 스탯을 가지고 있다.

    단, 방어구는 공격력 스탯이 0이고, 무기는 방어력 스탯이 0이다.

    따라서, items[i]가 무기일 경우 stats1 != 0 이므로 공격력이 출력된다.

    삼항연산자는 아이템의 공격력 스탯이 0보다 크면 " + "를 출력하고, 아니라면 출력이 없이 없으며 뒤에 아이템이 가지고 있는 스탯을 출력하게 된다.

    여기서 의문점은 어차피 stats != 0 이라면 개발자가 잘못만들지 않는 이상 무조건 0보다 클 텐데 왜 삼항연산자를 사용했느냐이다. 그냥 안쓰고 +를 출력하는 것이 간단하지 않을까 싶다.

    아니면 스탯이 음수가 나오는 장비를 제작하기 위해서?!


     

    개인과제 해설의 경우, 캐릭터와 아이템만 class로 만들고 나머지는 함수로 만들어서 사용하고 있기 때문에 많이 다를거라 생각했지만 함수들의 쓰임새를 보면 class 안에 만들어 넣은 함수들과 비슷하기 때문에 보는 것이 도움이 되었습니다.

    그리고 장착하게 되면 bool을 이용하여 name을 수정하는 것이 아닌 단순히 [E] 텍스트를 추가하는 것으로 사용하셨어서 저렇게 만드는 것이 더 편하겠구나 라고 생각이 들었습니다.

    아직 해설을 다 본 것은 아닙니다. 중간에 주석 넣으면서 이렇게 하는 방법도 있다 식으로 적으면서 정리하고 있기 때문에 47:43까지 해설 강의 시청 완료했습니다.

    'TIL' 카테고리의 다른 글

    2024.1.9  (0) 2024.01.09
    2024.1.8  (2) 2024.01.08
    2023.1.4  (2) 2024.01.04
    2024.1.3  (1) 2024.01.03
    2024.1.2-class  (1) 2024.01.02
Designed by Tistory.