14. C# 문법 종합반 3주차

이규성·2023년 11월 13일
0

TIL

목록 보기
19/106

11/13 3주차 과제인 텍스트 RPG 게임을 만들어 보자

📌목표 예시

  1. 게임 시작 화면
    게임 시작시 간단한 소개 말과 마을에서 할 수 있는 행동을 알려줍니다.
    원하는 행동의 숫자를 타이핑하면 실행합니다.
    1 ~ 2 이외 입력시 - 잘못된 입력입니다 출력
스파르타 마을에 오신 여러분 환영합니다.
이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.

1. 상태 보기
2. 인벤토리

원하시는 행동을 입력해주세요.
>>
  1. 상태보기
    캐릭터의 정보를 표시합니다.
    7개의 속성을 가지고 있습니다.
    레벨 / 이름 / 직업 / 공격력 / 방어력 / 체력 / Gold
    처음 기본값은 이름을 제외하고는 아래와 동일하게 만들어주세요
    이후 장착한 아이템에 따라 수치가 변경 될 수 있습니다.
상태 보기
캐릭터의 정보가 표시됩니다.

Lv. 01      
Chad ( 전사 )
공격력 : 10
방어력 : 5
체 력 : 100
Gold : 1500 G

0. 나가기

원하시는 행동을 입력해주세요.
>>
  1. 인벤토리
    보유 중인 아이템을 전부 보여줍니다.
    이때 장착중인 아이템 앞에는 [E] 표시를 붙여 줍니다.
    처음 시작시에는 2가지 아이템이 있습니다.
인벤토리
보유 중인 아이템을 관리할 수 있습니다.

[아이템 목록]
- [E]무쇠갑옷      | 방어력 +5 | 무쇠로 만들어져 튼튼한 갑옷입니다.
- 낡은 검         | 공격력 +2 | 쉽게 볼 수 있는 낡은 검 입니다.

1. 장착 관리
0. 나가기

원하시는 행동을 입력해주세요.
>>

3 - 1. 장착 관리
장착관리가 시작되면 아이템 목록 앞에 숫자가 표시됩니다.
일치하는 아이템을 선택했다면 (예제에서 1~2선택시)

  • 장착중이지 않다면 → 장착
    [E] 표시 추가
  • 이미 장착중이라면 → 장착 해제
    [E] 표시 없애기

일치하는 아이템을 선택했지 않았다면 (예제에서 1~3이외 선택시)
잘못된 입력입니다 출력

아이템의 중복 장착을 허용합니다.
창과 검을 동시에 장착가능
갑옷도 동시에 착용가능
장착 갯수 제한 X

인벤토리 - 장착 관리
보유 중인 아이템을 관리할 수 있습니다.

[아이템 목록]
- 1 [E]무쇠갑옷      | 방어력 +5 | 무쇠로 만들어져 튼튼한 갑옷입니다.
- 2 낡은 검         | 공격력 +2 | 쉽게 볼 수 있는 낡은 검입니다.

0. 나가기

원하시는 행동을 입력해주세요.
>>

아이템이 장착되었다면 1. 상태보기 에 정보가 반영되어야 합니다.
정보 반영 예제

상태 보기
캐릭터의 정보가 표시됩니다.

Lv. 01      
Chad ( 전사 )
공격력 : 12 (+2)
방어력 : 10 (+5)
체 력 : 100
Gold : 1500 G

0. 나가기

원하시는 행동을 입력해주세요.
>>

샘플 코드

internal class Program
{
    private static Character player;
    
    static void Main(string[] args)
    {
        GameDataSetting();
        DisplayGameIntro();
    }

    static void GameDataSetting()
    {
        // 캐릭터 정보 세팅
        player = new Character("Chad", "전사",1, 10, 5, 100, 1500);
        
				// 아이템 정보 세팅
    }

    static void DisplayGameIntro()
    {
        Console.Clear();
    
        Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.");
        Console.WriteLine("이곳에서 전전으로 들어가기 전 활동을 할 수 있습니다.");
        Console.WriteLine();
        Console.WriteLine("1. 상태보기");
        Console.WriteLine("2. 인벤토리");
        Console.WriteLine();
        Console.WriteLine("원하시는 행동을 입력해주세요.");
        
        int input = CheckValidInput(1, 2);
        switch (input)
        {
            case 1:
                DisplayMyInfo();
                break;
            
            case 2:
								// 작업해보기
                break;
        }
    }
    
    static void DisplayMyInfo()
    {
        Console.Clear();
    
        Console.WriteLine("상태보기");
        Console.WriteLine("캐릭터의 정보르 표시합니다.");
        Console.WriteLine();
        Console.WriteLine($"Lv.{player.Level}");
        Console.WriteLine($"{player.Name}({player.Job})");
        Console.WriteLine($"공격력 :{player.Atk}");        
        Console.WriteLine($"방어력 : {player.Def}");
        Console.WriteLine($"체력 : {player.Hp}");
        Console.WriteLine($"Gold : {player.Gold} G");
        Console.WriteLine();
        Console.WriteLine("0. 나가기");
            
        int input = CheckValidInput(0, 0);
        switch (input)
        {
            case 0:
                DisplayGameIntro();
                break;
        }
    }

    static void DisplayInventory()
    {

    }
    
    static int CheckValidInput(int min, int max)
    {
        while (true)
        {
            string input = Console.ReadLine();

            bool parseSuccess = int.TryParse(input, out var ret);
            if (parseSuccess)
            {
                if(ret >= min && ret <= max)
                    return ret;        
            }
            
            Console.WriteLine("잘못된 입력입니다.");
        }
    }
}


public class Character
{
    public string Name { get; }
    public string Job { get; }
    public int Level { get; }
    public int Atk { get; }
    public int Def { get; }
    public int Hp { get; }
    public int Gold { get; }

    public Character(string name, string job, int level, int atk, int def, int hp, int gold)
    {
        Name = name;
        Job = job;
        Level = level;
        Atk = atk;
        Def = def;
        Hp = hp;
        Gold = gold;
    }
}

직접 작성한 코드

using System.Numerics;
using System.Runtime.InteropServices;

namespace Programming_Basics_Personal_Assignment
{
    internal class Program
    {
        private static Character player;
        private static ItemInfo item1;
        private static ItemInfo item2;


        static void Main(string[] args)
        {
            GameDataSetting();
            DisplayGameIntro();            
        }

        static void GameDataSetting()
        {
            // 캐릭터 정보 세팅
            player = new Character("Chad", "전사", 1, 10, 5, 100, 1500);

            // 아이템 정보 세팅
            item1 = new ItemInfo("무쇠 갑옷", "무쇠로 만들어진 튼튼한 갑옷입니다.", 0, 10, 0);
            item2 = new ItemInfo("낡은 검", "쉽게 볼 수 있는 낡은 검입니다.", 2, 0, 0);
        }        
        static void DisplayGameIntro()
        {
            Console.Clear();

            Console.WriteLine("스파르타 마을에 오신 여러분 환영합니다.");
            Console.WriteLine("이곳에서 던전으로 들어가기 전 활동을 할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("1. 상태보기");
            Console.WriteLine("2. 인벤토리");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요.");

            int input = CheckValidInput(1, 2);
            switch (input)
            {
                case 1:
                    DisplayMyInfo();
                    break;

                case 2:
                    DisplayInventory();
                    break;
            }
        }
        static void DisplayMyInfo()
        {
            Console.Clear();

            Console.WriteLine("상태보기");
            Console.WriteLine("캐릭터의 정보를 표시합니다.");
            Console.WriteLine();
            Console.WriteLine($"Lv.{player.Level}");
            Console.WriteLine($"{player.Name}({player.Job})");
            Console.WriteLine($"공격력 : {player.Atk}");
            Console.WriteLine($"방어력 : {player.Def}");
            Console.WriteLine($"체력 : {player.Hp}");
            Console.WriteLine($"Gold : {player.Gold} G");
            Console.WriteLine();
            Console.WriteLine("0. 나가기");

            if (item1.ItemName == "[E] 무쇠 갑옷" && item2.ItemName != "[E] 낡은 검")
            {
                Console.Clear();

                Console.WriteLine("상태보기");
                Console.WriteLine("캐릭터의 정보를 표시합니다.");
                Console.WriteLine();
                Console.WriteLine($"Lv.{player.Level}");
                Console.WriteLine($"{player.Name}({player.Job})");
                Console.WriteLine($"공격력 : {player.Atk}");
                Console.WriteLine($"방어력 : {player.Def} +({item1.ItemDef + item2.ItemDef})");
                Console.WriteLine($"체력 : {player.Hp}");
                Console.WriteLine($"Gold : {player.Gold} G");
                Console.WriteLine();
                Console.WriteLine("0. 나가기");
            }
            else if (item2.ItemName == "[E] 낡은 검" && item1.ItemName != "[E] 무쇠 갑옷")
            {
                Console.Clear();

                Console.WriteLine("상태보기");
                Console.WriteLine("캐릭터의 정보를 표시합니다.");
                Console.WriteLine();
                Console.WriteLine($"Lv.{player.Level}");
                Console.WriteLine($"{player.Name}({player.Job})");
                Console.WriteLine($"공격력 : {player.Atk} +({item1.ItemAtk + item2.ItemAtk})");
                Console.WriteLine($"방어력 : {player.Def}");
                Console.WriteLine($"체력 : {player.Hp}");
                Console.WriteLine($"Gold : {player.Gold} G");
                Console.WriteLine();
                Console.WriteLine("0. 나가기");
            }
            else if (item1.ItemName == "[E] 무쇠 갑옷" && item2.ItemName == "[E] 낡은 검")
            {
                Console.Clear();

                Console.WriteLine("상태보기");
                Console.WriteLine("캐릭터의 정보를 표시합니다.");
                Console.WriteLine();
                Console.WriteLine($"Lv.{player.Level}");
                Console.WriteLine($"{player.Name}({player.Job})");
                Console.WriteLine($"공격력 : {player.Atk} +({item1.ItemAtk + item2.ItemAtk})");
                Console.WriteLine($"방어력 : {player.Def} +({item1.ItemDef + item2.ItemDef})");
                Console.WriteLine($"체력 : {player.Hp}");
                Console.WriteLine($"Gold : {player.Gold} G");
                Console.WriteLine();
                Console.WriteLine("0. 나가기");
            }
            int input = CheckValidInput(0, 0);

            switch (input)
            {
                case 0:
                    DisplayGameIntro();
                    break;
            }
        }

        
        static void DisplayInventory()
        {
            Console.Clear();

            Console.WriteLine("인벤토리");
            Console.WriteLine("보유 중인 아이템을 관리할 수 있습니다.");
            Console.WriteLine();
            Console.WriteLine("[아이템 목록]");
            Console.WriteLine($"- {item1.ItemName}    " + $" | 방어력 +{item1.ItemDef} | {item1.ItemDescription}");
            Console.WriteLine($"- {item2.ItemName}    " + $" | 공격력 +{item2.ItemAtk} | {item2.ItemDescription}");
            Console.WriteLine();
            Console.WriteLine("1. 장착 관리");
            Console.WriteLine("0. 나가기");
            Console.WriteLine();
            Console.WriteLine("원하시는 행동을 입력해주세요");

            int input = CheckValidInput(0, 1);
            switch (input)
            {
                case 0:                    
                    DisplayGameIntro();
                    break;
                case 1:
                    EquipItemManagement();
                    break;
            }
        }
        static void EquipItemManagement()
        {            
            Console.Clear();

            Console.WriteLine("인벤토리 - 장착 관리");
            Console.WriteLine("아이템을 장착하거나 해제합니다");
            Console.WriteLine();
            Console.WriteLine("[아이템 목록]");
            Console.WriteLine($"- 1 {item1.ItemName}    " + $" | 방어력 +{item1.ItemDef} | {item1.ItemDescription}");
            Console.WriteLine($"- 2 {item2.ItemName}    " + $" | 공격력 +{item2.ItemAtk} | {item2.ItemDescription}");
            Console.WriteLine();
            Console.WriteLine("0. 나가기");
            Console.WriteLine();
            Console.WriteLine("장착할 아이템 번호를 입력해주세요.");
            Console.WriteLine("이미 장착하고 있을 경우 해제합니다.");

            int input = CheckValidInput(0, 2);
            switch (input)
            {                
                case 0:
                    DisplayInventory();
                    break;
                case 1:
                    // 1번 아이템 선택하면 캐릭터 인포에 능력치를 플러스해주고 아이템 이름 앞에 [E]를 붙였다가 떼기                   
                    if (item1.ItemName == "무쇠 갑옷")
                    {
                        item1.ItemName = "[E] 무쇠 갑옷";
                        
                        player.Atk += item1.ItemAtk;
                        player.Def += item1.ItemDef;
                        player.Hp += item1.ItemHp;                       
                    }
                    else
                    {
                        item1.ItemName = "무쇠 갑옷";

                        player.Atk -= item1.ItemAtk;
                        player.Def -= item1.ItemDef;
                        player.Hp -= item1.ItemHp;
                    }                    
                    EquipItemManagement();
                    break;
                case 2:
                    if (item2.ItemName == "낡은 검")
                    {
                        item2.ItemName = "[E] 낡은 검";

                        player.Atk += item2.ItemAtk;
                        player.Def += item2.ItemDef;
                        player.Hp += item2.ItemHp;
                    }
                    else
                    {
                        item2.ItemName = "낡은 검";

                        player.Atk -= item2.ItemAtk;
                        player.Def -= item2.ItemDef;
                        player.Hp -= item2.ItemHp;
                    }
                    EquipItemManagement();
                    break;
            }
        }
        

        static int CheckValidInput(int min, int max)
        {
            while (true)
            {
                string input = Console.ReadLine();

                bool parseSuccess = int.TryParse(input, out var ret);
                if (parseSuccess)
                {
                    if (ret >= min && ret <= max)
                        return ret;
                }

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

    public class ItemInfo
    {
        public string ItemName { get; set; }
        public string ItemDescription { get; }
        public int ItemAtk { get; set; }
        public int ItemDef { get; set; }
        public int ItemHp { get; set; }        

        public ItemInfo(string itemname, string itemdes, int itematk, int itemdef, int itemhp)
        {
            ItemName = itemname;
            ItemDescription = itemdes;
            ItemAtk = itematk;
            ItemDef = itemdef;
            ItemHp = itemhp;            
        }
    }

    

    public class Character
    {
        public string Name { get; }
        public string Job { get; }
        public int Level { get; }
        public int Atk { get; set; }
        public int Def { get; set; }
        public int Hp { get; set; }
        public int Gold { get; }

        public Character(string name, string job, int level, int atk, int def, int hp, int gold)
        {
            Name = name;
            Job = job;
            Level = level;
            Atk = atk;
            Def = def;
            Hp = hp;
            Gold = gold;
        }
    }
}

작동 테스트




🤸🏻‍♀️Feedback

작동은 정확하게 하고 있지만... 배열과 클래스 사용이 미숙하여 조건문을 억지로 욱여넣어서 완성시켰다. 학생의 입장에서 보아도 개발자가 아닌 소위 말하는 노가다코딩을 한 기분이다. 튜터분의 해설 강의와 스크립트를 보니 놓친 기능들이 많았다.

  • 클래스와 배열의 조합
  • 3항연산자
  • Console.Write();로 줄바꿈 없이 내용 출력
  • 반복문과 메서드의 적절한 사용

내일은 해설 스크립트를 참고하여 하나하나 수정을 해 볼 예정이다.

0개의 댓글