2023/11/22 TIL
오늘은 팀 과제 마무리 날이다. 팀과제 마무리를 위해 계속 디버깅하면서 놓친 부분이 있는지 확인했다.
계급
프로젝트 기간 중 나왔던 오류들과, 오류 수정 방법들을 간단히 말해보겠다.
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