고전적인 게임이다. 근데 이걸 콘솔창에 구현을 할 수 있다고?? 라는 생각이 먼저 들었다..
예시를 우선 살펴보니 ____와 |를 사용하여 보드판을 만들고 1~9를 각 위치에 배열시킨다. 그리고 각 플레이어가 숫자를 입력하면 해당 숫자가 O, X로 바뀌고 빙고 한 줄이 완성되면 승리 !
// 콘솔 화면을 초기화 !
Console.Clear();
// 콘솔창에서 커서의 위치를 설정한다 ! (x, y)좌표
Console.SetCursorPosition(10, 5);
Console.Write("Hello, world!");
우선 수동으로 보드판을 만들어 보았다.
Console.WriteLine(" | | ");
Console.WriteLine(" 1 | 2 | 3 ");
Console.WriteLine("_____|_____|_____");
Console.WriteLine(" | | ");
Console.WriteLine(" 4 | 5 | 6 ");
Console.WriteLine("_____|_____|_____");
Console.WriteLine(" | | ");
Console.WriteLine(" 7 | 8 | 9 ");
Console.WriteLine(" | | " + "\n");
이제 여기서 1~9 숫자들을 입력받으면 보드판에서 O, X로 바뀌게 만들어야 한다. 여러가지 방법들이 떠올랐지만 배열에 1~9를 저장해놓고 그 값을 가지고 수정할 수 있지 않을까하는 생각까지 도달했다. 그리고 Console.SetCursorPosition(X, Y);
의 기능을 구글링해보니 맵 만들기가 정보로 나오길래 보드판을 커서 이동으로 만들어보자는 결론이 나왔다.
Console.WriteLine("플레이어 1: X 와 플레이어 2: O\n");
Console.WriteLine("플레이어 1의 차례\n");
// 1~9 데이터를 꺼내서 사용하기 위해 배열
int[,] num = new int[3, 3] { { 1, 2, 3, }, { 4, 5, 6 }, { 7, 8, 9 } };
for (int i = 5; i < 14; i++)
{
if (i == 7 || i == 10)
{
Console.SetCursorPosition(1, i);
Console.Write("_____|_____|_____");
}
else if (i == 6)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[0, 0] + " | " + num[0, 1] + " | " + num[0, 2] + " ");
}
else if (i == 9)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[1, 0] + " | " + num[1, 1] + " | " + num[1, 2] + " ");
}
else if (i == 12)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[2, 0] + " | " + num[2, 1] + " | " + num[2, 2] + " ");
}
else
{
Console.SetCursorPosition(1, i);
Console.Write(" | | ");
}
// 출력값
플레이어 1: X 와 플레이어 2: O
플레이어 1의 차례
| |
1 | 2 | 3
_____|_____|_____
| |
4 | 5 | 6
_____|_____|_____
| |
7 | 8 | 9
| |
많은 시행착오 끝에 여기까지 도달했지만 수동으로 작성했던 보드판 보다 쓸데없이 코드가 복잡해지고 지저분해짐을 알아차리곤 뭔가 잘못되었다고 생각했다..
while (true)
{
Console.WriteLine("플레이어 1: X 와 플레이어 2: O\n");
Console.WriteLine("플레이어 1의 차례\n");
int[,] num = new int[3, 3] { { 1, 2, 3, }, { 4, 5, 6 }, { 7, 8, 9 } };
for (int i = 5; i < 14; i++)
{
if (i == 7 || i == 10)
{
Console.SetCursorPosition(1, i);
Console.Write("_____|_____|_____");
}
else if (i == 6)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[0, 0] + " | " + num[0, 1] + " | " + num[0, 2] + " ");
}
else if (i == 9)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[1, 0] + " | " + num[1, 1] + " | " + num[1, 2] + " ");
}
else if (i == 12)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[2, 0] + " | " + num[2, 1] + " | " + num[2, 2] + " ");
}
else
{
Console.SetCursorPosition(1, i);
Console.Write(" | | ");
}
}
Console.WriteLine();
int input1 = int.Parse(Console.ReadLine());
Console.Clear();
Console.WriteLine("플레이어 1: X 와 플레이어 2: O\n");
Console.WriteLine("플레이어 2의 차례\n");
for (int i = 5; i < 14; i++)
{
if (i == 7 || i == 10)
{
Console.SetCursorPosition(1, i);
Console.Write("_____|_____|_____");
}
else if (i == 6)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[0, 0] + " | " + num[0, 1] + " | " + num[0, 2] + " ");
}
else if (i == 9)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[1, 0] + " | " + num[1, 1] + " | " + num[1, 2] + " ");
}
else if (i == 12)
{
Console.SetCursorPosition(1, i);
Console.Write(" " + num[2, 0] + " | " + num[2, 1] + " | " + num[2, 2] + " ");
}
else
{
Console.SetCursorPosition(1, i);
Console.Write(" | | ");
}
}
Console.WriteLine();
int input2 = int.Parse(Console.ReadLine());
Console.Clear();
심지어는 플레이어1과 2가 번갈아가며 값을 입력하기 위해선 이렇게나 길어지게 된다. 그리고 1~9의 숫자를 입력했을 때 O, X로 바꾸기 위해 정말 다양하게 시도를 해보았지만 모조리 예외처리가 되지 않았다는 오류만 얻어내고 말았다 ㅜ
계속 시도해보고 싶지만 진도가 멈춰있을 순 없으니 해설집을 훑어보며 실패 원인을 분석하기 시작했다.
Console.WriteLine("{0}, {1}, {2}", data1, data2, data3)
이 기능을 사용하지 않았다.내일은 해설집과 내 방식을 섞어도 보고 다양한 시도를 해서 완성을 시킬 예정이다.