생각한 것 보다 필수 요구사항을 잘 완성했다.
저번주에 제작했던 버전보다 조금 더 확실하게 작동한다.
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();
}
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에 맞게 각 정보를 저장한다.
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;
}
}
사용자의 닉네임을 게임 시작하기 전에 설정한다.
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("이름을 입력해주세요!");
}
}
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 는 장비를 착용 / 착용 해제 시
기본 플레이어의 데이터를 저장하기 위해 설정했다.
장비를 착용하면, 기존의 플레이어의 스탯에 + - 되는 구조다.
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);
콘솔이 즉시 종료된다!
SetConsoleColor은 계속 콘솔을 출력할까봐 설정했다.
Console.BackgroundColor = ConsoleColor.Gray;
이 작업을 줄였다.
static void SetConsoleColor(ConsoleColor foregroundColor)
{
Console.ForegroundColor = foregroundColor;
}
만들고 보니 뭔가 의미가 없어보이긴 하지만,,
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!
플레이어의 인벤토리를 확인하는 메서드다.
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. 장비를 장착할 수 있는 창으로 넘어간다.
플레이어가 아이템을 장착했는지에 대한 여부를 확인하고, 삼항 연산자를 통해 장착에 대한 결과를 보여준다.
플레이어의 아이템을 장착하는 메서드다.
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부터 시작)
에 따라 장착 / 장착 해제를 진행할 수 있다.
아이템의 공격력이 0보다 크고 동시에 방어력이 0일 때라면, 해당 아이템은 공격력이 있는 아이템입니다. 이 경우 "공격력 + [아이템의 공격력]"을 출력한다.
아이템의 공격력이 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} |");
}
}
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;
}
}
캐릭터의 정보가 표시되는 메서드다. 딱히 특별한 점은 없다.
시작화면
닉네임을 설정할 수 있다. 또한 타이틀이 적용된 모습을 확인할 수 있다.
메인 화면
설정된 이름에 따라 출력되는 모습을 확인할 수 있다.
2-1. 종료
0을 누르면 게임은 종료된다.
플레이어 상태
플레이어의 상태가 표시된다.
인벤토리 - 기본
인벤토리를 확인할 수 있다. 1번을 누르면, 장착화면으로, 0번을 누르면 메인으로 돌아간다.
4.1 인벤토리 - 장착관리
장착 / 해제하고 싶은 아이템의 인덱스를 입력하면 장착 가능하다.
4-1. 인벤토리 - 장착
1번을 눌러 장착한 모습을 확인할 수 있다.
4-2. 인벤토리 - 중복 장착
인벤토리의 아이템이 중복 장착 가능할 수 있는 요구사항을 만족했다.
장착 해제 또한 가능하다!
4-3. 인벤토리
장착 관리에서 실행한 기능이 인벤토리에서도 확인 가능하다.
장착된 아이템은 [E]로 확인할 수 있다.
선택 요구 사항 중
아이템 정보를 클래스 / 구조체로 활용하기
아이템 정보를 배열로 관리하기
아이템 추가하기
콘솔 꾸미기
인벤토리 크기기 맞춤
인벤토리 정렬하기
상점 - 아이템 구매
상점 - 아이템 판매
장착 개선
던전입장
휴식기능
레벨업기능
게임 저장하기
다는 못할 것 같지만, 선택과 집중을 통해 최대한 기능을 빠르게 구현하자..
만족스럽게 필수요구사항을 구현해서 다행이다.
주말까지만해도 실력이 부족해서 힘들었는데,
공부한 보람이 있다.