상세 컨텐츠

본문 제목

0920 TIL - C#으로 텍스트 게임 만들기 1

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 9. 20. 20:58

본문

기초문법심화 3을 다룰 예정이였으나

점점 조여오는 데드라인의 압박을 이기지 못하고 개인 과제 텍스트 게임 만들기에 돌입한다.

 

필수로 구현해야할 내용은 아래와 같다.

 

게임 시작화면

상태보기 (레벨/이름/직업/공격력/방어력/체력/돈)

인벤토리 (착용 중인 아이템은 E 표시를 붙이기)

장착관리

상점 (보유 골드와 상품의 가격 표시/ 구매완료하였다면 구매완료 표시)

 

 

우선 2가지의 클래스를 작성하자.

Player와 Item이다.

Player는 레벨, 이름, 직업, 공격력, 방어력, 체력, 돈이 표시되어야 하며

Item은 이름, 공격력, 방어력, 가격이 표시되어야 한다.

필드에 작성해주자.

namespace TextRPG
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Player player = new Player();

        }
    }
    
    public class Player
    {
        public string name;
        public int level;
        public string job;
        public int damage;
        public int defense;
        public int hp;
        public int gold;

        public List<Item> Inventory = new List<Item>();
    }

    public class Item
    {
        public bool equiped = false;
        public string name;
        public int damage;
        public int defense;
        public int price;
        public string descrption;
    }
}

 

다음으로 상태보기를 작성해보자.

Player 클래스 내부에 작성하면 될 것 같다.

public void Status()
{
    Console.WriteLine("이  름 : {0}",name);
    Console.WriteLine("레  벨 : {0}",level);
    Console.WriteLine("직  업 : {0}",job);
    Console.WriteLine("공격력 : {0}",damage);
    Console.WriteLine("방어력 : {0}",defense);
    Console.WriteLine("체  력 : {0}",hp);
    Console.WriteLine("  돈   : {0}",gold);
}

 

인벤토리는 List<Item>과 foreach를 사용해서 구현해보자.

public void ShowInventory()
{
    foreach (Item item in Inventory)
    {
        if(item.equiped == true)
        {
            Console.Write("[E] ");
        }
        Console.Write(item.name);
        if(item.damage > 0)
        {
            Console.Write("| 공격력 + {0} |", item.damage);
        }
        if (item.defense > 0)
        {
            Console.Write("| 방어력 + {0} | ", item.defense);
        }
        Console.Write(item.descrption);
    }
}

 

다음은 장착관리를 구현해보자.

아이템을 장착하면 공격력이나 방어력이 상승하게 된다.

부위 별로 아이템을 하나만 장착하게 하려면 어떻게 해야할까

아이템에 부위라는 필드를 따로 만들고

플레이어가 장착하려고 하면 부위 필드의 값을 가져와서 장착되었다면 true 아니라면 false로 변경하고

false일 때만 아이템을 장착할 수 있게 하면 될 것 같다.

 

부위는 대충 무기, 갑옷, 투구, 장신구 정도로 해두겠다.

public enum EquipPlace {Weapon, Armor, Helmet, Accessory};

 

public void Equip(int number) //아이템 장착
{
    Item item = Inventory[number];
    if (equiped[(int)item.place] == false)
    {
        item.equiped = true;
        damage += item.damage;
        defense += item.defense;
    }
}

 

다음은 상점이다.

상점에서는 구매와 판매를 할 수 있으며 아이템 리스트를 미리 채워놔야 한다.

우선 간단하게 부위별로 3 종류씩 아이템 리스트를 제작해보자.

 

무기 갑옷 헬멧 장신구
목검 천 옷 두건 동 반지
벌목 도끼 가죽 갑옷 가죽 투구 은 반지
기사의 랜스 사슬 갑옷 기사 헬름 금 반지

 

무기는 각 공격력 5 ~ 15

갑옷은 각 방어력 3 ~ 9

헬멧은 각 방어력 1 ~ 3

장신구는 각 공격력 1 ~ 3 을 주게 만들어보자.

하여튼 다 적었다.

 

public Dictionary<int, Item> ItemCode()
{
    Dictionary<int, Item> itemcode = new Dictionary<int, Item>();

    Item woodenSword = new Item();
    woodenSword.name = "목검";
    woodenSword.damage = 5;
    woodenSword.price = 300;
    
    .
    .
    .
    .
    .
    
    itemcode.Add(112, goldRing);

    return itemcode;
}

ItemCode함수를 통해 시작과 동시에 게임에 ItemCode를 업로드 하고 거기서 끌어오는 방식을 사용하겠다.

 

근데 만들다 보니까 다시 만들고 싶어졌다...

내일은 조금 더 낫게 다시 만들어보자...

 

지금은 상점이 아닌 Item에서 팔렸는지를 검토하고 있는데 이건 상점에서 해야될 것 같다.

bool[]를 사용해서 각각의 아이템이 부울 배열을 검토하는 걸로 상점에서 팔렸는지 확인할 수 있을 것 같다.

 

public class Shop
{
    public List<Item> SellList = new List<Item>();

    public void AddShopList(Dictionary<int, Item> itemcode)
    {
        foreach (KeyValuePair<int, Item> pair in itemcode)
        {
            SellList.Add(pair.Value);
        }
    }

    public void ShopList()
    {
        int i = 1;
        foreach (Item item in SellList)
        {
            Console.Write($"{i}. {item.name} | {item.description} | ");
            if(item.isSold == true)
            {
                Console.Write("이미 구입한 상품입니다.\r\n");
            }
            else
            {
                Console.Write($"{item.price} G \r\n");
            }
            i++;
        }
    }

    public void BuyItem(int num, Player p)
    {
        if (SellList[num-1].price > p.gold)
        {
            Console.WriteLine("돈이 모자랍니다.");
        }
        else 
        {
            SellList[num - 1].isSold = true;
            p.gold -= SellList[num - 1].price;
            Console.WriteLine($"{SellList[num - 1].name}을(를) 구매했습니다.");
            p.Inventory.Add(SellList[num - 1]);
        }
    }

    public void SellItem(Player p)
    {
        p.ShowInventory();
        Console.WriteLine("판매할 물건 번호를 입력해주세요.");
        int SellNum;
        bool isPossible;
        isPossible = int.TryParse(Console.ReadLine(), out SellNum);
        if (isPossible == true) 
        {
            p.Inventory.Remove(p.Inventory[SellNum]);
            p.gold += p.Inventory[SellNum].price * 80 / 100;
            Console.WriteLine("거래가 완료되었습니다..");

        }

        else
        {
            SellItem(p);
        }
    }

 

상점도 대충 만들었는데 확실히 와이어프레임이나 상관구조를 생각하지 않고 코딩을 하다보니

가독성도 떨어지고 내가 만족스럽지 못한 것 같다.

 

내일은 기획부터 다시 시작해보자.

관련글 더보기