상세 컨텐츠

본문 제목

0922 TIL - Re : C#으로 Text RPG 만들기

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

by lucar 2024. 9. 22. 19:16

본문

일단 아이템코드는 그대로 들고오도록 하겠다.

코드의 가독성을 위해 이번에는 class를 통해 만들어진 아이템을 dictionary에 집어 넣는 방식으로 하겠다.

 

이렇게하면 장점은

KEY(코드) 이름 성능 묘사 가격

과 같이 Key하나에 모든 아이템의 정보를 쑤셔넣을 수 있게 된다.

 

모든 키는 중복 되지 않으므로 키를 통해 모든 정보에 접근할 수 있게되는 장점이 있다.

그리고 아이템 클래스에 정보 출력을 넣어주면 인벤토리에서 일일히 열고 상점에서 일일히 열 필요가 없을 것이다.

 

과감하게 상점이랑 플레이어 클래스의 일부분을 삭제하고

다시 작성해보자.

 

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;
    woodenSword.description = "오래된 목검이다. 없는 것보단 낫다.";
    itemcode.Add(101, woodenSword);

    Item axe = new Item();
    axe.name = "벌목도끼";
    axe.damage = 10;
    axe.price = 500;
    axe.description = "날이 잘 서있는 도끼다.";
    itemcode.Add(102, axe);

	.
	.
	.


    itemcode.Add(112, goldRing);

    return itemcode;
}

ItemCode라는 이름의 Dictionary를 생성해주고 만들어진 item들을 키와 함께 저장해서 바깥으로 돌려주겠다.

 

게임 실행 시 한 번 불러와주는 것만으로도 게임내에서 해당 itemcode에 접근하는 효과를 낼 것이다.

 

테스트 해보자.

Item item = new Item();
Dictionary<int, Item> ItemCode = item.ItemCode();
foreach (KeyValuePair<int,Item> pair in ItemCode)
{
    Console.WriteLine(pair.Key + pair.Value.name);
}

메인 함수에 다음과 같이 입력하고 실행해보면?

 

108번이 비어있다.

왜지

 

Item letherHelmet = new Item();
leatherArmor.name = "가죽 투구";
leatherArmor.defense = 3;
leatherArmor.price = 400;
leatherArmor.description = "통풍이 되지 않아 쓰고 있으면 덥다.";
itemcode.Add(108, letherHelmet);

정작 108번은 잘 작성되어있다.

 

해당 Item의 다른 부분에 접근해도 같은 현상이 발생 중이다.

다른 item과 키 값을 바꿔봤는데도 가죽투구만 문제가 발생 중이다.

 

아 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

108번은 잘 작성되어있지 않다!!!!!!

이름은 leatherHelmet인데 왜 아래에는 leatherArmor로 작성되어있지...

 

바꿔주자.

이제 잘 작동한다.

 

게임진행은 일단

 

인트로 (캐릭터 이름과 직업 Get) > 마을진입 (이동(여관,상점,던전)) > 각 장소의 상호작용

status와 Inventory의 접근은 항상 가능

status는 1회 표시 후 추가 접근 내용 없음

Inventory 접근 시 장착 관리로 접근하여 아이템의 장착 및 해제

 

순으로 진행될 것 같다.

 

상점을 구현해보자.

public class Shop
{
    public Dictionary<int,Item> SellList = new Dictionary<int,Item>();
    public Shop(Dictionary<int,Item> ItemList)
    {
        Dictionary<int,Item> SellList = ItemList;
    }
}

 

상점은 우선 게임에 올라온 아이템코드를 받아와서 시작하자.

public void Info(Item i)
{
    Console.Write($"{i.name} | ");
    if(i.damage > 0)
    {
        Console.Write($"{i.damage} | ");
    }
    if(i.defense > 0)
    {
        Console.Write($"{i.defense} | ");
    }
    Console.Write($"{i.description} | ");
    if (i.isSold == false)
    {
        Console.WriteLine($"{i.price}");
    }
    else Console.WriteLine("이미 구매한 상품입니다.");
}

Item 클래스 내부에서 Info함수를 통해 실행 시 내용을 실행해주는 함수를 만들고

 

실행해보면?

잘 실행 되는 것을 볼 수 있다.

 

한 번에 여러기능을 생각하다보니까 머리가 너무 어지럽다... 오늘은 여기까지만 하고 내일 이어서 해보자..

관련글 더보기