13. C# 문법 종합반 2주차(3)

이규성·2023년 11월 9일
0

TIL

목록 보기
17/106

11/09 틱택토 만들기 과제를 수행하였는데 실패했다.. 실패의 과정들을 기록하자

📌틱택토 !


고전적인 게임이다. 근데 이걸 콘솔창에 구현을 할 수 있다고?? 라는 생각이 먼저 들었다..


예시를 우선 살펴보니 ____와 |를 사용하여 보드판을 만들고 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로 바꾸기 위해 정말 다양하게 시도를 해보았지만 모조리 예외처리가 되지 않았다는 오류만 얻어내고 말았다 ㅜ

🤸🏻‍♂️Feedback

계속 시도해보고 싶지만 진도가 멈춰있을 순 없으니 해설집을 훑어보며 실패 원인을 분석하기 시작했다.

  • 첫 번째 간과한 사실은 보드판을 메서드로 저장하여 꺼내 써야 한다는 것
    그렇게 메서드를 반복해서 사용 해놓고 왜 떠올리지 못했을까.. 자책하게 된다
  • 두 번째로는 보드판을 굳이 커서 이동으로 만들 필요가 없다는 것
    뭔가 이상함을 느끼긴 했지만 풀이를 보니 역시나 간단하게 작성되어 있었다. 새로 알려준 기능을 무조건 사용해야 한다는 잘못된 생각이 원인이었다.
  • 세 번째로는 Console.WriteLine("{0}, {1}, {2}", data1, data2, data3) 이 기능을 사용하지 않았다.
    1~9 번호를 바꾸는 방법을 계속해서 고민하고 시도하다가 실패하였는데, 다중 입력을 활용하면 해결할 수 있는 것을 간과했다. 평소에 사용하지 않던 기능이다 보니 떠올리지 못하였다.

내일은 해설집과 내 방식을 섞어도 보고 다양한 시도를 해서 완성을 시킬 예정이다.

0개의 댓글