ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Console.CursorLeft , Console.CursorTop , Console.SetCursorPosition()
    C# Visual Studio/2 2024. 1. 10. 20:00

    게임에서 선택지를 고르는 메서드를 만들어 보았다.

    namespace practice
    {
        internal class Program
        {
            static int ChoiceInput(int fst, int last)
            {
                string input = Console.ReadLine();
                int choice;
                while (!(int.TryParse(input, out choice)) || choice < fst || choice > last)
                {
                    Console.WriteLine("잘못된 입력입니다.");
                    input = Console.ReadLine();
                }
                return choice;
            }
            static void Main(string[] args)
            {
                Console.WriteLine("1.정보 2.전투 3.휴식 4.종료");
                switch(ChoiceInput(1, 4))
                {
                    case 1:
                        Console.WriteLine("캐릭터 정보.");
                        break;
                    case 2:
                        Console.WriteLine("전투 시작.");
                        break;
                    case 3:
                        Console.WriteLine("휴식.");
                        break;
                    case 4:
                        Console.WriteLine("게임을 종료합니다.");
                        break;
                }
            }
        }
    }

     

    두 개의 정수를 매개변수로, 첫 번째 정수보다 작거나,두번째 정수보다 크거나, 정수로 형변환 할 수 없다면, 잘못된 입력을 안내하는 문자열을 출력하고, 반복해서 입력을 받게 하였다.

    기능은 정상적으로 작동하지만, 불편한 점을 발견하였다.

     

    예외의 선택지를 고를 때 마다 나오는 문자열의 출력 때문에, 콘솔창이 계속 더럽혀지는 것이다.

    Console.Clear() 를 사용하면 콘솔창이 깨끗해지겠지만, 이전에 출력한 문자들은 그대로 둔 채로,

    입력한 문자만 지우고 싶었다.

     

    그래서 생각해 낸 방법이, 입력한 문자열을 새로운 문자열,공백으로 덮어서 지우는 것이다.

     

    Console.CursorLeft  = 콘솔 커서의 x좌표 (음수가 아닌 정수 0 <= int Left ), 커서의 x좌표를 바꾸거나, 값을 받아올 수 있다.

    Console.CursorTop = 콘솔 커서의 y 좌표 (음수가 아닌 정수 0 <= int Top ), 커서의 y좌표를 바꾸거나, 값을 받아올 수 있다.

    Console.SetCursorPosition()   = 두 개의 정수를 매개변수로 콘솔커서의 위치를 변경한다 (int Left, int Top)

     

    선택지를 입력한 좌표로, 콘솔커서의 y좌표를 변경후, 문자열 내에 특수한 문자를 포함시키기 위해 사용되는 특별한 문자 조합인, 이스케이프 시퀸스(Escape Sequence) \r  ( 현재 줄 맨 앞으로 이동 ) 을 사용한 뒤, 공백으로 가득 찬 문자열을 출력하여 덮어보았다.

     

    static int ChoiceInput(int fst, int last)
    {
        int cp = Console.CursorTop;                        // int cp 에 콘솔커서 y좌표 저장
        string input = Console.ReadLine();
        int choice;
        while (!(int.TryParse(input, out choice)) || choice < fst || choice > last)
        {
            Console.SetCursorPosition(0, cp);              // 콘솔 커서 이동
            Console.WriteLine("잘못된 입력입니다.");        // 처음 입력한 문자열을 덮는다.
            Console.Write("                    \r");       // 첫 입력 이후 입력 문자열을 덮는 공백.
            input = Console.ReadLine();
        }
        return choice;
    }

     

Designed by Tistory.