부트캠프 8일차
1. 오늘 학습 키워드
TRPG 프로젝트
2. 오늘 학습 한 내용을 나만의 언어로 정리하기
오늘은 좀 편하게 작성할 예정이다.
우선 Lobby와 setup 메서드가 포함되어있던 Program 클래스를 메인 함수만 사용할 수 있도록 분리했다.
internal class Program
{
static void Main(string[] args)
{
Setup setup = new Setup();
Player player = new Player();
Store store = new Store();
setup._Setup(player);
Lobby._Lobby(player);
}
}
⊙ Setup Class
class Setup
{
bool IsSelected = false;
public void _Setup(Player player)
{
Console.WriteLine("원하시는 캐릭터의 이름을 입력해주세요");
string name = Console.ReadLine();
player.Name = name;
Console.Clear();
while (!IsSelected)
{
Console.WriteLine("원하시는 직업을 선택해주세요\n");
Console.WriteLine("1. 전사\n2. 마법사\n3. 궁수\n4. 도적");
string choice = Console.ReadLine();
if (int.TryParse(choice, out int Value) && Enum.IsDefined(typeof(Classes), Value))
{
Classes classes = (Classes)Value;
player.Class = classes.ToString();
IsSelected = true;
//생략
}
}
}
}
Setup에서 변화한 부분만 가져왔다.
직업 선택을 다른 문자를 입력해도 다음 화면으로 넘어가는 이슈를 발견했고,
이를 해결하기 위해, bool을 사용해 if(!IsSelected) 이기에 False 로 초기화한 IsSelected가 While 반복문을 타고
조건문을 통해, 해당 enum에 들어가는 문자일 경우, 조건문을 타서, IsSelected를 true로 변환하며
반복문을 다시 못타게 설정했다.
⊙Lobby Class
static class Lobby
{
public static void _Lobby(Player player)
{
Window window = new Window(player);
}
}
로비도 바꾼 부분만 가져왔다.
우선 Lobby는 자주 사용할 클래스 일것같아서, static을 붙여 클래스를 만들었다.
그리고 매개 변수를 통해 화면이 전환이 되더라도, player를 계속 유지하도록 했다.
⊙Window Class
class Window
{
public Player player;
public Store store;
public Window(Player player)
{
this.player = player;
this.store = new Store();
}
public void ShowStatus()
{
player.Display_Status();
}
public void ShowInventory()
{
player.Display_Inventory();
}
public void ShowStore(Player player)
{
store.Show_Store(player);
}
}
Window Class는 Status, Inventory, Store의 창을 로드하는 클래스로 만들었다
⊙Player Class
class Player
{
public string Name { get; set; }
public string Class { get; set; }
public int Level { get; private set; } = 1;
public int Stat_Offense { get; private set; } = 10;
public int Stat_Defense { get; private set; } = 5;
public float HP { get; private set; } = 100;
public int Gold { get; set; } = 1500;
public Inventory Inventory { get; set; } = new Inventory();
public void Display_Status()
{
while (true)
{
Console.Clear();
Console.WriteLine("상태 보기");
Console.WriteLine("캐릭터의 정보가 표시됩니다.\n");
Console.WriteLine("Lv. " + Level);
Console.WriteLine(Name + " " + Class);
Console.WriteLine("공격력 : " + Stat_Offense);
Console.WriteLine("방어력 : " + Stat_Defense);
Console.WriteLine("체 력 : " + HP);
Console.WriteLine("Gold : " + Gold + "\n");
Console.WriteLine("0. 나가기\n");
Console.Write("원하시는 행동을 입력해주세요.\n>> ");
string Choice = Console.ReadLine();
if (Choice == "0")
{
break;
}
else
{
Console.WriteLine("잘못된 값을 입력했습니다");
}
}
Lobby._Lobby(this);
}
public void Display_Inventory()
{
Console.WriteLine("인벤토리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.\n");
Console.WriteLine("[아이템 목록]\n");
Inventory.Display();
Console.WriteLine("1. 장착 관리");
Console.WriteLine("0. 나가기");
Console.Write("원하시는 행동을 입력해주세요.\n>> ");
string choice = Console.ReadLine();
if (choice == "0")
{
Lobby._Lobby(this);
}
else if (choice == "1")
{
Inventory.Manage_Equip();
}
}
}
우선 코드 상단에 플레이어가 가질 능력치를 먼저 선언했다.
그리고 능력치와 인벤토리를 볼 수 있도록 하는 메서드들도 만들어서 Player에서 관리했다.
그리고 모든 작업이 끝나고 0을 선택할시에 로비로 다시 돌아가도록 했다.
⊙Inventory Class
class Inventory
{
private List<Item> items = new List<Item>();
public void Add_Item(Item item)
{
items.Add(item);
}
public void Display()
{
if (items.Count == 0)
{
Console.WriteLine();
}
else
{
for (int i = 0; i < items.Count; i++)
{
Console.WriteLine($" - {i + 1}. {items[i].Item_Name} : {items[i].Item_Info}");
}
}
}
}
Add_item을 통해 인벤토리에 아이템을 넣고, for 반복문을 통해 현재 가진 아이템을 표시할 수 있도록 작성했다.
Inventory에는 장착관리와 추가 기능으로 던전을 넣을시, 랜덤 확률로 아이템 드랍도 고민중이기에, 아직 미완 상태이다.
그리고 추가적으로 아이템 구매 혹은 획득 시, 능력치 증가도 추가해야한다.
⊙Store Class
class Store
{
private List<Item> Store_Items = new List<Item>()
{
new Item { Item_Name = "수련자 갑옷", Stat_Defense = 5, Item_Info = "수련에 도움을 주는 갑옷입니다.", Price = 1000, IsPurchased = false,IsArmor = true, IsUsable=false },
new Item { Item_Name = "무쇠갑옷",Stat_Defense = 9, Item_Info = "무쇠로 만들어져 튼튼한 갑옷입니다.", Price = 2000, IsPurchased = false ,IsArmor = true, IsUsable=false },
new Item { Item_Name = "스파르타의 갑옷", Stat_Defense = 15, Item_Info = "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.", Price = 3500, IsPurchased = false ,IsArmor = true, IsUsable = false},
new Item { Item_Name = "낡은 검", Stat_Offense = 2, Item_Info = "쉽게 볼 수 있는 낡은 검입니다.", Price = 600, IsPurchased = false ,IsArmor = false, IsUsable=false },
new Item { Item_Name = "청동 도끼", Stat_Offense = 5, Item_Info = "어디선가 사용됐던 도끼입니다.", Price = 1500, IsPurchased = false ,IsArmor = false, IsUsable=false },
new Item { Item_Name = "스파르타의 창", Stat_Offense = 7, Item_Info = "스파르타의 전사들이 사용했다는 전설의 창입니다.\t", Price = 2500, IsPurchased = false,IsArmor = false, IsUsable=false }
};
public void Show_Store(Player player)
{
while (true)
{
Console.Clear();
Console.WriteLine("상점에 오신 것을 환영합니다!");
Console.WriteLine($"[보유 골드] {player.Gold} G\n");
Console.WriteLine("[아이템 목록]");
for (int i = 0; i < Store_Items.Count; i++)
{
var item = Store_Items[i];
string _Purchase = item.IsPurchased ? "구매 완료" : $"{item.Price}";
if(item.IsArmor)
Console.WriteLine($"{i + 1}. {item.Item_Name} | 방어력 {item.Stat_Defense} | {item.Item_Info} | {_Purchase}");
else
Console.WriteLine($"{i + 1}. {item.Item_Name} | 공격력 {item.Stat_Offense} | {item.Item_Info} | {_Purchase}");
}
Console.WriteLine("\n1. 아이템 구매");
Console.WriteLine("0. 나가기");
Console.Write("원하시는 행동을 입력해주세요.\n>> ");
string choice = Console.ReadLine();
if (choice == "1")
{
Buy_Item(player);
}
else if (choice == "0")
{
Lobby._Lobby(player);
}
else
{
Console.WriteLine("잘못된 선택입니다.");
}
}
}
private void Buy_Item(Player player)
{
Console.Write("구매할 아이템 번호를 선택해주세요.\n>> ");
string Selection = Console.ReadLine();
if (int.TryParse(Selection, out int index) && index > 0 && index <= Store_Items.Count)
{
Item selectedItem = Store_Items[index - 1];
if (selectedItem.IsPurchased)
{
Console.WriteLine("이미 구매한 아이템입니다.");
Console.WriteLine("아무 키를 눌려 계속");
Console.ReadKey();
}
else if (player.Gold >= selectedItem.Price)
{
player.Gold -= selectedItem.Price;
player.Inventory.Add_Item(selectedItem);
selectedItem.IsPurchased = true;
Console.WriteLine($"{selectedItem.Item_Name}을(를) 구매했습니다.");
Console.WriteLine("아무 키를 눌려 계속");
Console.ReadKey();
}
else
{
Console.WriteLine("보유 중인 골드가 부족합니다.");
Console.WriteLine("아무 키를 눌려 계속");
Console.ReadKey();
}
}
else
{
Console.WriteLine("잘못된 선택입니다.");
Console.WriteLine("아무 키를 눌려 계속");
Console.ReadKey();
}
}
}
구매에 대한 기능만 구현하였고, List를 사용하여, Store에 item들을 추가하였다.
그리고 보유 골드에 따라 아이템 구매, 구매 시에 아이템 구매 완료 처리 등을 구현하였다.
3. 학습하며 겪었던 문제점 & 에러
Player 클래스가 계속 Null로 변해서, 매개 변수로 받은 로비가 작동을 안하는 오류가 있어서, 그 부분을 고치는데 시간을 많이 썼다.
클래스 내부에서 Lobby._lobby()를 사용하기위해 매개 변수로 player를 넣기 위해, Player player로 선언했고, 그 때문인지 계속 오류가 나서 Null이 되어버렸다,
이를 고친 방법은 그냥 단순하게, Player player를 통해 사용하는 것이 아니라, Lobby_lobby(this)로 매개 변수를 this를 사용해
그냥 해당 클래스를 사용하면 되는거였다...
4. 내일 학습 할 것은 무엇인지
구현하고 코딩을 작성하는데 조금 오래 걸리는 편이라고 생각한다.
추가 기능들을 전부 구현을 해야 내 실력이 금방 증가 하고, 학습 성취도가 높지만, 느리다,,
현재 필수 구현의 80-90프로는 한 상태이기에, 내일은 필수 구현 마무리에, 추가 구현으로 손을 뻗는 것을 목표로 잡고 계속 작업할 예정이다.
'TIL' 카테고리의 다른 글
25.02.05 TIL (0) | 2025.02.05 |
---|---|
25.02.04 TIL (0) | 2025.02.04 |
인터페이스, TRPG 초안 (0) | 2025.02.03 |
if(today == 25.01.27) for (int i = today; i<25.01.28;i++) Class TIL (0) | 2025.01.27 |
Unity Anim , Console.Write("Today is 25.01.24"); (0) | 2025.01.25 |