Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

1vdlrwnsv1 님의 블로그

C#_TIL_TextRpg_만들기 본문

카테고리 없음

C#_TIL_TextRpg_만들기

1vdlrwnsv1 2025. 2. 3. 16:12

전지적 독자시점 웹소설을 재밌게 봤음 비슷한 느낌의 텍스트게임을 만들어보자

대충 책에 빨려들어가 책 속 세계에서 살아간다는 내용.

책 일러스트를 아스키아트로 변환하자

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::-=+**##+-::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::-=+*##%%%%###%%#+-:::::::::::::::::::::::
::::::::::::::::::::::::::::::::--=+*##%%%%%%#%%%#%#%#%%#*=:::::::::::::::::::::
::::::::::::::::::::::::::--=+*##%%%%%%###%%%%#%%%%%%##%%%%#*-::::::::::::::::::
::::::::::::::::::::-=+**#%%%%%###################%#%#######%%#+-:::::::::::::::
::::::::::::::-=+*###%%%%%############################%#######%%%*=-::::::::::::
::::::::-=+*##%%%%%##############################%%%#%%#%#########%#*=::::::::::
:::::::+=*%%#%##########################%%%%%%#%%%%%%%%##%%%#%########*=::::::::
:::::::*-:=*###%#########%%####%###%%#####%%%%%%%%%%%%%%%%%%%%%%#%%####*+:::::::
:::::::==::-+####%%%##%%#%%%%%%%%#%%%%#%#%#%####%%%%%%%%%%%%%%%%###***+:::::::::
:::::::-+::::=+###%#%%%%##%%%%%##%%%%%%%%%%%%#####%%%%%%%%%%%%#***++++-:::::::::
::::::::*=::::-=*#%%%%%%#%%%%####%#%%%%%%%%%%%%%%%%%%%%%%##**+++++++**=:::::::::
:::::::::++-:-::-=*%%%%%%%%############%%%%%%%%%%%%%###**++++++***+++**=::::::::
::::::::::=*+-:-::-+#%%%%%%%%####%#%##%%%%%%%%####*******+*********####=::::::::
::::::::::::+*=:::::-+#%%%%%%%%%#%%%%%%%%%%###****************#####*=-::::::::::
:::::::::::::-*+-:--::=*#%%%%%%%%%%%%%%###****************#%%##+=--:::::::::::::
:::::::::::::::=*=-:-::-=#%#%%%%%%###***************###%%#*+=--:::::::::::::::::
:::::::::::::::::+*-::-::-+####******##******#####%%%#*=---------:::::::::::::::
::::::::::::::::::-*+-::--+******#######*####%%%%#+=---------:::::::::::::::::::
::::::::::::::::::::+*=:::+*****#########%%%#*+=----------::::::::::::::::::::::
:::::::::::::::::::::-+*-:+#*****###%%%%#*+=-----------:::::::::::::::::::::::::
:::::::::::::::::::::::-*+=*###%%%%#*+=------------:::::::::::::::::::::::::::::
:::::::::::::::::::::::::=+*%%%#*=--::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::-==-:::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::----------::::::::::::----------::::::::::::::::::::::::
::::::::::::::+=---------::::::::--=-::::::-=--:::::::::--------=+::::::::::::::
:::::::::::::=#:::::::::::::::::::::-=-::-=-:::::::::::::::::::::#=:::::::::::::
::::::::::::=*+::::::::::::::::::::::::++::::::::::::::::::::::::+*=::::::::::::
:::::::::=+***+::::::::::::::::::::::::++::::::::::::::::::::::::+***+=:::::::::
:::::::::#%#+*=::::::::::::::::::::::::++::::::::::::::::::::::::=*+#@#:::::::::
::::::::-%%*+*:::::::::::::::::::::::::++:::::::::::::::::::::::::*+*%%-::::::::
::::::::=%%++*:::::::::::::::::::::::::++:::::::::::::::::::::::::*++%%=::::::::
::::::::*%#+++:::::::::::::::::::::::::++:::::::::::::::::::::::::+++#%*::::::::
::::::::#%*+*=:::::::::::::::::::::::::++:::::::::::::::::::::::::=*+*%#::::::::
:::::::-%%*+*-:::::::::::::::::::::::::++:::::::::::::::::::::::::-*++%%-:::::::
:::::::+%%++*::::::::::::::::::::::::::++::::::::::::::::::::::::::*++%%+:::::::
:::::::#%#+++::::::::::::::::::::::::::++::::::::::::::::::::::::::+++#%#:::::::
::::::-%%*+*+::::::::::::::::::::::::::++::::::::::::::::::::::::::+*+*%%-::::::
::::::=%%*+*-::::::::::::::::::::::::::++::::::::::::::::::::::::::-*++%%=::::::
::::::*%#++*::::::::::::::::----:::::::++::::::::----:::::::::::::::*++%%*::::::
::::::##*++*=======+=+++++++++++++=-:::++:::-=+++++++++++++=+=======*++#%#::::::
:::::-%%***+++++++++++++++=======++++=:++:=+++=======++++++++++++++++***%#-:::::
:::::+%%**++++++++++==============+++++**+++++==============+==+++++++**%%+:::::
:::::#%%##############################%%%%##############################%%#:::::
:::::#%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%@@@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#:::::
::::::::::::::::::::::::::::::::::::-==++==-::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

 

오케이 이제 게임 시작화면을 만들어보자

 

방향키를 사용하여 게임시작 종료 토글 기능을 넣고싶다. 시작과 종료 앞에 "▶"로 뭐가 선택됐는지 알려줘야함 

선택 된 문자 앞에 ▶ 넣고 만약 아래 방향키로 다른걸 선택하면 ▶를 삭제해야함

찾아보니 TrimStart라는 메서드가 있다 TrimStart('▶', ' ') 를 사용해 ▶와 공백을 제거하는 기능 

 

class Program
{
    static void Main()
    {
        int selectedOption = 0; // 0: 게임 시작, 1: 종료
        string[] options = { " 게임 시작", "   종료" }; // 선택된 항목 표시

        while (true)
        {
            Console.Clear();
            Console.WriteLine("==== 대충 이세계물 소설 읽다가 책에 그 소설의 주인공이 되는 게임 ====");

            Console.WriteLine("방향키로 선택하세요");

           
            for (int i = 0; i < options.Length; i++)
            {
                Console.WriteLine(i == selectedOption ? $"▶ {options[i].TrimStart('▶', ' ')}" : $"  {options[i]}");
            }

            ConsoleKeyInfo key = Console.ReadKey();

            if (key.Key == ConsoleKey.UpArrow) // 위 방향키
                selectedOption = (selectedOption - 1 + options.Length) % options.Length;
            else if (key.Key == ConsoleKey.DownArrow) // 아래 방향키
                selectedOption = (selectedOption + 1) % options.Length;
            else if (key.Key == ConsoleKey.Enter) // 엔터 키
            {
                if (selectedOption == 0) // 게임 시작 선택
                {
                    //게임 시작 코드
                }
                else // 종료 선택
                {
                    Console.WriteLine("게임을 종료합니다...");
                    break;
                }
            }
        }
    }

결과

종료까지 잘 된다

이제 게임 시작을 하면 주인공의 이름을 정하는 코드를 만들자 약간의 대사와 함께

do while 문을 사용해서 이름 입력할때까지 물어봐야함

static void StartGame()
    {
       
            string playerName;

            do
            {
                Console.Write("당신의 이름은 무엇입니까나리? ");
                playerName = Console.ReadLine();

                if (string.IsNullOrWhiteSpace(playerName))
                {
                    Console.WriteLine("이름이 뭐냐고 .");
                }
            }
            while (string.IsNullOrWhiteSpace(playerName)); 

            Console.Clear();
            Console.WriteLine($"환영합니다, {playerName}님!\n");
        }

 

돌려보니 안돼서 뭔가 했는데 생각해보니까 //게임시작코드 여기에 StartGame()을 입력을 안했다 ㅂㅅ인가보다

 

잘 된다 Console.Clear()로 이름 정하고 넘어갈때 콘솔을 꺠끗하게 지워버리자

이름 설정과 대사 게임시작시 책 아스키 아트 출력

static void StartGame()
    {
        Console.Clear();  // 게임 시작 전 화면 초기화

        string playerName;

        // 이름을 비워두면 다시 묻는 루프
        do
        {
            Console.Write("당신의 이름은 무엇입니까나리? ");
            playerName = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(playerName))
            {
                Console.WriteLine("이름이 뭐냐고 .");
            }
        }
        while (string.IsNullOrWhiteSpace(playerName));
        Console.Clear();
        Console.WriteLine($"환영합니다, {playerName}님!\n");

        Console.WriteLine($"{playerName}: 아 심심한데 책이나 봐야지..");
        Console.WriteLine($"{playerName}: [대충 이세계로 떠나는 책]이거 재밌는데 보는 사람이 없단말이야");

        Console.WriteLine(@"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::-=+**##+-::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::-=+*##%%%%###%%#+-:::::::::::::::::::::::
::::::::::::::::::::::::::::::::--=+*##%%%%%%#%%%#%#%#%%#*=:::::::::::::::::::::
::::::::::::::::::::::::::--=+*##%%%%%%###%%%%#%%%%%%##%%%%#*-::::::::::::::::::
::::::::::::::::::::-=+**#%%%%%###################%#%#######%%#+-:::::::::::::::
::::::::::::::-=+*###%%%%%############################%#######%%%*=-::::::::::::
::::::::-=+*##%%%%%##############################%%%#%%#%#########%#*=::::::::::
:::::::+=*%%#%##########################%%%%%%#%%%%%%%%##%%%#%########*=::::::::
:::::::*-:=*###%#########%%####%###%%#####%%%%%%%%%%%%%%%%%%%%%%#%%####*+:::::::
:::::::==::-+####%%%##%%#%%%%%%%%#%%%%#%#%#%####%%%%%%%%%%%%%%%%###***+:::::::::
:::::::-+::::=+###%#%%%%##%%%%%##%%%%%%%%%%%%#####%%%%%%%%%%%%#***++++-:::::::::
::::::::*=::::-=*#%%%%%%#%%%%####%#%%%%%%%%%%%%%%%%%%%%%%##**+++++++**=:::::::::
:::::::::++-:-::-=*%%%%%%%%############%%%%%%%%%%%%%###**++++++***+++**=::::::::
::::::::::=*+-:-::-+#%%%%%%%%####%#%##%%%%%%%%####*******+*********####=::::::::
::::::::::::+*=:::::-+#%%%%%%%%%#%%%%%%%%%%###****************#####*=-::::::::::
:::::::::::::-*+-:--::=*#%%%%%%%%%%%%%%###****************#%%##+=--:::::::::::::
:::::::::::::::=*=-:-::-=#%#%%%%%%###***************###%%#*+=--:::::::::::::::::
:::::::::::::::::+*-::-::-+####******##******#####%%%#*=---------:::::::::::::::
::::::::::::::::::-*+-::--+******#######*####%%%%#+=---------:::::::::::::::::::
::::::::::::::::::::+*=:::+*****#########%%%#*+=----------::::::::::::::::::::::
:::::::::::::::::::::-+*-:+#*****###%%%%#*+=-----------:::::::::::::::::::::::::
:::::::::::::::::::::::-*+=*###%%%%#*+=------------:::::::::::::::::::::::::::::
:::::::::::::::::::::::::=+*%%%#*=--::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::-==-:::::::::::::::::::::::::::::::::::::::::::::::::
        ");
        Console.WriteLine("\n(아무 키나 눌러 계속하기...)");
        Console.ReadKey();
    }
}

 

주인공 대사가 한글자씩 출력 돼야 대사같은데 메서드를 만들자 이름은 PlayerText()

만능 지피티한테 물어보니 Thread.Sleep라는 메서드가 있대서 사용해보자

 

지피티 왈 : Thread.Sleep 함수는 C#에서 현재 실행 중인 스레드를 지정된 시간만큼 일시 정지(휴식)시킬 때 사용됩니다. 이 함수는 지정된 시간(ms 단위) 동안 현재 스레드를 실행하지 않고 대기 상태로 만들어, 다른 스레드가 실행될 수 있도록 합니다.

string message = "안녕하세요, C#입니다!";

                    foreach (char c in message)
                    {
                        Console.Write(c);      // 글자 출력
                        Thread.Sleep(200);     // 200ms (0.2초) 대기
                    }

                    Console.WriteLine(); // 출력 후 줄바꿈

이런식으로 쓰면 되나보다 게임 종료시에 문자 출력하게 바꿔보자

 

오호

메서드를 만들어 대사에 적용

static void PlayerText(string message)
    {
        foreach (char c in message)
        {
            Console.Write(c); 
            Thread.Sleep(100); 
        }
        Console.WriteLine();
    }

 

Good

 

문제가 생겼다 아무키나 눌러서 다음씬 넘어가야하는데 맨 처음 게임시작화면으로 가진다 Main()메서드에서 while루프가 계속 실행중이기 때문인데 함수 종료 조건이 없어 계속 루프를 돌게됨 Main() 함수 루프 종료를 위해  StartGame()을 호출하면 return으로 Main 종료

 

직업선택 기능 + 선택시 현재 스텟 창 보여줌

오느른 요기까지

 

using System;

static class Game
{
    static string playerName;
    static string npcName = "???";
    static int hp = 100;
    static int power = 1;
    static int aglity = 1;
    static int guard = 1;
    static int gold = 10;
    static string playerClass;

    static void Main()
    {
        int selectedOption = 0; // 0: 게임 시작, 1: 종료
        string[] options = { " 게임 시작", "   종료" }; // 선택된 항목 표시

        while (true)
        {
            Console.Clear();
            Console.WriteLine("==== 대충 이세계물 소설 읽다가 책에 그 소설의 주인공이 되는 게임 ====");

            Console.WriteLine("방향키로 선택하세요");

            for (int i = 0; i < options.Length; i++)
            {
                Console.WriteLine(i == selectedOption ? $"▶ {options[i].TrimStart('▶', ' ')}" : $"  {options[i]}");
            }

            ConsoleKeyInfo key = Console.ReadKey();

            if (key.Key == ConsoleKey.UpArrow) // 위 방향키
                selectedOption = (selectedOption - 1 + options.Length) % options.Length;
            else if (key.Key == ConsoleKey.DownArrow) // 아래 방향키
                selectedOption = (selectedOption + 1) % options.Length;
            else if (key.Key == ConsoleKey.Enter) // 엔터 키
            {
                if (selectedOption == 0) // "게임 시작" 선택
                {
                    
                    StartGame();
                    //InsideBook();
                    return;
                }
                else
                {
                    Console.Clear();
                    string exitMessage = "게임을 종료합니다 ...";

                    foreach (char c in exitMessage)
                    {
                        Console.Write(c);
                        Thread.Sleep(100);
                    }
                    Thread.Sleep(500);
                    break;
                }
            }
        }
    }

    static void StartGame()
    {
        Console.Clear();  // 게임 시작 전 화면 초기화



        // 이름을 비워두면 다시 묻는 루프
        do
        {
            NpcrText("당신의 이름은 무엇입니까나리? ");
            playerName = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(playerName))
            {
                NpcrText("이름이 뭐냐고 .");
            }
        }
        while (string.IsNullOrWhiteSpace(playerName));
        Console.Clear();
        NpcrText($"환영합니다, {playerName}님!\n");

        PlayerText("아 심심한데 책이나 봐야지..");
        PlayerText(" [대충 이세계로 떠나는 책]이거 재밌는데 보는 사람이 없단말이야");
        
        Console.WriteLine(@"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::-=+**##+-::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::-=+*##%%%%###%%#+-:::::::::::::::::::::::
::::::::::::::::::::::::::::::::--=+*##%%%%%%#%%%#%#%#%%#*=:::::::::::::::::::::
::::::::::::::::::::::::::--=+*##%%%%%%###%%%%#%%%%%%##%%%%#*-::::::::::::::::::
::::::::::::::::::::-=+**#%%%%%###################%#%#######%%#+-:::::::::::::::
::::::::::::::-=+*###%%%%%############################%#######%%%*=-::::::::::::
::::::::-=+*##%%%%%##############################%%%#%%#%#########%#*=::::::::::
:::::::+=*%%#%##########################%%%%%%#%%%%%%%%##%%%#%########*=::::::::
:::::::*-:=*###%#########%%####%###%%#####%%%%%%%%%%%%%%%%%%%%%%#%%####*+:::::::
:::::::==::-+####%%%##%%#%%%%%%%%#%%%%#%#%#%####%%%%%%%%%%%%%%%%###***+:::::::::
:::::::-+::::=+###%#%%%%##%%%%%##%%%%%%%%%%%%#####%%%%%%%%%%%%#***++++-:::::::::
::::::::*=::::-=*#%%%%%%#%%%%####%#%%%%%%%%%%%%%%%%%%%%%%##**+++++++**=:::::::::
:::::::::++-:-::-=*%%%%%%%%############%%%%%%%%%%%%%###**++++++***+++**=::::::::
::::::::::=*+-:-::-+#%%%%%%%%####%#%##%%%%%%%%####*******+*********####=::::::::
::::::::::::+*=:::::-+#%%%%%%%%%#%%%%%%%%%%###****************#####*=-::::::::::
:::::::::::::-*+-:--::=*#%%%%%%%%%%%%%%###****************#%%##+=--:::::::::::::
:::::::::::::::=*=-:-::-=#%#%%%%%%###***************###%%#*+=--:::::::::::::::::
:::::::::::::::::+*-::-::-+####******##******#####%%%#*=---------:::::::::::::::
::::::::::::::::::-*+-::--+******#######*####%%%%#+=---------:::::::::::::::::::
::::::::::::::::::::+*=:::+*****#########%%%#*+=----------::::::::::::::::::::::
:::::::::::::::::::::-+*-:+#*****###%%%%#*+=-----------:::::::::::::::::::::::::
:::::::::::::::::::::::-*+=*###%%%%#*+=------------:::::::::::::::::::::::::::::
:::::::::::::::::::::::::=+*%%%#*=--::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::-==-:::::::::::::::::::::::::::::::::::::::::::::::::
        ");

        Console.WriteLine("\n(아무 키나 눌러 책 보기...)");
        Console.ReadKey();
        OpenBook();
    }

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

        Console.WriteLine(@"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::----------::::::::::::----------::::::::::::::::::::::::
::::::::::::::+=---------::::::::--=-::::::-=--:::::::::--------=+::::::::::::::
:::::::::::::=#:::::::::::::::::::::-=-::-=-:::::::::::::::::::::#=:::::::::::::
::::::::::::=*+::::::::::::::::::::::::++::::::::::::::::::::::::+*=::::::::::::
:::::::::=+***+::::::::::::::::::::::::++::::::::::::::::::::::::+***+=:::::::::
:::::::::#%#+*=::::::::::::::::::::::::++::::::::::::::::::::::::=*+#@#:::::::::
::::::::-%%*+*:::::::::::::::::::::::::++:::::::::::::::::::::::::*+*%%-::::::::
::::::::=%%++*:::::::::::::::::::::::::++:::::::::::::::::::::::::*++%%=::::::::
::::::::*%#+++:::::::::::::::::::::::::++:::::::::::::::::::::::::+++#%*::::::::
::::::::#%*+*=:::::::::::::::::::::::::++:::::::::::::::::::::::::=*+*%#::::::::
:::::::-%%*+*-:::::::::::::::::::::::::++:::::::::::::::::::::::::-*++%%-:::::::
:::::::+%%++*::::::::::::::::::::::::::++::::::::::::::::::::::::::*++%%+:::::::
:::::::#%#+++::::::::::::::::::::::::::++::::::::::::::::::::::::::+++#%#:::::::
::::::-%%*+*+::::::::::::::::::::::::::++::::::::::::::::::::::::::+*+*%%-::::::
::::::=%%*+*-::::::::::::::::::::::::::++::::::::::::::::::::::::::-*++%%=::::::
::::::*%#++*::::::::::::::::----:::::::++::::::::----:::::::::::::::*++%%*::::::
::::::##*++*=======+=+++++++++++++=-:::++:::-=+++++++++++++=+=======*++#%#::::::
:::::-%%***+++++++++++++++=======++++=:++:=+++=======++++++++++++++++***%#-:::::
:::::+%%**++++++++++==============+++++**+++++==============+==+++++++**%%+:::::
:::::#%%##############################%%%%##############################%%#:::::
:::::#%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%@@@@@@@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#:::::
::::::::::::::::::::::::::::::::::::-==++==-::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");

        PlayerText(":역시 이책은 재밌어 ");
        PlayerText("근데 뭔가 책이 빛나는거 같은..?....!!");
        Console.WriteLine("\n(아무 키나 눌러 계속 진행...)");
        Console.ReadKey();
        InsideBook();

    }

    static void PlayerText(string message)
    {
        foreach (char c in $"{playerName}: {message}")
        {
            Console.Write(c);
            Thread.Sleep(100);
        }
        Console.WriteLine();
        Thread.Sleep(1000);
    }
    static void NpcrText(string message)
    {
        foreach (char c in $"{npcName}: {message}")
        {
            Console.Write(c);
            Thread.Sleep(100);
        }
        Console.WriteLine();
        Thread.Sleep(1000);
    }
    static void InsideBook()
    {
        string[] options = { "암살자(민첩하고 딜이 강하지만  유리몸)", "기사(딜 준수, 탱 준수, 민첩 준수)", "전사(힘쎄고 강한 아침)!" };
        int selectedOption = 0;

        Console.Clear();
        Console.WriteLine();
        PlayerText("아 잠깐 기절했네 요즘 너무 게임만 했나");
        PlayerText("근데 왜 아무것도 안보이지...");

        NpcrText($"야야...{playerName}");

        PlayerText("....누구세여??");
        NpcrText("알빠노 ");
        NpcrText("이거 책 엔딩 개망해서 너를 내 책 속으로 소환했음 ");
        NpcrText("너가 하는 행동에 따라서 엔딩이 정해질거야 그럼 화이팅 ");
        PlayerText("잠시만요!");
        NpcrText("왜 귀찮게...");
        PlayerText("그럼 주인공이 저인건가요?");
        NpcrText("ㅇㅇ 맞음 대충 직업 정하고 알아서 해");
        NpcrText("너 이책 좋아하잖아 결말이 좀 아쉽지 않냐");
        PlayerText("ㅇㅇ 그렇긴해요 개 쓰레기 엔딩 그러니까 평점이 1점이지");
        NpcrText("ㅅㅂㄹ....");
        PlayerText("님 그럼 이 책 작가세요?");
        NpcrText("ㅇㅇ앞으로 뭐 필요 할 떄 가끔 말 걸어서 도와줄게 잘 해보셈");
        PlayerText("제가 님을 뭐라고 부르면 되나요 ?");
        NpcrText("알아서.");
        Console.WriteLine("작가 이름을 정하세요:");
        npcName = Console.ReadLine();
        PlayerText($"오케이 {npcName}(이)라고 부를게요");
        NpcrText($"{npcName}......그래 뭐 맘대로 해...간다 화이팅해라 결말 잘 써서 재출판 하면 수익 10퍼 줄게.");
        PlayerText("확인");

        Console.Clear();

        Console.Clear();
        Console.WriteLine("==== 직업 선택 ====");
        Console.WriteLine("방향키로 선택하세요");
        

        while (true)
        {
            for (int i = 0; i < options.Length; i++)
            {
                Console.WriteLine(i == selectedOption ? $"▶ {options[i]}" : $"  {options[i]}");
            }

            ConsoleKeyInfo key = Console.ReadKey(intercept: true);

            if (key.Key == ConsoleKey.UpArrow) // 위 방향키
                selectedOption = (selectedOption - 1 + options.Length) % options.Length;
            else if (key.Key == ConsoleKey.DownArrow) // 아래 방향키
                selectedOption = (selectedOption + 1) % options.Length;
            else if (key.Key == ConsoleKey.Enter) // 엔터 키
            {
                if (selectedOption == 0)
                {
                    Console.Clear();
                    Console.WriteLine("암살자를 선택하셨습니다!");
                    aglity += 5;
                    guard -= 1;
                    power += 5;
                    DisplayStats();
                    break;
                }
                else if (selectedOption == 1)
                {
                    Console.Clear();
                    Console.WriteLine("기사를 선택하셨습니다!");
                    aglity += 3;
                    guard += 3;
                    power += 3;
                    DisplayStats();
                    break;
                }
                else if (selectedOption == 2)
                {
                    Console.Clear();
                    Console.WriteLine("전사를 선택하셨습니다!");
                    aglity -= 1;
                    guard += 5;
                    power += 5;
                    DisplayStats();
                    break;
                }
            }
            Console.SetCursorPosition(0, 2);
        }
        Console.ReadKey();
    }
    static void DisplayStats()
{
   
    Console.WriteLine($"이름: {playerName}");
    Console.WriteLine($"HP: {hp}");
    Console.WriteLine($"Power: {power}");
    Console.WriteLine($"Agility: {aglity}");
    Console.WriteLine($"Guard: {guard}");
    Console.WriteLine($"Gold: {gold}");
    
}
}