C# Visual Studio/2

[C#] Console.CursorLeft , Console.CursorTop , Console.SetCursorPosition()

조민상 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;
}