🐧 들어가기 앞서

생각한 것 보다 필수 요구사항을 잘 완성했다.

저번주에 제작했던 버전보다 조금 더 확실하게 작동한다.


🐧 스파르타 던전 구현

1. Main(string[] args)

private static PlayerStat playerStat;
private static ItemData itemData;
// 플레이어가 아이템을 구매하면, ItemInDatabase -> playerInventory -> playuerEquippedItems로 넘어가는 구조
static List<ItemData> itemsInDatabase = new List<ItemData>();
static List<ItemData> playerEquippedItems = new List<ItemData>();

static void Main(string[] args)
{
	InitItemDatabase();
	PlayerDataSet();
	MainGameScene();
}
  1. PlayerStat
    playerStat 변수를 PlayerStat Class의 인스턴스로 저장한다.
  2. ItemData
    itemData 변수를 ItemData class의 인스턴스로 저장한다.
  3. itemsInDatabase
    아이템 데이터를 관리하기 위해 List로 선언했다.
    여기서 아이템의 기본 정보를 관리한다.
  4. playerEquippedItems
    플레이어의 장착중인 아이템을 관리하는 List다.
  5. Main
    아이템 데이터, 플레이어 데이터를 초기 설정하고 메인 게임 화면을 불러온다.

2. InitItemDatabase()

InitItemDatabase 메서드는 초기 아이템 정보를 세팅한다.

static void InitItemDatabase()
        {
            itemsInDatabase.Add(new ItemData(0, "낡은 검", 2, 0, "쉽게 볼 수 있는 낡은 검입니다."));
            itemsInDatabase.Add(new ItemData(1, "천 갑옷", 0, 2, "질긴 천을 덧대어 제작한 낡은 갑옷입니다."));
            itemsInDatabase.Add(new ItemData(2, "헤라클레스의 곤봉", 5, 0, "이 곤봉은 12가지 과업을 대비해서 갖고 다녀야합니다."));
            itemsInDatabase.Add(new ItemData(3, "포세이돈의 삼지창", 10, 0, "이 삼지창을 쥐면 바다를 다스릴 수 있다는 소문 때문에 선원들이 탐내는 무기입니다."));
            itemsInDatabase.Add(new ItemData(4, "헤르메스 트리스메기투스의 지팡이", 30, 0, "미지의 세계, 아틀란티스로 갈 수 있는 열쇠입니다."));
        }

ItemsInDatabase리스트에 추가 하면서 ItemData에 맞게 각 정보를 저장한다.

2.1 Class ItemData

public class ItemData
    {
        public int ItemId;
        public bool IsItemEquipped;
        public string ItemName;
        public int ItemAtk;
        public int ItemDef;
        public string ItemComm;

        public ItemData(int _itemId, string _itemName, int _itemAtk, int _itemDef, string _itemComm)
        {
            ItemId = _itemId;
            ItemName = _itemName;
            ItemAtk = _itemAtk;
            ItemDef = _itemDef;
            ItemComm = _itemComm;
            IsItemEquipped = false;
        }
    }

3. PlayerDataSet()

사용자의 닉네임을 게임 시작하기 전에 설정한다.
Console.Title은 콘솔 창의 이름을 변경한다!
또한 기본적인 초기값은 요구사항대로 진행했다.

static void PlayerDataSet()
        {
            Console.Title = "닉네임을 설정하세요!";
            Console.WriteLine("게임에 사용하실 닉네임을 입력해주세요!");
            Console.Write(">>");
            // 게임 닉네임 설정 및 데이터 설정
            string _inputName = Console.ReadLine();

            if (_inputName != null)
            {
                Console.Clear();
                playerStat = new PlayerStat($"{_inputName}", "전사", 1, 10, 5, 100, 1500);
            }
            else
            {
                Console.WriteLine("이름을 입력해주세요!");
            }
        }

3.1 Class PlayerStat

public class PlayerStat
    {
        public string Name;
        public string PlayerClass;
        public int Level;
        public int AtkValue;
        public int DefValue;
        public int HpValue;
        public int Gold;
        public int BaseAtkValue;
        public int BaseDefValue;

        public PlayerStat(string _name, string _playerClass, int _level, int _atkValue, int _defValue, int _hpValue, int _gold)
        {
            Name = _name;
            PlayerClass = _playerClass;
            Level = _level;
            AtkValue = _atkValue;
            DefValue = _defValue;
            HpValue = _hpValue;
            Gold = _gold;

            BaseAtkValue = _atkValue;
            BaseDefValue = _defValue;
        }
    }

BaseAtkValue 는 장비를 착용 / 착용 해제 시
기본 플레이어의 데이터를 저장하기 위해 설정했다.
장비를 착용하면, 기존의 플레이어의 스탯에 + - 되는 구조다.

4. MainGameScene()

static void MainGameScene()
        {
            Console.Title = "스파르타 던전";
            SetConsoleColor(ConsoleColor.Red);
            Console.WriteLine("Sparta Dungeon Game!");
            Console.ResetColor();
            SetConsoleColor(ConsoleColor.Cyan);
            Console.Write($"{playerStat.Name} ");
            Console.ResetColor();
            Console.WriteLine("님, 스파르타 마을에 오신것을 환영합니다!\n");
            Console.WriteLine("이곳에서 던전으로 돌아가기 전 활동을 할 수 있습니다.\n");
            Console.WriteLine("0. 게임 종료");
            Console.WriteLine("1. 상태 보기");
            Console.WriteLine("2. 인벤토리");
            Console.WriteLine(" ");
            int _input = CheckValidAction(0, 2);

            switch (_input)
            {
                case 0:
                    Environment.Exit(0);
                    break;
                case 1:
                    DisplayPlayerState();
                    break;
                case 2:
                    DisplayPlayerInventory();
                    break;
            }
        }

스파르타 던전에 입장하면 출력되는 화면이다.
입력 값은 우선 0~2번이다.

사용자가 0번을 입력하면, 게임 종료
1번을 입력하면 상태
2번을 입력하면 인벤토리를 확인할 수 있다.

Environment.Exit(0);

콘솔이 즉시 종료된다!

4.1 SetConsoleColor()

SetConsoleColor은 계속 콘솔을 출력할까봐 설정했다.

Console.BackgroundColor = ConsoleColor.Gray; 

이 작업을 줄였다.

static void SetConsoleColor(ConsoleColor foregroundColor)
        {
            Console.ForegroundColor = foregroundColor;
        }

만들고 보니 뭔가 의미가 없어보이긴 하지만,,

4.2 CheckValidAction()

static int CheckValidAction(int _min, int _max)
        {
            while (true)
            {
                Console.WriteLine(" ");
                Console.WriteLine(" 원하시는 행동을 입력해주세요.");
                Console.Write(">>");
                string _input = Console.ReadLine();

                bool _parseSuccess = int.TryParse(_input, out var _ret);
                if (_parseSuccess)
                {
                    if (_ret >= _min && _ret <= _max)
                        return _ret;
                }
                Console.WriteLine("잘못된 입력입니다.");
            }
        }

튜터님께서 작성하신 입력값에 대한 처리를 하는 메서드다.
정말 깔끔하다. 꼭 배워야지!

ret = return!

5. DisplayPlayerInventory()

플레이어의 인벤토리를 확인하는 메서드다.

static void DisplayPlayerInventory()
        {
            Console.Clear();
            Console.Title = "인벤토리";
            Console.WriteLine("[인벤토리]");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
            Console.WriteLine("[아이템 목록]");

            string ItemEquipped;
            for (int i = 0; i < itemsInDatabase.Count; i++)
            {
                ItemData item = itemsInDatabase[i];

                ItemEquipped = item.IsItemEquipped ? "[E] " : "";
                if (item.IsItemEquipped)
                {
                    SetConsoleColor(ConsoleColor.Yellow);

                }
                Console.Write($"{ItemEquipped}");
                Console.ResetColor();
                Console.Write($"{item.ItemName}");
                DisplayAtkOrDef(item); // DisplayAtkOrDef 메서드에 아이템 객체를 전달
                Console.WriteLine($" {item.ItemComm} ");
            }
            Console.WriteLine(" ");
            Console.WriteLine("1. 장착 관리");
            Console.WriteLine("0. 나가기");

            int _input = CheckValidAction(0, 1);

            switch (_input)
            {
                case 0:
                    Console.Clear();
                    MainGameScene();
                    break;
                case 1:
                    Console.Clear();
                    ManagementPlayerInventory();
                    break;
            }
        }

Switch문으로 각 입력값에 대한 처리를 진행한다.
0. 나가기
1. 장비를 장착할 수 있는 창으로 넘어간다.

플레이어가 아이템을 장착했는지에 대한 여부를 확인하고, 삼항 연산자를 통해 장착에 대한 결과를 보여준다.

5.1 ManagementPlayerInventory()

플레이어의 아이템을 장착하는 메서드다.

static void ManagementPlayerInventory()
        {
            ...
            int _input = CheckValidAction(0, itemsInDatabase.Count);

            if (_input == 0)
            {
                Console.Clear();
                DisplayPlayerInventory();
            }
            else if (_input > 0 && _input <= itemsInDatabase.Count)
            {
                // 아이템 인덱스는 0부터 시작!
                ItemData selectedItem = itemsInDatabase[_input - 1];
                ToggleEquip(selectedItem);
                ManagementPlayerInventory();
            }
        }

ItamData의 인덱스의 -1값 (0부터 시작하고, 아이템은 1부터 시작)
에 따라 장착 / 장착 해제를 진행할 수 있다.

5.2 DisplayAtkOrDef()

  1. 아이템의 공격력이 0보다 크고 동시에 방어력이 0일 때라면, 해당 아이템은 공격력이 있는 아이템입니다. 이 경우 "공격력 + [아이템의 공격력]"을 출력한다.

  2. 아이템의 공격력이 0이고 방어력이 0보다 큰 경우에는 해당 아이템은 방어력이 있는 아이템입니다. 이 경우 "방어력 + [아이템의 방어력]"을 출력한다.

  • 오류
    초기에는 이런식으로 코드를 작성하니, 모두 통일되어 공격력, 방어력이 표시되었다.

static void DisplayAtkOrDef()
        {
            if (itemData.ItemAtk > 0 && itemData.ItemDef == 0)
            {
                Console.Write($"| 공격력 + {itemData.ItemAtk} |");
            }
            else if (itemData.ItemAtk == 0 && itemData.ItemDef > 0)
            {
                Console.Write($"| 방어력 + {itemData.ItemDef} |");
            }
        }
  • 해결
    이렇게 각 리스트마다 함수가 적용되게 변경했어야 했다.

static void DisplayAtkOrDef(ItemData item)
        {
            if (item.ItemAtk > 0 && item.ItemDef == 0)
            {
                Console.Write($"| 공격력 + {item.ItemAtk} |");
            }
            else if (item.ItemAtk == 0 && item.ItemDef > 0)
            {
                Console.Write($"| 방어력 + {item.ItemDef} |");
            }
        }

6. DisplayPalyerState()

static void DisplayPlayerState()
        {
            Console.Clear();
            Console.WriteLine($"상태보기");
            Console.WriteLine($"캐릭터의 정보가 표시됩니다.");
            Console.WriteLine($"Lv. {playerStat.Level}");
            Console.WriteLine($"{playerStat.Name} ( {playerStat.PlayerClass} )");
            Console.WriteLine($"공격력 : {playerStat.AtkValue}");
            Console.WriteLine($"방어력 : {playerStat.DefValue}");
            Console.WriteLine($"체 력 : {playerStat.HpValue}"); ;
            Console.WriteLine($"Gold : {playerStat.Gold} G");
            Console.WriteLine(" ");
            Console.WriteLine("0. 나가기");
            int _input = CheckValidAction(0, 0);

            switch (_input)
            {
                case 0:
                    Console.Clear();
                    MainGameScene();
                    break;
            }
        }

캐릭터의 정보가 표시되는 메서드다. 딱히 특별한 점은 없다.


🐧 실행 결과

  1. 시작화면
    닉네임을 설정할 수 있다. 또한 타이틀이 적용된 모습을 확인할 수 있다.

  2. 메인 화면
    설정된 이름에 따라 출력되는 모습을 확인할 수 있다.

2-1. 종료
0을 누르면 게임은 종료된다.

  1. 플레이어 상태
    플레이어의 상태가 표시된다.

  2. 인벤토리 - 기본
    인벤토리를 확인할 수 있다. 1번을 누르면, 장착화면으로, 0번을 누르면 메인으로 돌아간다.

4.1 인벤토리 - 장착관리
장착 / 해제하고 싶은 아이템의 인덱스를 입력하면 장착 가능하다.

4-1. 인벤토리 - 장착
1번을 눌러 장착한 모습을 확인할 수 있다.

4-2. 인벤토리 - 중복 장착
인벤토리의 아이템이 중복 장착 가능할 수 있는 요구사항을 만족했다.
장착 해제 또한 가능하다!

4-3. 인벤토리
장착 관리에서 실행한 기능이 인벤토리에서도 확인 가능하다.
장착된 아이템은 [E]로 확인할 수 있다.

  1. 플레이어 스탯 반영
    장착한 아이템에 따라서 플레이어 스탯이 증가했다.
    10 -> 47
    5 -> 7

🐧 내일 할 일

선택 요구 사항 중

아이템 정보를 클래스 / 구조체로 활용하기
아이템 정보를 배열로 관리하기
아이템 추가하기
콘솔 꾸미기
인벤토리 크기기 맞춤
인벤토리 정렬하기
상점 - 아이템 구매
상점 - 아이템 판매
장착 개선
던전입장
휴식기능
레벨업기능
게임 저장하기

다는 못할 것 같지만, 선택과 집중을 통해 최대한 기능을 빠르게 구현하자..


만족스럽게 필수요구사항을 구현해서 다행이다.

주말까지만해도 실력이 부족해서 힘들었는데,

공부한 보람이 있다.

0개의 댓글