장착 관리
- 장착관리가 시작되면 아이템 목록 앞에 숫자가 표시됩니다.
- 일치하는 아이템을 선택했다면 (예제에서 1~2선택시)
- 장착중이지 않다면 → 장착
[E] 표시 추가- 이미 장착중이라면 → 장착 해제
[E] 표시 없애기- 일치하는 아이템을 선택했지 않았다면 (예제에서 1~3이외 선택시)
- 잘못된 입력입니다 출력
- 아이템의 중복 장착을 허용합니다.
- 창과 검을 동시에 장착가능
- 갑옷도 동시에 착용가능
- 장착 갯수 제한 X
class EquipItem // 장비목록
{
public string equiped { get; set; }
public string itName { get; }
public int itAtt { get; }
public int itDef { get; }
public string itType { get; }
public string itInfo { get; }
public EquipItem(string _Equiped, string _ItName, int _ItAtt, int _ItDef, string _ItType, string _ItInfo)
{
equiped = _Equiped;
itName = _ItName;
itAtt = _ItAtt;
itDef = _ItDef;
itType = _ItType;
itInfo = _ItInfo;
}
}
//-----------------------------------------------------------------------------------
public class Player //플레이어 클래스
{
public string name { get; }
public string job { get; }
public int lv { get; }
public int att { get; set; }
public int def { get; set; }
public int hp { get; set; }
public int currentGold { get; set; }
public int baseAtt { get; }
public int baseDef { get; }
public Player(string _Name, string _Job, int _Lv, int _Att, int _Def, int _Hp, int _CurrentGold)
{
name = _Name;
job = _Job;
lv = _Lv;
att = _Att;
def = _Def;
hp = _Hp;
currentGold = _CurrentGold;
baseAtt = _Att;
baseDef = _Def;
}
}
추가된것이 있다.
일단
public string equiped { get; set; }
public int itAtt { get; }
public int itDef { get; }
이거는 아이템 장착/해제시에 변경될 string값이 필요하다 생각이 들어, 변수와 프로퍼티 하나 추가
또, itAbility를 없애고 공격력 방어력 따로 만들어주었다.
public int baseAtt { get; }
public int baseDef { get; }
2번과 3번은 player에게 장비로 추가된 능력치가 얼마인지 나타내기위해, 기본값 세팅용 변수와 읽기만 가능한 프로퍼티 추가
ConsoleKeyInfo info = Console.ReadKey();
int selectedEquipment = (info.KeyChar - '0') - 1; // 장비인벤토리 인덱스값을 확인하기 위한 변수
if (0 <= selectedEquipment && selectedEquipment < equipItemList.Count) // info의 char값을 int로 변환
{
Console.ReadKey();
Console.Clear();
if (equipItemList[selectedEquipment].equiped.StartsWith("[E] "))
{
equipItemList[selectedEquipment].equiped = equipItemList[selectedEquipment].equiped.Substring(4); // [E]가 있으면 제거
MainGame.player.att -= equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 해제되면 공격력 제거하기
MainGame.player.def -= equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 해제되면 방어력 제거하기
}
else
{
equipItemList[selectedEquipment].equiped = "[E] "; // [E]가 없으면 추가
MainGame.player.att += equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 되면 공격력 추가하기
MainGame.player.def += equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 되면 방어력 추가하기
}
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("장착할 장비의 번호를 입력하세요");
Console.Write(">> ");
EquipManage();
}
일단 이렇게 코드가 완성됐다.
ConsoleKeyInfo info = Console.ReadKey(); int selectedEquipment = (info.KeyChar - '0') - 1;
입력받은 info를 keychar로 반환후 -'0'을하면 int값으로 변경된다!
(ASCII코드 번호 참고)
이후 -1을 해주면 1을 입력시 가장 상단에 위치하게 될 equipItemList의 인덱스0을, 2를 입력시 인덱스1을 찾게 해주었다.
if (equipItemList[selectedEquipment].equiped.StartsWith("[E] ")) { equipItemList[selectedEquipment].equiped = equipItemList[selectedEquipment].equiped.Substring(4); // [E]가 있으면 제거 MainGame.player.att -= equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 해제되면 공격력 제거하기 MainGame.player.def -= equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 해제되면 방어력 제거하기 } else { equipItemList[selectedEquipment].equiped = "[E] "; // [E]가 없으면 추가 MainGame.player.att += equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 되면 공격력 추가하기 MainGame.player.def += equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 되면 방어력 추가하기 }
입력받은 selectedEquipment값은 equipItemList의 인덱스값이 되어,
만약 equipItemList가 [E]로 시작하면,
즉, 이미 장착중이면 [E]를 없앤후, 추가 능력치 item의 Att, Def값을 플레이어에게서 제거!해당 아이템이 장착중이 아니라면,
[E]를 앞에 붙이고, 추가 능력치 item의 Att, Def값을 플레이어에게 추가!!
장비 장착 시 플레이어 능력치 변경
MainGame.player.att -= equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 해제되면 공격력 제거하기 MainGame.player.def -= equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 해제되면 방어력 제거하기 //-------------------------------------------------------------------------------------------------------------------- MainGame.player.att += equipItemList[selectedEquipment].itAtt; // player객체의 공격력 값에 [E]가 추가되면 공격력 추가하기 MainGame.player.def += equipItemList[selectedEquipment].itDef; // player객체의 방어력 값에 [E]가 추가되면 방어력 추가하기
플레이어에게 추가능력치 표시
Console.WriteLine($" 공격력 : {player.att} (+{player.att - player.baseAtt})"); Console.WriteLine($" 방어력 : {player.def} (+{player.def - player.baseDef})");
이렇게 장비 장착시와 해제시에 맞춰서, 각 장비에 있는 능력치만큼 더하고 빼준다.
if (equipItemList[i].itAtt != 0 || equipItemList[i].itDef != 0) // itAtt와 itDef중 하나라도 0이 아니면
{
string attackBonusText = ""; //공격력 추가 메세지는 ""로 초기화 -> 아래 if문에서 초기화가 되지 않으면 빈칸으로 나옴
if (equipItemList[i].itAtt > 0)
{
attackBonusText = " + " + equipItemList[i].itAtt; // itAtt가 0보다 크면 attackBonusText에 할당
}
else if (equipItemList[i].itAtt < 0)
{
attackBonusText = " - " + (-equipItemList[i].itAtt);// itAtt가 0보다 작으면 attackBonusText에 할당
}
string defenseBonusText = "";//방어력 추가 메세지는 ""로 초기화 -> 아래 if문에서 초기화가 되지 않으면 빈칸으로 나옴
if (equipItemList[i].itDef > 0)
{
defenseBonusText = " + " + equipItemList[i].itDef;// itDef가 0보다 크면 defenseBonusText에 할당
}
else if (equipItemList[i].itDef < 0)
{
defenseBonusText = " - " + (-equipItemList[i].itDef);// itDef가 0보다 작으면 defenseBonusText에 할당
}
Console.WriteLine($" - {i + 1}. {equipItemList[i].equiped}{equipItemList[i].itName} | {equipItemList[i].itType}{attackBonusText}{defenseBonusText} | {equipItemList[i].itInfo}");
}
길다.. 천천히 살펴보자.
equipItemList[i].itAtt != 0 || equipItemList[i].itDef != 0
해당 인덱스에 존재하는 itAtt혹은 itDef값중 하나라고 0이 아니라면,
string attackBonusText = ""; 문자열로 변수선언.
if (equipItemList[i].itAtt > 0)
attackBonusText = " + " + equipItemList[i].itAtt;
attackBonusText는 " + 해당 인덱스 요소의 itAtt값"
ex) 공격력이 2라면, + 2로 초기화됨
else if (equipItemList[i].itAtt < 0)
attackBonusText = " - " + equipItemList[i].itAtt;
attackBonusText는 " - 해당 인덱스 요소의 itAtt값"
ex) 공격력이-2라면, - 2로 초기화됨
equipItemList[i].itAtt == 0이면,
attackBonusText는 빈칸으로 처리되어, 출력안됨.
ex) 공격력 2, 방어력 0이라면
{equipItemList[i].itType}{attackBonusText}{defenseBonusText}
여기에서 공격력 + 2 (방어력은 출력안됨)