<구상 및 설계>
기본적으로 게임 시작화면과 선택지를 눌렀을 때, 캐릭터의 상태를 볼 수 있는 상태 보기창과 인벤토리 창으로 구성할 예정이다.
능력이 된다면 던전까지 구현하고 싶지만 시간과 능력 부족으로 팀 프로젝트 때 함께 구현해야할 것 같다.
게임 시작
- 1. 상태 보기
- 2. 인벤토리 - 1. 장착 관리
- 3. 상점
- 4. 던전 입장
<구현>
게임 시작
// 선택지
static int CheckValidInput(int min, int max)
{
while (true)
{
string input = Console.ReadLine();
bool parseSuccess = int.TryParse(input, out var ret);
if (parseSuccess)
{
if (ret >= min && ret <= max)
return ret;
}
Console.WriteLine("잘못된 입력입니다.");
}
}
// 메인화면
static void GameLogo()
{
Console.WriteLine("= Sparta Dungeon =");
Console.WriteLine("1. 게임시작");
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int input = CheckValidInput(0, 1);
switch (input)
{
case 0:
break;
case 1:
DisplayGameIntro();
break;
}
}
// 스타트
static void DisplayGameIntro()
{
Console.Clear();
Console.WriteLine("==================================================");
Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.\n이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
Console.WriteLine("==================================================");
Console.WriteLine();
Console.WriteLine("1. 상태 보기\n2. 인벤토리\n0. 메인화면");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int input = CheckValidInput(0, 2);
switch (input)
{
case 0:
Console.Beep();
Main();
break;
case 1:
DisplayMyInfo();
break;
case 2:
DisplayInventory();
break;
}
}
상태 보기
class Program
{
private static Character player;
// 메인
static void Main(string[] args)
{
GameDataSetting();
DisplayGameIntro();
}
// 각종 데이터
static void GameDataSetting()
{
// 캐릭터 정보 세팅
player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);
// 아이템 정보 세팅
}
static void DisplayMyInfo()
{
Console.Clear();
Console.Title = "= Information =";
ChooseTextColor("= 상태 보기 =");
LineTextColor("캐릭터의 정보가 표시됩니다.");
Console.WriteLine();
StatTextColor("Lv. ", player.Level.ToString("00")); // 00, 07 등 한자릿수도 두자릿수로 표현하기 위해 string 타입으로 변환
Console.WriteLine();
Console.WriteLine("{0} ( {1} )", player.Name, player.Job);
StatTextColor("공격력 : ", player.Atk.ToString());
Console.WriteLine();
StatTextColor("방어력 : ", player.Def.ToString());
Console.WriteLine();
StatTextColor("체 력 : ", player.Hp.ToString());
Console.WriteLine();
StatTextColor("Gold : ", player.Gold.ToString());
Console.WriteLine();
Console.WriteLine();
ChooseTextColor("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int input = CheckValidInput(0, 0);
switch (input)
{
case 0:
DisplayGameIntro();
break;
}
}
}
// 플레이어의 캐릭터 상태 클래스
public class Character
{
public string Name { get; }
public string Job { get; }
public int Level { get; }
public int Atk { get; }
public int Def { get; }
public int Hp { get; }
public int Gold { get; }
public Character(string name, string job, int level, int atk, int def, int hp, int gold)
{
Name = name;
Job = job;
Level = level;
Atk = atk;
Def = def;
Hp = hp;
Gold = gold;
}
}
인벤토리
class Program
{
private static Character player;
private static Item[] items;
// 각종 데이터
static void GameDataSetting()
{
// 캐릭터 정보 세팅
player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);
// 아이템 정보 세팅
items = new Item[10]; // 최대 아이템 10개
AddItem(new Item("무쇠갑옷", "무쇠로 만들어져 튼튼한 갑옷입니다.", 0, 0, 5, 0));
AddItem(new Item("낡은 검", "쉽게 볼 수 있는 낡은 검입니다.", 1, 2, 0, 0));
AddItem(new Item("고양이 수염", "고양이 수염은 행운을 가져다 줍니다. 야옹!", 1, 7, 7, 7));
}
// 아이템 추가
static void AddItem(Item item)
{
if (Item.ItemCount == 10) return; // 아이템이 꽉차면 아무일도 일어나지 않는다
items[Item.ItemCount] = item; // 0개 -> items[0], 1개 -> items[1] ...
Item.ItemCount++; // AddItem이 될 때마다 ItemCount가 올라간다
}
// 인벤토리
static void DisplayInventory()
{
Console.Clear();
Console.Title = "= inventory =";
Console.WriteLine("인벤토리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
Console.WriteLine();
Console.WriteLine("[아이템 목록]");
for (int i = 0; i < Item.ItemCount; i++)
{
items[i].ItemStat();
}
Console.WriteLine("");
Console.WriteLine("1. 장착 관리\n0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int input = CheckValidInput(0, 1);
switch (input)
{
case 0:
DisplayGameIntro();
break;
case 1:
DisplayerEquip();
break;
}
}
}
// 아이템 클래스
public class Item
{
public string Name { get; }
public string Description { get; }
public int Type { get; }
public int AtkOption { get; }
public int DefOption { get; }
public int HpOption { get; }
public bool IsEquipped { get; set; }
public static int ItemCount = 0; // static을 붙임으로 Item이라는 클래스에 귀속된다
public Item(string name, string description, int type, int atkOption, int defOption, int hpOption, bool isEquipped = false)
{
Name = name;
Description = description;
Type = type;
AtkOption = atkOption;
DefOption = defOption;
HpOption = hpOption;
IsEquipped = isEquipped;
}
// 아이템 착용여부
public void ItemStat(bool wearItem = false, int index = 0)
{
Console.Write("- ");
if (IsEquipped)
{
Console.Write("[");
Console.Write("E");
Console.Write("]");
}
Console.Write(Name);
Console.Write(" | ");
if (AtkOption != 0) Console.Write($"AtkOption {(AtkOption >= 0 ? "+" : "")}{AtkOption} "); // 삼항연산자
if (DefOption != 0) Console.Write($"DefOption {(DefOption >= 0 ? "+" : "")}{DefOption} "); // 옵션이 0이 아니라면 옵션수치를 내보내라
if (HpOption != 0) Console.Write($"HpOption {(HpOption >= 0 ? "+" : "")}{HpOption} "); // [조건 ? 참 : 거짓]
Console.Write(" | ");
Console.WriteLine(Description);
}
}
장착관리
// 장착 관리
static void DisplayerEquip()
{
Console.Clear();
Console.Title = "= Item Equip =";
Console.WriteLine("인벤토리 - 장착 관리");
Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
Console.WriteLine();
Console.WriteLine("[아이템 목록]");
for (int i = 0; i < Item.ItemCount; i++)
{
items[i].ItemStat(true, i + 1);
}
Console.WriteLine();
Console.WriteLine("0. 나가기");
Console.WriteLine();
Console.WriteLine("원하시는 행동을 입력해주세요.");
Console.Write(">> ");
int input = CheckValidInput(0, Item.ItemCount);
switch (input)
{
case 0:
DisplayInventory();
break;
default:
ToggleEquipStatus(input - 1); // 유저가 입력하는건 1, 2, 3... 실제 배열에는 0, 1, 2...
DisplayerEquip();
break;
}
}
// 장비 장착 여부
private static void ToggleEquipStatus(int index)
{
items[index].IsEquipped = !items[index].IsEquipped; // ! : 불형의 변수를 반대로 만들어주는 것
}
// 장비 능력치 더하기
private static int itemStatSumAtk()
{
int sum = 0;
for (int i = 0; i < Item.ItemCount; i++)
{
if (items[i].IsEquipped) sum += items[i].AtkOption;
}
return sum;
}
private static int itemStatSumDef()
{
int sum = 0;
for (int i = 0; i < Item.ItemCount; i++)
{
if (items[i].IsEquipped) sum += items[i].DefOption;
}
return sum;
}
private static int itemStatSumHp()
{
int sum = 0;
for (int i = 0; i < Item.ItemCount; i++)
{
if (items[i].IsEquipped) sum += items[i].HpOption;
}
return sum;
}
'부트캠프 > Project' 카테고리의 다른 글
<프로젝트> 팀과제 TextRPG 계획(1) (0) | 2023.11.15 |
---|---|
<개인 과제> TextRPG 만들기(2) (1) | 2023.11.14 |
<미니 프로젝트> 팀원 소개 카드 게임 5일차 (0) | 2023.11.03 |
<미니 프로젝트> 팀원 소개 카드 게임 4일차 (0) | 2023.11.02 |
<미니 프로젝트> 팀원 소개 카드 게임 3일차 (0) | 2023.11.01 |