Unity_본캠프

[내일배움캠프 6일차] TextRPG 제작기 1

티백고래 2025. 4. 14. 22:16

1. 오늘의 할 일

04/14 에 날아온 개인과제, TextRPG….

만들어야 한다!

그리고, 솔직히 기대된다. RPG 좋아. TextRPG는 낭만이야. RPG 좋아하는 사람한테 이런 거 시켜주시면

힘내서 합니다.

 

 

(이 TRPG 아님)

그럼, TextRPG 에 무엇이 필요할까?

 

2. 필수 요소 분석

1. 게임 시작 화면 (Main)

  -. 게임 시작 시 간단한 소개말

  -. 이름 등록 (Console.ReadLine)

  -. 마을에서 할 수 있는 행동 알림

  -. 원하는 행동의 숫자를 타이핑하면 실행됨 (Switch문)

 

2. 상태보기(Status)

  -. 캐릭터 정보 표시 (lv,name,job,atk,def,hp,gold)

  -. 이후 장착한 아이템에 따라 수치가 변경되어야 함 (문자열 조합 혹은 Write 사용)

 

3. 인벤토리(Inventory)

  -. 아이템 목록 관리 (Write와 WriteLine을 적절히 사용)

  -. 장착 시 [E] 표시 (bool값 이용)

 

4. 장착관리(Equip-Inventory와 연동)

  -. 장착관리 시작 시 앞에 숫자표시 (Switch문)

  -. 해당되는 번호를 누르면 [E]가 탈부착됨 (bool값  equip != equip)

  -. 일치하지 않을 경우 '잘못된 입력' 출력 (Switch-default)

  -. 중복장착 허용 - 이후 추가 기능에서 제거 (일단 equip 기능만 구현)

  -. 장착 시 상태창에 정보가 반영되어야함 (각 함수 별 연동)

 

5. 상점(Store)

  -. 보유중인 골드, 아이템 정보, 가격 표시 (\t , Write 활용)

  -. 가장 오른쪽에는 가격 표시 (int 값)

  -. 구매 완료 시 구매완료 표시(bool soldOut)

 

6. 아이템 구매(Purchase-Store와 연동)

  -. 구매 시 장착관리와 동일하게 숫자로 체크하기 (Switch문)

  -. soldOut =true 라면 '이미 구매한 아이템'출력 (soldOut 을 불리언으로 지정)

  -. 구매 가능 시 가격과 소지골드 비교 (Price>gold = 구매불가)

  -. 해당 없을 시 '잘못된 입력'출력 (Switch-default)

 

그럼 이걸 기반으로 임시로 구성해보자!

 

더보기

//변수가 없는 ConsoleWrite 생략

 

internal class Program
{
    // 플레이어 스탯 초기화
    private static int lv = 1;
    private static int atk = 10;
    private static int def = 5;
    private static int hp = 100;
    private static int exp = 0;
    private static int gold = 1500;

    // 플레이어 이름 초기화
    private static string name;

 

    //메인-시작장면
    static void Main(string[] args)
    {
        string name = Console.ReadLine();
        Console.WriteLine(name + "님, 게임을 시작합니다.");
        Start();
    }

 

    //게임 시작
    static void Start()
    {
        Console.WriteLine($"스파르타 마을에 어서오세요,{name}님!");
        //입력: 넣을 예정
        string select = Console.ReadLine();
        switch (select)
        {
            case "1":
                Staus();
                break;
            case "2":
                Inventory();
                break;
            case "3":
                Store();
                break;
            case "4":
                Console.WriteLine("게임을 종료합니다.");
                Environment.Exit(0);
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Start();
                break;
        }
    }

 

    //스탯창
    static void Staus()
    {
        Console.WriteLine($"{name}님의 상태창입니다.");

        Console.WriteLine("==Status==");
        Console.WriteLine($"Level: {lv}");
        Console.WriteLine($"Name: {name}");
        Console.WriteLine($"Attack: {atk}");
        Console.WriteLine($"Defense: {def}");
        Console.WriteLine($"HP: {hp}");
        Console.WriteLine($"EXP: {exp}");
        Console.WriteLine($"GOLD: {gold}");

 

        //입력: 만들기
        string Statselect = Console.ReadLine();
        switch (Statselect)
        {
            case "1":
                Inventory();
                break;
            case "0":
                Start();
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Staus();
                break;
        }
    }

 

    //인벤토리
    static void Inventory()
    {
        string Iselect = Console.ReadLine();

        switch (Iselect)
        {
            case "1":
                Equip();
                break;
            case "0":
                Start();
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Inventory();
                break;
        }

    }

 

    //장비창(장착관리)
    static void Equip()
    {

        string Eselect = Console.ReadLine();
        switch (Eselect)
        {
            case "0":
                Inventory();
                break;

            default:
                Console.WriteLine("잘못된 입력입니다.");
                Equip();
                break;
        }
    }

 

    //상점
    static void Store()
    {
        string Sselect = Console.ReadLine();
        switch (Sselect)
        {
            case "1":
                Buy(); //구매창
                break;
            case "2":
                Sell(); //판매창
                break;
            case "0":
                Start();
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Store();
                break;
        }
    }

 

    //구매 탭
    static void Buy()
    {
        Console.WriteLine($"{name}님, 어서오세요.");
        Console.WriteLine($"{name}님의 골드: {gold}G");

        string Bselect = Console.ReadLine();
        switch (Bselect)
        {
            case "0":
                Store();
                break;
            case "1":
                if (gold >= 1000)
                {
                   
                    gold -= 1000;
                    def += 5;
                }
                else
                {
                    Console.WriteLine("골드가 부족합니다.");
                }
                Store();
                break;
            case "2":
                if (gold >= 1800)
                {

                    gold -= 1800;
                    def += 9;
                }
                else
                {

                }
                Store();
                break;
            case "3":
                if (gold >= 3500)
                {
                    gold -= 3500;
                    def += 15;
                }
                else
                {
                }
                Store();
                break;
            case "4":
                if (gold >= 600)
                {
                    gold -= 600;
                    atk += 2;
                }
                else
                {
                }
                Store();
                break;
            case "5":
                if (gold >= 1500)
                {
                    gold -= 1500;
                    atk += 5;
                }
                else
                {
                }
                Store();
                break;
            case "6":
                if (gold >= 2000)
                {
                    gold -= 2000;
                    atk += 7;
                }
                else
                {
                }
                Store();
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Buy();
                break;
        }
    }

 

    //판매창
    static void Sell()
    {
        Console.WriteLine("0. 나가기");
        string Sellselect = Console.ReadLine();
        switch (Sellselect)
        {
            case "0":
                Store();
                break;
            default:
                Console.WriteLine("잘못된 입력입니다.");
                Sell();
                break;
        }
    }
}

일단 가장 큰 분류를 기점으로 적당히 넣어보고 테스트를 돌려봤다.

(string 값으로 그냥 쳐져 있는 것들은, 이후 데이터를 변경할 예정이다. string값뿐이라면 아무것도 만들 수 없다...)

아직 bool값도, 뭣도 없이 단순 선택지 정도만 구현했는데….

 

잠깐. 선택지밖에 안넣었는데 문제가 생겼다.

{name}이 들어가지 않는다.

그러니까, Main에서 입력된 {name}값이 다른 함수의 {name}에 들어가지 않은 것이다!

어라, 이상한데, 그래도 같은 {name}이라는 이름을 공유할 수 있고 들고올 수 있다면 그럴 리 없는데.

구조적으로 뭔가 이상이 생긴 게 틀림없다…

가만히 보니 이미 클래스 단위에서 string으로 선언된 것이, Main에서 string에서 한 번 더 선언 되었다.

이거 때문일까?

 

더보기
//중복 코드 중략
private static string name;


static void Main()
{
    //중략
    name = Console.ReadLine(); //이름 변수 안에 입력값이 들어가도록 함-string 제거
    Console.WriteLine(name + "님, 게임을 시작합니다.");
    Start();
}

static void Start()
{
    Console.WriteLine($"스파르타 마을에 어서오세요,{name}님!");
}

 

무사히 이름이 들어갔다!

처음엔 내가...뭘 잘못했지?

 

이러고 있었는데, 다행히 별 일 아니어서 안심했다.

 

3. 다음에 진행할 것

가장 기본적인 기틀을 잡았으니, 다음에 할 것도 정해야한다.

 

1. 같은 구문 반복은 하나의 함수로 처리하기(ex. 잘못된 입력입니다. 골드가 부족합니다 등)
2. 장비 데이터 넣기

 

우선 이렇게 두 개로 잡아보도록 하자. 내일도 힘내자 ( ' ')9