TIL

2023/11/22 TIL

미역제자 2023. 11. 22. 21:48


오늘은 팀 과제 마무리 날이다. 팀과제 마무리를 위해 계속 디버깅하면서 놓친 부분이 있는지 확인했다.


계급

프로젝트 기간 중 나왔던 오류들과, 오류 수정 방법들을 간단히 말해보겠다.

Rank(계급)을 구현 할 때, 초기 코드는 다음과 같았다.

public class Rank
{
    public int month;
    string rank { get; set; }
    public Rank(int initialMonth)
    {
        month = initialMonth;
    }
    public void IncreaseMonth()
    {
        month++;
    }
    public string SetRank()
    {
        if (month >= 1 && month <= 2)
        {
            return rank = "이등병";
        }
        else if (month >= 3 && month <= 8)
        {
            return rank = "일병";
        }
        else if (month >= 9 && month <= 14)
        {
            return rank =  "상병";
        }
        else if (month >= 15 && month <= 18)
        {
            return rank =  "병장";
        }
        else
        {
            return rank =  "민간인";
        }
    }
}

 

1달이 증가하는 메서드를 Rank 메서드 안에 구현하고, month가 증가할 때 month값에 따라서 계급이 바뀌도록 했다.

하지만, 이렇게 구현하고 상태창을 봤을 때, 계급이 나오지 않고 빈칸으로 나왔었다. 

 

그래서

public class Rank
{
    public static int month;
    public static string rank { get; set; }

    public Rank(int initialMonth)
    {
        month = initialMonth;
    }

    public static void SetRank()
    {
        if (month >= 1 && month <= 2)
        {
            rank = "이등병";
        }
        else if (month >= 3 && month <= 8)
        {
             rank = "일병";
        }
        else if (month >= 9 && month <= 14)
        {
            rank =  "상병";
        }
        else if (month >= 15 && month <= 18)
        {
             rank =  "병장";
        }
        else
        {
             rank =  "민간인";
        }
    }
}

요런식으로 랭크를 바꾸는 메서드를 static으로 바꿨다.

 

또 계급을 확인할 수 있는 메서드에서

static void Home()
{
    Rank.SetRank();
}

SetRank를 호출해서 계급을 동기화 시켰다.

Rank myRank = new Rank(1);

게임이 시작할 때 초기 initialmonth를 1이라고 설정하고,

static void OneMonthLater()
{
    Rank.month++;
}

1달이 지날때마다 month가 1씩 증가되도록 했다. 

 

이렇게 수정하니 오류없이 rank가 잘 증가되는 모습을 볼 수 있었다.


체력회복

체력 회복 아이템 메서드를 만들어 보았다.

체력 회복 아이템 메서드를 설명하기에 앞서 아이템 구매 메서드를 설명해 보겠다.

먼저 캐릭터 클래스를 만든다.

//캐릭터 클래스
public class Character
{
    public string Name { get; set; } //캐릭터 이름
    public string Job { get; set; } //캐릭터 직업
    public int Str { get; set; } //캐릭터 힘
    public int Dex { get; set; } //캐릭터 민첩
    public int IQ { get; set; } //캐릭터 지능
    public int Luk { get; set; } //캐릭터 운
    public int Hp { get; set; } //캐릭터 체력
    public int MaxHp { get; set; } //캐릭터 최대체력
    public int MaxMind { get; set; } //캐릭터 최대정신력
    public int Mind { get; set; } //캐릭터 정신력
    public int _gold; //소유 골드
    public List<Skill> Skills { get; set; }

    public int Gold //골드 증감
    {
        get { return _gold; }
        set { _gold = value; }
    }


    public List<Food> InventoryFood { get; } = new List<Food>(); // 인벤토리 리스트 추가
    public List<Armor> InventoryArmor { get; } = new List<Armor>(); // 인벤토리 리스트 추가
    public List<Weapon> InventoryWeapon { get; } = new List<Weapon>(); // 인벤토리 리스트 추가

    public Character(string name, string job, int str, int dex, int iq, int luk, int hp, int maxHp, int maxMind, int gold, int mind)
    {
        Name = name;
        Job = job;
        Str = str;
        Dex = dex;
        IQ = iq;
        Luk = luk;
        Hp = hp;
        MaxHp = maxHp;
        MaxMind = maxMind;
        _gold = gold;
        Mind = mind;
        Skills = new List<Skill>();
    }
    


    public void AddToInventoryFood(Food food)
    {
        //인벤토리에 아이템 추가
        InventoryFood.Add(food);
    }
    public void AddToInventoryArmor(Armor armor)
    {
        //인벤토리에 아이템 추가
        InventoryArmor.Add(armor);
    }
    public void AddToInventoryWeapon(Weapon weapon)
    {
        //인벤토리에 아이템 추가
        InventoryWeapon.Add(weapon);
    }

    //장비 장착
    public void EquipWeapon(int input)
    {
        //착용하려는 장비가 인벤토리 안에 있는 장비인가
        if (input > 0 && input <= InventoryWeapon.Count)
        {
            
            //배열은 0부터 시작하기 때문에 input-1
            var item = InventoryWeapon[input - 1];

            if (!item.isEquipped) //착용여부가 false일때
            {
                
                item.isEquipped = true; //착용여부를 true로 바꿈
                Console.WriteLine($" [{item.ItemName}]을(를) 장착했습니다.");
                //착용된 아이템의 스탯을 캐릭터 스탯에 적용
                
                Str += item.ItemStr;
                Dex += item.ItemDex;
                IQ += item.ItemIq;
                Luk += item.ItemLuk;
            }
            else
            {
                item.isEquipped = false; //착용여부를 false로 바꿈
                Console.WriteLine($" [{item.ItemName}]을(를) 해제했습니다.");
                //착용 해제된 아이템의 스탯을 캐릭터 스탯에 적용
                Str -= item.ItemStr;
                Dex -= item.ItemDex;
                IQ -= item.ItemIq;
                Luk -= item.ItemLuk;
            }
        }
        else
        {
            Console.WriteLine(" 잘못된 입력입니다.");
        }
        
        
    }
    public void EquipArmor(int input)
    {
        //착용하려는 장비가 인벤토리 안에 있는 장비인가
        if (input > 0 && input <= InventoryArmor.Count)
        {
            
            //배열은 0부터 시작하기 때문에 input-1
            var item = InventoryArmor[input - 1];

            if (!item.isEquipped) //착용여부가 false일때
            {
                
                item.isEquipped = true; //착용여부를 true로 바꿈
                Console.WriteLine($" [{item.ItemName}]을(를) 장착했습니다.");
                
                //착용된 아이템의 스탯을 캐릭터 스탯에 적용                
                MaxMind += item.ItemMind;
                MaxHp += item.ItemHp;
            }
            else
            {
                item.isEquipped = false; //착용여부를 false로 바꿈
                Console.WriteLine($" [{item.ItemName}]을(를) 해제했습니다.");
                
                //착용 해제된 아이템의 스탯을 캐릭터 스탯에 적용                
                MaxMind -= item.ItemMind;
                MaxHp -= item.ItemHp;
            }
        }
        else
        {
            Console.WriteLine(" 잘못된 입력입니다.");
        }
        
    }
}

캐릭터 클래스에 캐릭터 스탯, 장비 장착 메서드, 인벤토리에 아이템 추가 메서드를 구현했다.

 

그리고 아이템 클래스를 만들었다.

//소비형 아이템
public class Food
{
    public string ItemName { get; } //아이템 이름

    public int ItemHp { get; } //아이템 체력

    public int ItemMind { get; } //아이템 체력

    public int ItemGold { get; } //아이템 가격

    public string ItemDescription { get; } //아이템 상세설명

    public string ItemEffect { get; } //아이템 효과

    public Food(string itemName, int itemHp, int itemMind, int itemGold, string itemDescription, string itemEffect)
    {
        ItemName = itemName;
        ItemHp = itemHp;
        ItemMind = itemMind;
        ItemGold = itemGold;
        ItemDescription = itemDescription;
        ItemEffect = itemEffect;
    }
}


//장비형 아이템
public class Item //부모 클래스
{
    public string ItemName { get; } // 아이템 이름
    public int ItemGold { get; } // 아이템 가격
    public string ItemDescription { get; } // 아이템 상세 설명

    public string ItemEffect { get; }

    public Item(string itemName, int itemGold, string itemDescription, string itemEffect)
    {
        ItemName = itemName;
        ItemGold = itemGold;
        ItemDescription = itemDescription;
        ItemEffect = itemEffect;
    }
}


public class Weapon : Item    // 무기 클래스 (아이템을 상속받음)
{
    public int ItemStr { get; } // 공격력
    public int ItemDex { get; } // 민첩성
    public int ItemIq { get; } // 지능
    public int ItemLuk { get; } // 행운
    public bool isEquipped { get; set; } //장착여부

    public Weapon(string itemName, int itemGold, string itemDescription, int itemStr, int itemDex, int itemIq, int itemLuk, string itemEffect, bool isEquipped = false)
        : base(itemName, itemGold, itemDescription, itemEffect)
    {
        ItemStr = itemStr;
        ItemDex = itemDex;
        ItemIq = itemIq;
        ItemLuk = itemLuk;
    }
}


public class Armor : Item         // 방어구 클래스 (아이템을 상속받음)
{
    public int ItemMind { get; } // 정신력
    public int ItemHp { get; } // 체력
    public bool isEquipped { get; set; } //장착여부
    public Armor(string itemName, int itemGold, string itemDescription, int itemMind, int itemHp, string itemEffect, bool isEquipped = false)
        : base(itemName, itemGold, itemDescription, itemEffect)
    {
        ItemMind = itemMind;
        ItemHp = itemHp;
    }
}

음식, 무기, 방어구에 아이템 스탯을 달아주었다.

 

아이템의 isEquipped가 true로 바뀌면 기존 캐릭터 스탯에 아이템 스탯을 더해주고, isEquipped가 false로 되면 아이템 스탯을 빼주는 방법으로 아이템 스탯 적용을 구현했다.

 

이 방법에서 음식을 먹으면 회복되는 메서드를 추가했어야해서 위의 코드에서 보다시피 maxHp라는 변수를 추가해줬다.

   static void EatFood(Food food)
   {
       Console.WriteLine($"{food.ItemName}을 사용했습니다.");
       Console.WriteLine();

       player1.Hp += food.ItemHp;
       if (player1.Hp >= player1.MaxHp)
       {
           player1.Hp = player1.MaxHp;
       }

       player1.Mind += food.ItemMind;
       if (player1.Mind >= player1.MaxMind)
       {
           player1.Mind = player1.MaxMind;
       }
       Console.WriteLine("체력, 정신력이 회복되었습니다.");
   }

 

그래서 음식을 먹으면 체력이 차고, 최대 체력을 넘어가지는 않도록 만들었다.


난이도

난이도 구현을 위해서 먼저 난이도 선택 창을 만들어줬다.

internal class Program
{
    private static int howhard;
    //시작화면
    static void StartScene()
    {
        int cursor = 0;
        bool onScene = true;
        string[] text = { "                              쉬움",
        "                              보통",
        "                             어려움" };
        while (onScene)
        {
            Console.Clear();
            //시작화면
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("                                                                                ");
            Console.WriteLine("                  Press Any Key to start the game.                       ");
            Console.ResetColor();
            Console.WriteLine("                    ==========================                             ");
            Console.WriteLine("                                                                              ");
            // Text[] Output
            TextChoice(cursor, text);
            Console.WriteLine("                                                                              ");
            Console.WriteLine("                    ==========================                             ");
            // Key Input
            e = Console.ReadKey();
            // Cursor Index
            cursor = CursorChoice(e, cursor, text, ref onScene);
        }
        switch (cursor)
        {
            case 0:
                //쉬움
                howhard = 1;
                foreach (Enemy enemy in enemys)
                {
                    enemy.EnemyAtk *= howhard;
                }
                Console.WriteLine(" 선택 난이도: 쉬움");
                Console.ReadKey();
                TrainingSchool(player1);//줄거리로 이동
                break;
            case 1:
                //보통
                howhard = 2;
                foreach (Enemy enemy in enemys)
                {
                    enemy.EnemyAtk *= howhard;
                }
                Console.WriteLine(" 선택 난이도: 보통");
                Console.ReadKey();
                TrainingSchool(player1);//줄거리로 이동
                break;
            case 2:
                //어려움
                howhard = 3;
                foreach (Enemy enemy in enemys)
                {
                    enemy.EnemyAtk *= howhard;
                }
                Console.WriteLine(" 선택 난이도: 어려움");
                Console.ReadKey();
                TrainingSchool(player1);//줄거리로 이동
                break;
        }
        TrainingSchool(player1);//줄거리로 이동
    }
   }

팀원분이 구현해 놓은 커서 이동 메서드를 통해 방향키를 이동하면 난이도를 고를 수 있도록 했다.

난이도를 고르게 되면 howhard라는 변수의 값이 바뀌게 되며, 이 변수 값을 모든 보스 몬스터의 공격력에 곱해서 강해지도록 바꿨다.


이 외에도 여러가지를 만들어보고 수정도 해보았다.

https://github.com/Einstephener/14team