1. Rookiss 강의 - C# 기초 프로그래밍 입문(5) Text RPG

이규성·2024년 6월 30일
0

TIL

목록 보기
101/106

06/30

좀 가보자고 !!

📌Text RPG 플레이어 생성

구조체를 활용하여 대분류가 같은 데이터들을 모아서 관리한다.

namespace Assignment_01;

class Program
{
    enum ClassType
    {
        None = 0,
        Knight = 1,
        Archer = 2,
        Mage = 3
    }

    struct Player
    {
        public int hp;
        public int atk;
    }

    static ClassType ChooseClass()
    {
        Console.WriteLine("Choice your job");
        Console.WriteLine("[1] Knight");
        Console.WriteLine("[2] Archer");
        Console.WriteLine("[3] Mage");
        a
        string input = Console.ReadLine();

        ClassType choice = ClassType.None;

        switch (input)
        {
            case "1":
                choice = ClassType.Knight;
                break;
            case "2":
                choice = ClassType.Archer;
                break;
            case "3":
                choice = ClassType.Mage;
                break;
        }

        return choice;
    }

    static void CreatePlayer(ClassType choice, out Player player)
    {
        switch (choice)
        {
            case ClassType.Knight:
                player.hp = 100;
                player.atk = 10;
                break;
            case ClassType.Archer:
                player.hp = 75;
                player.atk = 12;
                break;
            case ClassType.Mage:
                player.hp = 50;
                player.atk = 15;
                break;
            default:
                player.hp = 0;
                player.atk = 0;
                break;
        }
    }

    static void Main(string[] args)
    {
        while (true)
        {
            ClassType choice = ChooseClass();

            if (choice != ClassType.None)
            {
                Player player;

                CreatePlayer(choice, out player);

                Console.WriteLine($"hp: {player.hp}, atk: {player.atk} ");
            }
        }
    }
}

hp, atk 변수를 메서드로 활용하기 위해선 각각 out문을 이용하는 방법이 가장 간단하지만 만약 값이 계속 늘어나고 중간에 수정해야 한다면 굉장히 번거롭게 된다. 그러므로 Player의 status 데이터를 모아서 구조체로 만들어서 사용한다.

호출 방법은 우선 사용하고자 하는 위치에서 Player player; 등으로 초기화를 해주고 player.hp, player.atk 이러한 방법으로 호출이 가능하다.

class를 배우기 전에 구조체가 먼저 나와서 조금 당황했다.

📌Text RPG 몬스터 생성과 전투

기본적인 골자는 Player와 크게 다르지 않다. 열거형과 구조체를 사용하였고, 몬스터의 생성과 전투는 메서드를 이용하여 구현하였다.

namespace Assignment_01;

class Program
{
    enum ClassType
    {
        None = 0,
        Knight = 1,
        Archer = 2,
        Mage = 3
    }

    struct Player
    {
        public int hp;
        public int atk;
    }

    enum MonsterType
    {
        None = 0,
        Slime = 1,
        Orc = 2,
        Skeleton = 3
    }

    struct Monster
    {
        public int hp;
        public int atk;
    }

    static ClassType ChooseClass()
    {
        Console.WriteLine("Choice your job");
        Console.WriteLine("[1] Knight");
        Console.WriteLine("[2] Archer");
        Console.WriteLine("[3] Mage");
        
        string input = Console.ReadLine();

        ClassType choice = ClassType.None;

        switch (input)
        {
            case "1":
                choice = ClassType.Knight;
                break;
            case "2":
                choice = ClassType.Archer;
                break;
            case "3":
                choice = ClassType.Mage;
                break;
        }

        return choice;
    }

    static void CreatePlayer(ClassType choice, out Player player)
    {
        switch (choice)
        {
            case ClassType.Knight:
                player.hp = 100;
                player.atk = 10;
                break;
            case ClassType.Archer:
                player.hp = 75;
                player.atk = 12;
                break;
            case ClassType.Mage:
                player.hp = 50;
                player.atk = 15;
                break;
            default:
                player.hp = 0;
                player.atk = 0;
                break;
        }
    }

    private static void CreateMonster(out Monster monster)
    {
        Random rand = new Random();
        int randMonster = rand.Next(1, 4);

        switch (randMonster)
        {
            case (int)MonsterType.Slime:
                Console.WriteLine("Slime has spawned ");
                monster.hp = 20;
                monster.atk = 2;
                break;
            case (int)MonsterType.Orc:
                Console.WriteLine("Orc has spawned ");
                monster.hp = 40;
                monster.atk = 4;
                break;
            case (int)MonsterType.Skeleton:
                Console.WriteLine("Skeleton has spawned ");
                monster.hp = 30;
                monster.atk = 3;
                break;
            default:
                monster.hp = 0;
                monster.atk = 0;
                break;
        }
    }

    static void Battle(ref Player player, ref Monster monster)
    {
        while (true)
        {
            monster.hp -= player.atk;

            if (monster.hp <= 0)
            {
                Console.WriteLine("Win! ");
                Console.WriteLine($"Player hp: {player.hp} ");
                break;
            }

            player.hp -= monster.atk;

            if (player.hp <= 0)
            {
                Console.WriteLine("Lose... ");
                break;
            }
        }
    }

    static void EnterField(ref Player player)
    {
        while (true)
        {
            Console.WriteLine("Entered the field ");

            Monster monster;

            CreateMonster(out monster);

            Console.WriteLine("");
            Console.WriteLine("[1] Battle with monsters ");
            Console.WriteLine("[2] Escape the village ");

            string input = Console.ReadLine();

            if (input == "1")
            {
                Battle(ref player, ref monster);
            }
            else if (input == "2")
            {
                Random rand = new Random();
                int randValue = rand.Next(0, 101);

                if (randValue <= 33)
                {
                    Console.WriteLine("Succeeded in escapeing to the village! ");
                    break;
                }
                else
                {
                    Battle(ref player, ref monster);
                }
            }
        }
    }

    static void EnterGame(ref Player player)
    {
        while (true)
        {
            Console.WriteLine("Connected to the village! ");
            Console.WriteLine("");
            Console.WriteLine("[1] Enter the field ");
            Console.WriteLine("[2] return to lobby ");

            string input = Console.ReadLine();

            if (input == "1")
            {
                EnterField(ref player);
            }
            else if (input == "2")
            {
                break;
            }
        }
    }

    static void Main(string[] args)
    {
        while (true)
        {
            ClassType choice = ChooseClass();

            if (choice == ClassType.None)
            {
                continue;
            }

            Player player;

            CreatePlayer(choice, out player);

            EnterGame(ref player);
        }
    }
}

while문을 사용하여 몬스터와 무한히 전투를 하는 시스템이며 마을로 도망치기 위해선 33%의 확률로 성공해야 한다.
ref문을 사용하여서 처음에 선택한 직업의 status 원본 데이터를 통해 연산이 이루어진다.

🤸🏻‍♀️Feedback

스파르타 내배캠에서 C# 프로그래밍을 처음 배울 때가 생각이 난다. 그땐 메서드, 멤버 변수, 변수 데이터를 전달하는 법 등에 대한 이해가 아주 부족한 상태여서 정말 힘들었는데 이젠 익숙해져서 바로바로 이해가 된다. 사실 이걸 이해 못하면 안 되긴 하지만,,,

0개의 댓글