나 개발자 진짜 되냐?

C#으로 텍스트 RPG 만들기 _ [ 하 ] 본문

C# 을 맛보았어요!/프로젝트를 만들었어요!

C#으로 텍스트 RPG 만들기 _ [ 하 ]

Snow Rabbit 2024. 9. 27. 15:56

 

 

기분은 안 두둠칫이지만..

 

두둠칫 하며 시작한다.


지난 시간까지 우리는 화면 UI를 구상했다.

+ 화면 이동까지 성공!

https://qua28.tistory.com/140

 

C#으로 텍스트 RPG 만들기 _ 1

음..크리스마스는 아니지만이제 팀프로젝트를 시작하기 전 기본 개념을 다잡기 위해 다시! 텍스트 RPG를 짜보려고한다. 다시다시다시 중요한건 다시 다시마.. 여튼 시작한다. 먼저 TEXT RPG를

qua28.tistory.com

 

후후 오늘은 두 번째!

이제 정보를 담을 데이터를 조금 정리해보려고 한다.

 

 

먼저 캐릭터 7개와

상점에 리스트출력을 위한 5가지 값들을 적어보자.

 

 

여기서 빨간 줄인 이유는

초기화를 안 해서 그렇습니다.

 

 

자! 먼저

 

캐릭터 정보를 우리는 1. 상태정보에 넣어보려고 한다.

 

일단 하드코딩을 조금 해보자.

 

DisplayStatUI로 가서

 

Console.WriteLine("Lv." + level);

 

이렇게 문자열 뒤에 숫자가 나올 경우 + 를 해주면 합쳐지게 된다.

 

하지만 여러 글자나 숫자를 합칠 때마다

계속 +를 써줄 수 없다.

 

그래서 우리는 부분문자열이라고 부르는

$

돈친구를 사용해 줄 것이다.

 

문자열 시작하는 맨 앞에

" 앞에

$를 붙이고

변수로 만들고 싶은 곳을

중괄호 열고 {변수}라고 쓰면

 

위의 저 + 식과 동일하면서도 간편하게 된다.

 

Console.WriteLine($"Lv. {level}");

이렇게 완성하면

 

LV.1이 나올 것이다

Lv.01로 나오게 하려면 어떻게 해야 할까?!

 

바로 변수 뒤에

 : D2를 써주면 된다.

몇 자리까지 보관할지 정해주는 거라고 생각해 주면 된다.

 

우리가 예전에 소수점 둘째 자리에서 반올림을 표현하려면

: N2를 쓰듯

 

여기서는 정수를 두 글자 만들 때 : D2

실수형, 유리수를 두 글자로 만들려면 : F2를 

써주면 된다!

앞에 : 써주어야 한다!

 

더 작성해 보자

 

캐릭터 이름과 직업을 적어주어야 한다.

 

직업에서 보면 {} 안에다가 글을 썼기 때문에

부분문자열에서 {}를 표현해 줄 방법이 필요하다.

 

그것은 중괄호 두 번 쓰기!

 

        Console.WriteLine($"{name} {{ {job} }}");

주황 중괄호가 부분문자열을 위해 쓰는 중괄호고

 

정말 중괄호를 써야 한다면

부분문자열 중괄호를 하나 더 써주고

그 안에다가

중괄호를 포함한 변수를 써주면 된다.

 

 

이렇게 작성된 정보를 statUI에 넣는 것도 방법은 되겠지만

 

그럼 너무 정신없으니

또 함수 하나 만들어 준다.

 

이름은 SetData

 

그리고 초기화해준다.

 

위에서 이미 선언해 주었기 때문에 뭐

변수 초기값만 써주면 된다.

사실 위에서 선언해 줘서 같이 써줘도 되긴 하는데

이 함수를 가지고 stat창에 띄워야 하기 때문에

따로 초기화해준다.

 

요렇게!

 

그러면

 

초기화되어서 빨간 줄도 사라진다.

우린 아직 안 쓴 게 있다.

바로 추가공격력과 추가방어력

(+n) 이렇게 표시해주어야 한다.

 

 

이 친구는 어떨 때 올까?

아이템을 장착했을 때! 겠죠

 

그러면 조건이 들어가네?

if문을 써야겠다.

 

 

이렇게 해주면 된다.

 

음...

근데 이거보다 더 간단한 방법이 있다고 한다.

삼항 연산자 라고 해서

 

한 줄로 표시가 된다.

 

조건? 맞으면 첫 번째 식 수행 : 아니면 두 번째 식 수행

 

식은 간단하게

? 와 : 두 개이다 ㅎㅎㅋ

 

일단 이걸 사용할 수 있는 기준

만약 이거거나 아니면 저거

 

즉 이거와 저거가 조건이 총 2개고

조건 도 막 몇 줄이 아니라 하나씩일 때 사용하면 왕편안하다.

 

이 줄을 그러면 어떻게 줄일까?

 

조건 if문에 적혀있듯

 

extraAd == 0 ? $"공격력 : {ad}" : $"공격력 : {ad} (+{extraAd})"

조건 성립 시

식 1 수행

아닐 시 

식 2 수행

 

요롷게 나온다

 

 

자,

 

그러면 이다음에 상점 아이템 리스트들을 만들어보자

상점 아이템이 있어야 그 물건이 사고 나서

내 가방으로 오기 때문!!

 

ShopUI로 와서

아이템 목록에 하나 틀을 만들어보자

 

보간문자열을 이용해서

Console.WriteLine($"- { itemName }  | 방어력 + { itemValue } | { itemDesc } | { itemPrice } G");

 

요렇게!

 

음 근데 보면 itemType 값을

0이면 무기 1이면 갑옷으로 정해놨는데

앞에 방어력으로 고정되어 있으면 곤란하다!

 

그래서 방어력을 

Type값에 맞게 변경해 줄 수 있도록

삼항연산자를 다시 이용해 보자

 

만약에 Type값이 0 이면 무기 아니면 갑옷

itemType == 0? "공격력" : " 방어력"

 

이 친구를   방어력에 넣어주면 된다.

 

자 우리는 이제 이렇게 출력까지 해줄 수 있는

코드를 짰다.

 

이제 데이터만 가져오면 되는데..

여기서야 데이터 한두 개지

나중에는 으으음청 많아질 것이다.

가독성도 떨어지고..

이렇게 하나하나 타이핑해 주기 어렵다.

 

그래서 그 데이터를 담는

배열!이라는 친구를 통해서

간단하게 구현해 줄 것이다.

 

 

이렇게 배열을 만들어두면 간편하게 인덱스를 불러와서 가능하다.

 

이러면 출력이 왕 쉽겠죠!

 

문제는 물건이 너어어무 많으면

인덱스 1,2,3... 하나하나 출력하기가 어렵다.

 

그래서 이런 반복을 도와주는

for문을 사용할 것이다.

 

for 문으로 초기값 설정

시작은 0이겠죠 처음부터니까

조건은 

이 배열의 길이만큼

그래서 나는 

name의 길이만큼으로 표현했다.

 

길이는 length이라는 친구를 써주면 된다.

. 과 함께!

 

증감은 ++ , 즉 1씩!

 

그래서! 

 

 

아이템의 개수만큼 진행이 된다!

이것이 배열의 장점이 되기도 한다.

얼마만큼 필요한지 한 번에 일괄적으로 처리가 가능하다.

 

자 이제 아이템을 구매할 수 있어야겠죠!

 

1. 화면 만들기

 

만드는 거야 뭐 어렵지 않다

지난 시간에도 잘 만들었듯

함수 하나 만들어서

글자 출력해 주면 된다!

 

그리고 우리는 함수로 이미

동작을 구현해 놔서..

문제없게 만들 수 있다.

 

이 UI 추가적으로 우리가 구현해야 할 건

 

1. 아이템 구매 시 구매하려는 아이템에 번호가 떠야 한다.

2. 구매금액에 맞춰야 한다.

즉 구매금액이 부족하면 구매가 되면 안 되고,

이미 산 아이템을 또 살 순 없다.

 

1은 쉽다

아까 그 for문에 앞에 숫자 +1을 써주면 알아서 출력이 된다.

 

2. 금액을 맞춰야 한다.

일단 버튼이 눌렸을 때, 여야 하니

case 값을 1일 때 2일 때 나와야 하는데

1이나 2나 뭐 구매는 같으니

default로 설정.

 

그리고 조건은 위에 적어놨듯

 

구매금액 부족 = 구매 X

이미 산 아이템 = 구매 X

아이템을 사면

금액차감, 구매완료 글자 생성

 

이다.

하나씩 해보자.

 

먼저,

구매표시가 있다면!

부터 보자

 

구매표시가 있으면 사지면 안된다.

근데 그 구매표시가 있다는 걸 어떻게 알까?

 

바로 우리가 아까 맨 위에 만들어준

inventory리스트가

 

떠올라야 한다

나는 사실 생각 안 났다.

 

그 리스트 안에 상점의 물건이 있다면

더 이상 그 아이템은 사지면 안된다.

 

그렇기 때문에!

  if (inventory.Contains(result-1)) 

 

if 만약에

inventory 리스트

Contains 이 친구는 리스트에서 주는 문법으로

해당요소를 가지고 있냐?

포함이 되어있냐?라는 뜻이 된다.

 

이 친군 true fasle로 반환해 주는 친구다 보니

if문에 써도 추가적으로 참 거짓을 작성할 필요가 없다.

 

무슨 값이?

result-1 이 즉 숫자겠죠?

result는 int형이니깐!

 

여기서. 이 점은 리스트에서 굉장히 중요한 연결고리이다.

리스트에서는 점을 써서 문법을 활용한다는 점!

기억하자!

 

자,

아이템이 있을 때는 했다.

이제 아이템을 안 가지고 있을 때!

상점에 재고가 있을 때를 해보자

else를 써주면 되고

 

또 아이템이 있다고

살 수도 있고 돈이 없어 못 살 수도 있다.

 

또 조건이 생기기 때문에 else문 안에 if문을 써서

조건을 만들어보자.

 

 

이제 우리는 구매를 했으니

상점목록에서

구매완료가 떠야 한다.

 

그렇게 하려면 먼저

어디로 가서 처리해야 할까?

 

상점목록이니 일단 for문으로 가보자.

 

리스트에 값이 있다면,

구매완료를 출력하고

그렇지 않다면 아이템 금액을 출력해 주면 된다.

 

 

줄이 왕 길어지기 때문에

 

 

변수를 하나 선언해 주고

 

삼항연산자를! 사용하여

 

string displayPrice = inventory.Contains(i)? "구매완료" : "{itemPrice [i]}G";

여러 번 했으니.. 이제 알겠죠?

이렇게 생긴

이 변수 displayPrice를 

출력하는 곳에 넣어주면!

 

진짜 끝!

 

실행해 보자!

 

엇, 이상한 점을 발견했나요?!

 

❗❗에러에러 문제발생❗❗

 

 

 

분명 사면 구매완료 떠야 하는데..

안 뜬다.

 

왤까?

 

여기서 클리어가 되기 때문..

 

엄청 어려울 줄 알고 울먹거렸는데

생각보다 예외처리는 간단했다.

 

빈 화면을 띄우게 해서

잠시 그 글이 유지되도록 하는 것이다.

 

나도 사실 아직 머리에 완벽하게 들어온 건 아니지만.

 

간단하게

사용자에게 엔터를 입력받아서

clear를 조금 미룰 수 있게 해 준다.

 

 

이렇게 해주면 

 

구매 완료했고 엔터를 누르면

 

 

돈이 차감되고 구매완료도 가능해졌다.

 

 

자 이제 우리한테 진짜 남은 건

 

인벤토리 장착 UI 만들기

인벤토리에 리스트가 잘 들어갔어야 하며,

장착시스템을 만들어줘야 한다.

 

인벤토리에 넣어주기 위해 우리는 아까

리스트를 하나 만들어줬다.

 

그 인벤토리에 있는 옷을 입고 벗고를 할 테니

우리는 그 옷 정보(inventory리스트) 에다가 [E]만 붙이면 되지 않을까?!

 

우리는 리스트를 하나 더 만들어 주자.

 

equipList

 

즉,

인벤토리에 있는 리스트를

equip리스트에 가져오면 우리는 e가 붙을 거고

안 가져왔다. 즉 빼면

e가 같이 빠지는 그림을 그려보자.

 

먼저 그러면 아이템 목록에 표시해야 하는데

비슷하게 for 문을 굴리면 될 거 같다.

 

 

고쳐야 할 점은

itemNames는 1부터 6까지 있었다.

하지만 우리는 inventory이기 때문에!

리스트 형식으로 바꾸어 주어야 한다.

 

배열은 길이 length인데

리스트는 count를 사용한다.

 

 for (int i = 0; i < inventory.Count; i++)

이렇게!

 

밑의 값도 다 바꿔줘야 한다.

 

 

여기서 중요한 게 뭐냐!

 

 Console.WriteLine($"- {itemNames [ i ]}  | {(itemTypes [ i ] == 0? "공격력" : "방어력")}

+{itemValues [ i ]} | {itemDesc [ i ]}");

 

바로 여기 부분인데.

 

우리는 이제

아이템 배열에서 구매한 친구들을

리스트에 모았기 때문에

우리는 리스트의 1번을 출력해야 한다.

 

근데 여기서 그냥 i를 쓰면

배열의 첫 번째로 가게 된다.

 

그래서 우리는 리스트의 첫 번째를 가야 하기 때문에.

 

i  자리에 리스트의 첫 번째인

inventory [ i ]가 들어가야 한다.

 

 Console.WriteLine($"- {itemNames [ inventory [i ]  ]}  | {(itemTypes [ ] == 0? "공격력" : "방어력")}

+{itemValues [ ]} | {itemDesc [ ]}");

 

이해가 갔다면.. 천재

 

우리는 장착여부를 equip리스트에 들어가 있는 친구들을

[E] 해주어야 하니

 

일단 프린트를 찍을 수 있게

아까 삼항연산자를 다시 쓰면 되지 않을까?!

 

요렇게!

 

장착관리 창을 이제 만들어보자.

 

뭐 UI 만드는 건 이제 쉽지!

 

고대로 복사해도 되니깐

 

여기서 실수하는 부분 하나

 

switch 문에서

번호를 어디까지 받을까?

 

바로 리스트의 개수만큼이겠죠?

 

그래서

 

이렇게 입력해주어야 한다.

 

 

자! 이제 장착구현을 해보자

어디에?

아까랑 똑같이

default값에!

 

조건은 두 개다.

 

 

장착이 안되어있으면 [E] 장착

+

추가 공격력과 추가방어력 더하기

 

 

장착이 되어있으면 [E] 해제

+

추가 공격력과 추가 방어력을 빼줘야 하고

 

 

 

위에부터 해보자

 

먼저

리스트에 있는 친구를 검사해줘야 하니

 

리스트에 있는 몇 번째 친구

result

 

근데 리스트니까  -1

 

int targetItem = result -1

 

다음에

장착하고 안 하고를 간단하게

0과 1도 되지만

bool값으로 참 거짓할 수 있다.

 

bool isEquipped = equipList.contains(targetItem);

리스트에 포함이 되어있는가.

result -1 값이

있다면 true

아니면 false

 

아까 contains가 불값이라고 했던 게 기억나는가?

 

나는 방금 기억났다..

 

그 덕분에 여기에는 불값을 넣어줄 수 있다.

 

그래서 만약에!

참이면!, 즉 E가 장착됐다면

우리는 리스트에서 빼줘야 한다.

equipList.Remove(targetItem);

그리고 추가 공격력 방어력도 빼주어야 한다.

공격력인지 방어력인지 모르니까

if문을 또 써주어야 한다.

 

우리가 아까 무기는 0 갑옷은 1 한 거처럼

공격력이 0 방어력이 1인셈이다.

 

그래서!

 

if ( itemValue [targetItem] == 0 )

extraAd -= itemValue[targetItem]

else

 extraDef -= itemValues [targetItem];

 

반대로 우리는 장착이 안되어있다면 장착을 해주어야 한다.

 

equipList.Add(targetItem);

그리고 밑은 같다.

 

와우!

 

이렇게

 

모든 코드를 다 짜보았다.

 

어땠나요!?

어려웠습니까?!!?

 

저는 너무 힘들었습니다.

 

두 번 해도 어렵네요.

세 번은 쉬울까요?

걱정이 많습니다.

 

여하튼 파이팅 합시다!

 

 

이제는 우리가 더 간단하고 간결하게

작성하는 방법을 적어보려고 한다.

 

내가 잘.. 이해할 수 있을까?!

 

/*
 *   내가 만들 화면
 *   그리고
 *   내가 만들 데이터를 미리 정리해주면 좋다.
 *   
 *   -- 화면 --
 *   1. 메인화면 // 환영합니다! 1,2,3 입력하세요.
 *   2. 상태정보 // 정보 확인할 수 있게 하기
 *   3. 가방 // 열었을때 내 물건이 있는지
 *   4. 가방 // 장착을 했는지 안했는지
 *   5. 상점 // 아이쇼핑, 물건이 있는지 없는지
 *   6. 상점 // 실제 쇼핑, 물건을 구매
 *   
 *   
 *   그리고 내가 쓸 데이터 및 들을 정리
 *   
 *   -- 데이터 및 기능 --
 *   1. 메인 화면으로 이동하기
 *   2. 캐릭터 정보가 표시 ( 레벨 / 이름 / 직업 / 공격력 / 방어력 / 체력 / 골드 )
 *   2-1. 공격력과 방어력 추가구현 ( 장비 착용여부에 따라 변함 )
 *   3. 가방열어서 물건 확인
 *   3-1. 물건을 장착 // [E]구현
 *   4. 상점 리스트
 *   4-1. 구매가 가능한가 안하는가
 *   
 *   
 */

using System.Net.Security;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace ConsoleApp1
{
    internal class Program
    {
        //캐릭터 정보
        //( 레벨 / 이름 / 직업 / 공격력 / 방어력 / 체력 / 골드 )

        private static int level;
        private static string name;
        private static string job;
        private static int ad;
        private static int def;
        private static int hp;
        private static int gold;

        private static int extraAd;
        private static int extraDef;

        //이 정보들을 모아서 상점에 띄워야하니 일단 선언하고 초기화까지 시켜준다.
        // 이런 배열의 장점을 엄청 간단하게 작업이 가능. 출력할때도 막 6줄씩안써도 되고 번호만 바꿔주면 된다.

        private static string[] itemNames = { "수련자의 갑옷", "무쇠갑옷", "스파르타의 갑옷", "낡은 검", "청동 도끼", "스파르타의 창" };
        private static int[] itemTypes = {1,1,1,0,0,0 }; // 0은 무기 1은 방어구
        private static int[] itemValues = { 5,9,15,2,5,7 }; // + 몇인지
        private static string[] itemDesc = { "수련에 도움을 주는 갑옷입니다.", "무쇠로 만들어져 튼튼한 갑옷입니다.", "스파르타의 전사들이 사용했다는 전설의 갑옷입니다.", "쉽게 볼 수 있는 낡은 검 입니다.", "어디선가 사용됐던거 같은 도끼입니다.", "스파르타의 전사들이 사용했다는 전설의 창입니다." };
        private static int[] itemPrice = { 1000,2000,3500,500,1500,2500 };

        private static List<int> inventory = new List<int>();
        private static List<int> equipList = new List<int>();
    
        static void Main(string[] args)
        {
            SetData();
            DisplayMainUI();
        }
        // 내 정보 초기값
        static void SetData()
        {
            level = 1;
            name = "snow";
            job = "전사";
            ad = 10;
            def = 5;
            hp = 100;
            gold = 1500;
        }


        // 초기화면 UI
        static void DisplayMainUI()
        {
            Console.Clear();
            Console.WriteLine("텍리지에 오신것을 환영합니다.");
            Console.WriteLine("이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("1. 상태보기");
            Console.WriteLine("2. 인벤토리");
            Console.WriteLine("3. 상점");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int result = CheckInput(1,3);

            switch (result)
            {
                case 1:
                    DisplayStatUI();
                    break;

                case 2:
                    DisplayInventoryUI();
                    break;

                case 3:
                    DisplayShopUI();
                    break;
            }

        }

        // 상태정보 UI
        static void DisplayStatUI()
        {
            Console.Clear();
            Console.WriteLine("내 상태 보기");
            Console.WriteLine("캐릭터의 정보가 표시됩니다.\n");

            Console.WriteLine($"LV.{level:D2}");
            Console.WriteLine($"{name} {{ {job} }}");

            Console.WriteLine(extraAd == 0 ? $"공격력 : {ad}" : $"공격력 : {ad+extraAd} (+{extraAd})");
            Console.WriteLine(extraDef == 0 ? $"방어력 : {def}" : $"방어력 : {def+extraDef} (+{extraDef})");

            Console.WriteLine($"체력 : {hp}");
            Console.WriteLine($"골드 : {gold}G");
            

            Console.WriteLine();
            Console.WriteLine("0 : 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int result = CheckInput(0, 0);

            switch (result)
            {
                case 0:
                    DisplayMainUI();
                    break;
            }

        }

        // 인벤토리 UI
        static void DisplayInventoryUI()
        {
            Console.Clear();
            Console.WriteLine("인벤토리");
            Console.WriteLine("보유중인 아이템을 관리할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[ 아이템 목록 ]");

            for (int i = 0; i < inventory.Count; i++)
            {
                string displayequip = equipList.Contains(i) ? "[E]" : "";
                Console.WriteLine($"-{displayequip} {itemNames[inventory[i]]}  | {(itemTypes[inventory[i]] == 0 ? "공격력" : "방어력")} +{itemValues[inventory[i]]} | {itemDesc[inventory[i]]}");
            }

            Console.WriteLine();
            Console.WriteLine("1 : 장착 관리");
            Console.WriteLine("0 : 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int result = CheckInput(0, 1);

            switch (result)
            {
                case 0:
                    DisplayMainUI();
                    break;

                case 1:
                    DisplayEquipUI();
                    break;
            }

        }

        // 인벤토리 장착 UI
        static void DisplayEquipUI()
        {
            Console.Clear();
            Console.WriteLine("인벤토리");
            Console.WriteLine("장착 할 아이템을 선택해 주세요.");
            Console.WriteLine();
            Console.WriteLine("[ 아이템 목록 ]");

            for (int i = 0; i < inventory.Count; i++)
            {
                int targetItem = inventory[i];
                string displayequip = equipList.Contains(i) ? "[E]" : "" ; // 
                Console.WriteLine($"- {i+1} {displayequip} {itemNames[targetItem]}  | {(itemTypes[inventory[i]] == 0 ? "공격력" : "방어력")} +{itemValues[targetItem]} | {itemDesc[targetItem]}");
            }

            Console.WriteLine();
            Console.WriteLine("0 : 나가기");
            Console.WriteLine();
            Console.WriteLine("장착할 아이템의 번호를 적어주세요.");

            int result = CheckInput(0, inventory.Count);

            switch (result)
            {
                case 0:
                    DisplayInventoryUI();
                    break;

                default: // 장착로직 구현
                   
                    int targetItem = result - 1;
                    bool isEquipped = equipList.Contains(targetItem);

                    if (isEquipped)
                    {  //장착이 되어있다면 [E] 해제 + 추가 공격력 방어력 extra값 -
                        equipList.Remove(targetItem);
                        int itemIdx = inventory[targetItem];
                        if (itemTypes[itemIdx] == 0)
                        {
                            extraAd -= itemValues[itemIdx];
                        }
                        else
                        {
                            extraDef -= itemValues[itemIdx];
                        }
                    }
                    else 
                    {//장착이 안되어있으면 [E] 장착 + 추가 공격력 방어력 extra값 +
                        equipList.Add(targetItem);
                        int itemIdx = inventory[targetItem];
                        if (itemTypes[itemIdx] == 0)
                        {
                            extraAd += itemValues[itemIdx];
                        }
                        else
                        {
                            extraDef += itemValues[itemIdx];
                        }
                    }
                    break;
                    
            }
            DisplayEquipUI();
        }

        // 상점 UI
        static void DisplayShopUI()
        {
            Console.Clear();
            Console.WriteLine("상점");
            Console.WriteLine("아이템을 구매할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[ 보유골드 ]");
            Console.WriteLine($"{gold}G");// 보간문자열 사용
            Console.WriteLine();
            Console.WriteLine("[ 아이템 목록 ]");
            //아이템을 써주어야한다.

            for (int i = 0;i < itemNames.Length; i++)
            {
                //구매 완료 시 금액이 아니라 구매완료가 떠야한다.
                string displayPrice = inventory.Contains(i) ? "구매완료" : $"{itemPrice[i]}G";
                Console.WriteLine($"- {itemNames[i]}  | {(itemTypes[i] == 0 ? "공격력" : "방어력")} +{itemValues[i]} | {itemDesc[i]} | {displayPrice}");
            }

            Console.WriteLine();
            Console.WriteLine("1 : 아이템 구매");
            Console.WriteLine("0 : 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int result = CheckInput(0, 1);

            switch (result)
            {
                case 0:
                    DisplayMainUI();
                    break;

                case 1:
                    DisplayBuyUI();
                    break;
            }

        }

        // 상점 구매 UI
        static void DisplayBuyUI()
        {
            Console.Clear();
            Console.WriteLine("상점 - 아이템 구매");
            Console.WriteLine("아이템을 구매할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[ 보유골드 ]");
            Console.WriteLine($"{gold}G");// 보간문자열 사용
            Console.WriteLine();
            Console.WriteLine("[ 아이템 목록 ]");
            //아이템을 써주어야한다.
            
            for (int i = 0; i < itemNames.Length; i++)
            {

                //구매 완료 시 금액이 아니라 구매완료가 떠야한다.
                string displayPrice = inventory.Contains(i) ? "구매완료" : $"{itemPrice[i]}G";
                // 앞에 숫자가 나오게 해야하기때문에 { i+1 }
                Console.WriteLine($"- {i+1} {itemNames[i]}  | {(itemTypes[i] == 0 ? "공격력" : "방어력")} +{itemValues[i]} | {itemDesc[i]} | {displayPrice}");
            }
            Console.WriteLine();
            Console.WriteLine("0 : 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int result = CheckInput(0, itemNames.Length); // 아이템 길이만큼..

            switch (result)
            {
                case 0:
                    DisplayShopUI();
                    break;

                default: // 0 이 아닌 다른값이 들어온다면 진입

                    if (inventory.Contains(result - 1)) // 이미 샀다면, 구매완료표시가 이미 있다면
                    {                                   // 이 구매완료표시가 있다는 뜻은 List에 들어가있다면! 으로 해석가능
                        Console.WriteLine(" ===  이미 구매 완료했습니다 === ");
                        Console.WriteLine("enter를 입력해주세요.");
                        Console.ReadLine();
                    }
                    //구매 완료 표시가 떠야함
                    else // 살 수 있다! 구매 표시가 없을때!
                    {
                        if (gold >= itemPrice[result - 1]) // 돈이 많을경우 (구매가능)
                        {
                            Console.WriteLine(" === 구매를 완료했습니다. === ");
                            Console.WriteLine("enter를 입력해주세요.");
                            Console.ReadLine();
                            
                            gold -= itemPrice[result - 1]; // 금액 차감
                            inventory.Add(result - 1); // 인벤토리리스트에 배열 추가
                        }
                        else
                        {
                            Console.WriteLine(" === 골드가 부족합니다. === ");
                            Console.WriteLine("enter를 입력해주세요.");
                            Console.ReadLine();
                            
                        }
                    }

                    DisplayBuyUI();
                    break;              
            }
        }

        // 숫자가 맞는지 확인하는 친구
        static int CheckInput(int min, int max)
        {
            //int result = int.Parse(Console.ReadLine());
            int result; // 값을 담을 변수선언

            while (true)
            {

                bool isNumber = int.TryParse(Console.ReadLine(), out result);
                if (isNumber)
                {
                    if (result >= min && result <= max) { return result; }

                }
                Console.WriteLine("잘못된 입력입니다.");
            }
        }


    }
}