내일배움캠프/프로젝트

개인프로젝트 - 텍스트 RPG : 장비 착용 구현

서보훈 2024. 9. 23. 14:29

아이템의 장착과 해제를 구현하였으며, 아이템을 장착하여 스텟이 오르도록 만들어주었습니다.

 


Item 클래스 - 변경점

아이템 클래스의 필드 변수들을 모두 속성 형태로 변경하여 외부에서 아이템의 변수값을 수정하지 못하도록 하였으며 아이템 장착 여부를 판단하는 변수를 추가해주었습니다.

해당 변수는 생성자를 통하여 객체가 생성될때 false값을 가지게 됩니다.

또한 아이템의 가격을 저장하는 프로퍼티가 추가되었습니다.

public class Item
{
    public string Name { get; private set; }
    public string Description { get; private set; }
    public ItemType Type { get; private set; }
    public float ItemAttack {  get; private set; }
    public float ItemDefence {  get; private set; }
    public int ItemId {  get; private set; }
    public int ItemPrice { get; private set; }
    public bool IsEquipped { get; private set; }

    public Item(int _id, string _itemName, string _itemDescription, ItemType _type, int _attck, int _defence, int price)
    {
        ItemId = _id;
        Name = _itemName;
        Description = _itemDescription;
        Type = _type;
        ItemAttack = _attck;
        ItemDefence = _defence;
        ItemPrice = price;
        IsEquipped = false;
    }
}

 

아이템 클래스에 IsEquiped 속성을 변경할 수 있는 함수를 추가해주었습니다.

//장비 장착, 장착해제를 당담
public void EquipThis()
{
    if(IsEquipped)
    {
        IsEquipped = false;
    }
    else
    {
        IsEquipped= true;
    }
}

 

기존 메인함수에서 만들어 처리하던 텍스트 생성을 아이템 클래스에서 자신의 아이템 설명을 생성하여 sting 값으로 반환하도록 수정하였습니다.

이를통에 어느 위치에서든 아이템의 설명을 함수로 불러올수 있게되었습니다.

//자신의 텍스트를 생성
public string InvenItemText()
{
    //장비 타입에 따른 스텟표기 변환
    string itemStat;
    if (Type == ItemType.Weapon)
    {
        itemStat = "공격력 +" + ItemAttack;
    }
    else
    {
        itemStat = "방어력 +" + ItemDefence;
    }

    //장착 여부에 따른 표기 변환 확인
    string itemName;
    if (IsEquipped == true)
    {
        itemName = "[E] " + Name;
    }
    else
    {
        itemName = Name;
    }

    itemName = itemName.PadRight(8, ' ');

    string itemText = itemName + " | " + itemStat + " | " + Description + "   ";
    return itemText;
}

자신의 IsEquiped 프로퍼티의 상태에 따라 설명 앞에 [E] 를 붙이는 여부가 결정됩니다.


Charactor 클래스 - 장착 해제 변수 추가

기존 장착 변수에는 장비를 바꾸는 기능이 있었지만, 장비를 해제할수는 없었습니다.

장비를 해제할때만 사용하는 함수를 추가하여 인벤토리에서 이미 장착한 아이템 선택시 장비를 장착 해제하도록 만들었습니다.

//아이템 장착 해제
public void UnequipItem(ItemType type)
{
    if(type == ItemType.Weapon)
    {
        AttackPoint -= equipSlot[0].ItemAttack;
        equipSlot[0].EquipThis();
        equipSlot[0] = null;
    }
    else
    {
        DefencePoint -= equipSlot[1].ItemDefence;
        equipSlot[0].EquipThis();
        equipSlot[1] = null;
    }
}

또한 아이템 장착 해제시 해당 스텟을 낮추도록 설계하였습니다.

 


Program 클래스 - 게임 기능

먼저 메인함수의 추가내용입니다.

마을 선택지에서 2번을 눌러 인벤토리를 열고, 그 내부에서 1번을 누르면 아이템 장착을 관리, 이외의 입력을 받으면 해당 인벤토리 창을 종료하고 마을 선택지를 다시 발생시킵니다.

else if(input == 2)
{
    ViewInven();
    Console.WriteLine("1. 아이템 장착 관리\n0. 나가기");
    if(InputInt(Console.ReadLine()) == 1)
    {
        LineClear(4);

        EquipOrder();
    }
    else
    {
        Console.Clear();
    }
}

 

2개의 함수가 추가되었습니다.

먼저 LineClear입니다.

//콘솔 라인 삭제 - 1이면 자신라인
private static void LineClear(int line)
{
    Console.WriteLine();
    for(int i = 0; i < line; i++)
    {
        Console.SetCursorPosition(0, Console.GetCursorPosition().Top - 1);
        Console.Write("\r                                                                                \r");
    }
}

해당 함수는 콘솔창의 모든 내용을 지우지 않고, 콘솔의 현재 포인터 위치를 기준으로 한줄씩만 지우는 코드입니다.

TextCreator 함수를 통해 게임을 진행하는 특성상 인벤토리 내용을 다시 표기할경우 시간이 오래걸리기 때문에 줄만을 지우는 함수를 만들어서 사용하였습니다.

 

아이템을 장착하는 함수 EquipOrder()입니다.

인벤토리에서 아이템 장착 관리를 선택할경우 해당함수를 호출하며, 1 ~ 10의 입력을 받으면 인벤토리의 해당 아이템을

장착/ 해제 하고 이외의 값을 입력할경우 장착관리를 종료합니다.

//아이템 장착 요청
private static void EquipOrder()
{
    int input;
    while (true)
    {
        TextCreater("장착 혹은 장착 해제할 아이템 입력 (이외의 입력시 종료) : ", false);
        input = InputInt(Console.ReadLine());
        if (input >= 1 && input <= 10)
        {
            //해당 위치의 인벤토리배열에 아이템이 있을때
            if (playerChar.inventory[input - 1] != null)
            {
                //같은 슬롯에 장착아이템이 있으면 해제, 없으면 장착
                if (playerChar.inventory[input - 1].IsEquipped == true)
                {
                    playerChar.UnequipItem(playerChar.inventory[input - 1].Type);
                }
                else
                {
                    playerChar.EquipItem(playerChar.inventory[input - 1]);
                }
                //마지막라인 위치 저장
                int lastLine = Console.GetCursorPosition().Top;
                //장착을 시도한 위치로 커서이동, 아이템 설명 재입력을 통해 [E] 여부 변경
                Console.SetCursorPosition(0, input + 3);
                Console.Write("-" + input + " " + playerChar.inventory[input - 1].InvenItemText());
                
                Console.SetCursorPosition(0, lastLine);

                LineClear(2);
            }
            else
            {
                TextCreater("아이템이 없습니다.   ", false);
                LineClear(2);
            }
        }
        else
        {
            Console.Clear();
            break;
        }
    }
}

아이템을 장착할경우, 장착한 아이템 설명에 [E]가 추가로 붙으며, 이 내용을 보여주기위해 해당 내용을 다시 출력해줄 필요가 있습니다.

따라서 입력한 값에따라 커서를 이동한 뒤, 설명을 다시 출력하여 장착 여부를 보여주도록 만들어주었습니다.

 


이상 아이템 장착을 구현한 내용입니다.

다음으로는 상점 클래스를 만들어 상점을 구현할 예정입니다.