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

이규성·2023년 11월 10일
0

TIL

목록 보기
18/106

11/10 어제 실패한 틱택토 게임 만들기를 해설을 보며 완성하였다.

📌코드 수정

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("     |     |     ");
        }
    }

우선 기존에 사용한 2차원 배열을 char[]로 수정해 준다.

static char[] arr = { '0', '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("  {0}  |  {1}  |  {2}  ", arr[1], arr[2], arr[3]);
    }
    else if (i == 9)
    {
        Console.SetCursorPosition(1, i);
        Console.Write("  {0}  |  {1}  |  {2}  ", arr[4], arr[5], arr[6]);
    }
    else if (i == 12)
    {
        Console.SetCursorPosition(1, i);
        Console.Write("  {0}  |  {1}  |  {2}  ", arr[7], arr[8], arr[9]);
    }
    else
    {
        Console.SetCursorPosition(1, i);
        Console.Write("     |     |     ");
    }
}

이제 배열에 속한 데이터 값을 수정하기가 용이해졌다.

static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
static void Main(string[] args)
{
    Board();
}

static void Board()
{
    Console.WriteLine("     |     |     ");
    Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[1], arr[2], arr[3]);
    Console.WriteLine("_____|_____|_____");
    Console.WriteLine("     |     |     ");
    Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[4], arr[5], arr[6]);
    Console.WriteLine("_____|_____|_____");
    Console.WriteLine("     |     |     ");
    Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[7], arr[8], arr[9]);
    Console.WriteLine("     |     |     ");
}

지저분했던 보드판 코드를 간단하게 수정해 주고 메서드로 선언한다.
그리고 초기 시작화면의 세팅 !

static int player = 1;

do
{
 	Console.Clear();
 	Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
 	Console.WriteLine("\n");

 	if (player % 2 == 0) // player 값이 짝수이면 플레이어2, 홀수이면 플레이어1
 	{
    	 Console.WriteLine("플레이어 2의 차례");
 	}
 	else
 	{
    	 Console.WriteLine("플레이어 1의 차례");
 	}

 	Console.WriteLine("\n");
 	Board();
}
while(true)

do while문을 이용하여 게임의 승패, 무승부가 될 때까지 반복시킨다.
숫자 입력 시 해당 숫자를 O, X로 바꿔주는 코드를 작성해 준다.

static int choice;

string line = Console.ReadLine();
bool res = int.TryParse(line, out choice);

if (res == true)
{
    if (arr[choice] != 'X' && arr[choice] != 'O') 
    // 이곳에서 arr 배열의 데이터가 바뀌게 된다.
    {
        if (player % 2 == 0)
        {
            arr[choice] = 'O';
        }
        else
        {
            arr[choice] = 'X';
        }

        player++;
    }
    else
    {
        Console.WriteLine("죄송합니다. {0} 행은 이미 {1}로 표시되어 있습니다.", choice, arr[choice]); 
        // 바뀐 arr 배열 데이터가 그대로 적용
        Console.ReadLine();
    }
}
else
{
    Console.WriteLine("숫자를 입력해주세요.");
}

TryParse형변환문은 형변환에 성공했을 때 true, 실패는 false 값을 알려준다. 즉 문자인 line를 콘솔에 입력했을 때 숫자형인 choice로 형변환에 성공하면 bool res = true가 된다 !
그리고 arr의 데이터 값을 O, X로 바꿔준다. 개인적으로 조건부 중단점을 찍어서 디버그를 해보며 확인하며 진행했다.
게임의 승패, 무승부를 판가름하기 위한 코드를 추가해 준다.

static int CheckWin()
{
    // 가로 승리 조건
    if (arr[1] == arr[2] && arr[2] == arr[3])
    {
        return 1;
    }
    else if (arr[4] == arr[5] && arr[5] == arr[6])
    {
        return 1;
    }
    else if (arr[7] == arr[8] && arr[8] == arr[9])
    {
        return 1;
    }

    // 세로 승리 조건
    else if (arr[1] == arr[4] && arr[4] == arr[7])
    {
        return 1;
    }
    else if (arr[2] == arr[5] && arr[5] == arr[8])
    {
        return 1;
    }
    else if (arr[3] == arr[6] && arr[6] == arr[9])
    {
        return 1;
    }

    // 대각선 승리조건
    else if (arr[1] == arr[5] && arr[5] == arr[9])
    {
        return 1;
    }
    else if (arr[3] == arr[5] && arr[5] == arr[7])
    {
        return 1;
    }

    // 무승부
    else if (arr[1] != '1' && arr[2] != '2' && arr[3] != '3' &&
    arr[4] != '4' && arr[5] != '5' && arr[6] != '6' &&
    arr[7] != '7' && arr[8] != '8' && arr[9] != '9')
    {
        return -1;
    }
    else
    {
        return 0;
    }
}

while (CheckWin() != 1 && CheckWin() != -1);
while 조건에 CheckWin()의 리턴값을 받았을 때 반복을 멈추도록 작성해 준다.

while (CheckWin() != 1 && CheckWin() != -1);

if (CheckWin() == 1)
{
    Console.Clear();
    Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
    Console.WriteLine("\n");
    Board();
    Console.WriteLine("플레이어 {0}이(가) 이겼습니다.", (player % 2) + 1);
    
}
else
{
    Console.Clear();
    Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
    Console.WriteLine("\n");
    Board();
    Console.WriteLine("무승부");
}

Console.ReadLine();

게임의 승패와 무승부를 가를 수 있게 되었다 !

전체 코드

    static char[] arr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
    static int player = 1;
    static int choice;
    static void Main(string[] args)
    {
        do
        {
            Console.Clear();
            Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
            Console.WriteLine("\n");

            if (player % 2 == 0)
            {
                Console.WriteLine("플레이어 2의 차례");
            }
            else
            {
                Console.WriteLine("플레이어 1의 차례");
            }

            Console.WriteLine("\n");
            Board();

            string line = Console.ReadLine();
            bool res = int.TryParse(line, out choice);

            if (res == true)
            {
                if (arr[choice] != 'X' && arr[choice] != 'O')
                {
                    if (player % 2 == 0)
                    {
                        arr[choice] = 'O';
                    }
                    else
                    {
                        arr[choice] = 'X';
                    }

                    player++;
                }
                else
                {
                    Console.WriteLine("죄송합니다. {0} 행은 이미 {1}로 표시되어 있습니다.", choice, arr[choice]);
                    Console.ReadLine();
                }
            }
            else
            {
                Console.WriteLine("숫자를 입력해주세요.");
            }
        }
        while (CheckWin() != 1 && CheckWin() != -1);

        if (CheckWin() == 1)
        {
            Console.Clear();
            Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
            Console.WriteLine("\n");
            Board();
            Console.WriteLine("플레이어 {0}이(가) 이겼습니다.", (player % 2) + 1);
            
        }
        else
        {
            Console.Clear();
            Console.WriteLine("플레이어 1: X 와 플레이어 2: O");
            Console.WriteLine("\n");
            Board();
            Console.WriteLine("무승부");
        }

        Console.ReadLine();

    }

    static void Board()
    {
        Console.WriteLine("     |     |     ");
        Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[1], arr[2], arr[3]);
        Console.WriteLine("_____|_____|_____");
        Console.WriteLine("     |     |     ");
        Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[4], arr[5], arr[6]);
        Console.WriteLine("_____|_____|_____");
        Console.WriteLine("     |     |     ");
        Console.WriteLine("  {0}  |  {1}  |  {2}  ", arr[7], arr[8], arr[9]);
        Console.WriteLine("     |     |     ");
    }

    static int CheckWin()
    {
        // 가로 승리 조건
        if (arr[1] == arr[2] && arr[2] == arr[3])
        {
            return 1;
        }
        else if (arr[4] == arr[5] && arr[5] == arr[6])
        {
            return 1;
        }
        else if (arr[7] == arr[8] && arr[8] == arr[9])
        {
            return 1;
        }

        // 세로 승리 조건
        else if (arr[1] == arr[4] && arr[4] == arr[7])
        {
            return 1;
        }
        else if (arr[2] == arr[5] && arr[5] == arr[8])
        {
            return 1;
        }
        else if (arr[3] == arr[6] && arr[6] == arr[9])
        {
            return 1;
        }

        // 대각선 승리조건
        else if (arr[1] == arr[5] && arr[5] == arr[9])
        {
            return 1;
        }
        else if (arr[3] == arr[5] && arr[5] == arr[7])
        {
            return 1;
        }

        // 무승부
        else if (arr[1] != '1' && arr[2] != '2' && arr[3] != '3' &&
        arr[4] != '4' && arr[5] != '5' && arr[6] != '6' &&
        arr[7] != '7' && arr[8] != '8' && arr[9] != '9')
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }
}

실행 화면

🤸🏻‍♀️Feedback

해설된 코드를 조건부 중단점을 찍어가며 작동을 이해하려고 노력하였다. 전체적인 흐름은 알게 되었지만 스스로 코드를 다시 작성해 보면서 습득을 해야할 듯 싶다. 해설집에서 내 입맛대로 변경한 부분들도 조금이지만 있는데 생각한 대로 작동되어서 안도감이 들었다. 코드가 점점 길어지고 메서드가 많아지고 static 접근자로 불러와야하는 것들도 생기고... 난이도가 어려워지면서 약간의 스트레스가 올라왔지만 계속해서 꺾이고 꺾여봐야 성장한다는 것을 알고 있기에 긍정적으로 스트레스를 대하려고 한다.

0개의 댓글