[C#] Console.CursorLeft , Console.CursorTop , Console.SetCursorPosition()
게임에서 선택지를 고르는 메서드를 만들어 보았다.
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;
}