C# TextRPG #2

정제로·2023년 8월 21일
0

C#

목록 보기
23/30
post-thumbnail

오늘 구현한 것

장착 관리

  • 장착관리가 시작되면 아이템 목록 앞에 숫자가 표시됩니다.
  • 일치하는 아이템을 선택했다면 (예제에서 1~2선택시)
    • 장착중이지 않다면 → 장착
      [E] 표시 추가
    • 이미 장착중이라면 → 장착 해제
      [E] 표시 없애기
  • 일치하는 아이템을 선택했지 않았다면 (예제에서 1~3이외 선택시)
    • 잘못된 입력입니다 출력
  • 아이템의 중복 장착을 허용합니다.
    • 창과 검을 동시에 장착가능
    • 갑옷도 동시에 착용가능
    • 장착 갯수 제한 X

배운것

일단 EquipItem클래스와 Player클래스의 변경점

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;
    }
}

추가된것이 있다.
일단

  1. public string equiped { get; set; }
    public int itAtt { get; }
    public int itDef { get; }
    이거는 아이템 장착/해제시에 변경될 string값이 필요하다 생각이 들어, 변수와 프로퍼티 하나 추가
    또, itAbility를 없애고 공격력 방어력 따로 만들어주었다.

  2. public int baseAtt { get; }

  3. public int baseDef { get; }
    2번과 3번은 player에게 장비로 추가된 능력치가 얼마인지 나타내기위해, 기본값 세팅용 변수와 읽기만 가능한 프로퍼티 추가


장비 장착과 해제시에 [E]표시하기

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}");
}

길다.. 천천히 살펴보자.

  1. equipItemList[i].itAtt != 0 || equipItemList[i].itDef != 0
    해당 인덱스에 존재하는 itAtt혹은 itDef값중 하나라고 0이 아니라면,

  2. string attackBonusText = ""; 문자열로 변수선언.

  3. if (equipItemList[i].itAtt > 0)
    attackBonusText = " + " + equipItemList[i].itAtt;
    attackBonusText는 " + 해당 인덱스 요소의 itAtt값"
    ex) 공격력이 2라면, + 2로 초기화됨

  4. else if (equipItemList[i].itAtt < 0)
    attackBonusText = " - " + equipItemList[i].itAtt;
    attackBonusText는 " - 해당 인덱스 요소의 itAtt값"
    ex) 공격력이-2라면, - 2로 초기화됨

  5. equipItemList[i].itAtt == 0이면,
    attackBonusText는 빈칸으로 처리되어, 출력안됨.
    ex) 공격력 2, 방어력 0이라면
    {equipItemList[i].itType}{attackBonusText}{defenseBonusText}
    여기에서 공격력 + 2 (방어력은 출력안됨)

profile
초보자입니다.. 잘못된 정보, 달게 받겠습니다..

0개의 댓글

관련 채용 정보