[공부]261011~12 틱택토 1차

강현구
∙∙조회 4
  • 3×3 보드에 X와 O를 번갈아 놓는 콘솔 틱택토 게임을 구현함.
  • 개인 과제이며, 본인이 작성한 코드의 주요 흐름과 승부 판정 방법을 설명할 수 있어야 함.

공통 게임 규칙

  • 보드는 3×3이며, 빈칸은 .으로 표시함.
  • X가 먼저 시작하고, X와 O가 한 번씩 번갈아 둠.
  • 빈칸에만 표시할 수 있으며, 이미 놓인 X나 O는 바뀌지 않음.
  • 같은 표시 3개가 가로·세로·대각선 중 한 줄을 이루면 해당 플레이어가 승리함.
  • 승자가 없는 상태에서 9칸이 모두 차면 무승부임. 마지막 빈칸에 놓아 승리한 경우에는 무승부가 아님.
  • 승리 또는 무승부가 결정되면 최종 보드와 결과를 보여 주고, 그 판의 추가 입력과 컴퓨터 행동을 멈춤.


ini
using System;
Console.WriteLine("=== 틱택토 게임 · 1단계 ===");
Console.WriteLine("두 사람이 X와 O를 번갈아 놓습니다. X가 먼저 시작합니다.");
Console.WriteLine();

Console.WriteLine("위치 번호:");
int show=0;

int round = 1;

bool isFull = true;

string[] position = { ".", ".", ".", ".", ".", ".", ".", ".", ".", };
  • 시작 부분 기본적인 텍스트를 입력합니다
  • for문에 사용할 show
  • 라운드 수를 표시할 round
  • 공간 전부 찼는지를 표시하는 isFull
  • 틱택토 공간을 만드는 postion 선언하고 . 으로 초기화

ini
for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 3; col++)
    {
        Console.Write($"{show+1}");
        show++;
        if (col >= 2)
        {
            break;
        }
        Console.Write(" | ");
        //position[show] += ".";
        
        
    }
    Console.WriteLine();

    if (row >= 2)
    {
        break;
    }
    Console.WriteLine("---------");
}

Console.WriteLine();

Console.WriteLine("현재 보드:");

show = 0;//왜

무엇인가요?

  • 위치 번호를 그려주는 부분입니다
  • 이중 for문으로 3*3 칸을 구현합니다
  • Console.Write(" | "); 끝날때마다 |를 붙여 칸 구분하고
  • Console.WriteLine("---------"); 행이 바뀔때마다 - 구분합니다

 

ini
//최초 그림
#region
for (int row = 0; row < 3; row++)
{
    for (int col = 0; col < 3; col++)
    {
        //Console.Write($"{position[show]}"); //실패
        Console.Write($"{position[show]}");
        show++;
        //Console.Write($"{position[show] += (show+1)}"); //실패
        //이걸 배열선언해서 채워넣은다음 바꿔야할거같은데
        //0번배열에 1, 1번에 2
        //그럼 점 부분에 숫자부터 해볼까

        if (col >= 2)
        {
            break;
        }
        Console.Write(" | ");
    }
    Console.WriteLine();

    if (row >= 2)
    {
        break;
    }
    Console.WriteLine("---------");
}
#endregion

무엇인가요?

  • 입력 전에 현재 칸을 최초로 표시해주는 부분입니다
  • 화면을 클리어 한 후엔 사라집니다

ini
while (round < 10)
{
    void TicTacToe(int num)
    {
        Console.Clear();
    show = 0;

        //재화면
        Console.WriteLine("=== 틱택토 게임 · 1단계 ===");
        Console.WriteLine("두 사람이 X와 O를 번갈아 놓습니다. X가 먼저 시작합니다.");
        Console.WriteLine();

        Console.WriteLine("위치 번호:");

        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                Console.Write($"{show + 1}");
                show++;
                if (col >= 2)
                {
                    break;
                }
                Console.Write(" | ");
                //position[show] += ".";


            }
            Console.WriteLine();

            if (row >= 2)
            {
                break;
            }
            Console.WriteLine("---------");
        }

        Console.WriteLine();

        Console.WriteLine("현재 보드:");

        show = 0;//왜

        //TicTacToe(0);//일단 실행

        position[num - 1] = (round % 2 == 0 ? "O" : "X");

        show = 0;//왜

        for (int row = 0; row < 3; row++)
        {
            for (int col = 0; col < 3; col++)
            {
                //Console.Write($"{position[show]}"); //실패
                Console.Write($"{position[show]}");
            show++;
            //Console.Write($"{position[show] += (show+1)}"); //실패
            //이걸 배열선언해서 채워넣은다음 바꿔야할거같은데
            //0번배열에 1, 1번에 2
            //그럼 점 부분에 숫자부터 해볼까

            if (col >= 2)
                {
                    break;
                }
                Console.Write(" | ");
                    
            }
            Console.WriteLine();

            if (row >= 2)
            {
                break;
            }
            Console.WriteLine("---------");
        }




    }

무엇인가요?

  • 본격적으로 입력받는 부분입니다
  • while (round < 10) 입력받는 글자를 매개변수로 받아 배열을 채워야합니다
  • void TicTacToe(int num) 어려번 입력받을때마다 화면을 그려야해서 반복문 안에 함수를 넣습니다
  • position[num - 1] = (round % 2 == 0 ? "O" : "X"); 현재 입력 횟수에 따라 O턴인지 X턴인지 구분합니다

 

  • for (int row = 0; row < 3; row++) 왜 for문이 두개인가요?
  • 화면을 입력할때마자 지우기 때문에 위에 숫자보드와 아래 입력보드를 동시에 써야하기 때문입니다

css
    #region Win Test

    //내가보기엔 여기같은데 입력이 다 끝나고 나서 검사하는거

    //가로
    if ((position[0] == position[1] && position[1] == position[2]) && (position[0] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[0] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;   
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }

    }
    else if ((position[3] == position[4] && position[4] == position[5]) && (position[3] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[3] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }
    else if ((position[6] == position[7] && position[7] == position[8]) && (position[6] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[6] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }

    //세로
    else if ((position[0] == position[3] && position[3] == position[6]) && (position[0] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[0] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;   
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }
    else if ((position[1] == position[4] && position[4] == position[7]) && (position[1] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[1] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }
    else if ((position[2] == position[5] && position[5] == position[8]) && (position[2] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[2] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }

    //대각선
    else if ((position[0] == position[4] && position[4] == position[8]) && (position[0] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[0] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }
    }
    else if ((position[2] == position[4] && position[4] == position[6]) && (position[2] != "."))
    {
        //값이 같아야하니 이거도 하나만 검사하면 되겠지?
        if (position[2] == "X")
        {
            Console.WriteLine($"플레이어 X 승리!");
            break;
        }
        else
        {
            Console.WriteLine($"플레이어 O 승리!");
            break;
        }

    }

    isFull = true;

    for (int i = 0; i < position.Length; i++)
    {
        if (position[i] == ".")
        {
            isFull = false;
            break;
        }
    }

    if (isFull)
    {
        Console.WriteLine("무승부입니다!");
        break;
    }




    #endregion

무엇인가요?

  • 승리 조건 및 무승부를 파악하는 부분입니다

  • 입력후에 탐지해야해서 입력부분 아래에 있습니다

  • 틱택토처럼 승리 가짓수가 적은게임이라 직접 만들어 넣었습니다

  • (position[3] position[4] && position[4] position[5]) 해당 배열이 모두 같은지 검사하고

  • (position[3] != ".") 칸이 채워져있음 두가지 모두를 충족해야하며

  • if (position[3] == "X") 그 칸이 X인지 O인지 구분해서 승리 플레이어를 확인합니다

 

ini
    isFull = true;

    for (int i = 0; i < position.Length; i++)
    {
        if (position[i] == ".")
        {
            isFull = false;
            break;
        }
    }

    if (isFull)
    {
        Console.WriteLine("무승부입니다!");
        break;
    }

  • 현재 배열을 모두 돌면서 하나라도 . 가 있으면 비워짐 상태입니다
  • 비워진상태라면 break 하며 아니라면 무승부를 띄우고 break합니다

arduino
    Console.WriteLine();
    Console.WriteLine($"플레이어 {(round % 2 == 0 ? "O" : "X")} 의 차례입니다.");
    Console.WriteLine($"위치를 선택하세요 (1~9):");

    string input = Console.ReadLine();

    // 숫자 이외의 입력-> 숫자로 위치를 입력하세요.
    // 잘못된 숫자 입력 -> 1부터 9까지의 번호를 입력하세요.
    // 이미 입력된곳은 -> 이미 선택한 칸입니다. 빈칸을 선택하세요.

    if (int.TryParse(input, out int result))
    {
        //result가 0보다 크고 10보다 작아야함 (1~9)
        if (result > 0 && result < 10) //이론상 이러면 1~9 범위 아니면 false 나와야하는데...
        {
            if (position[result-1] == ".") //숫자인지 아닌지 비교를 어캐하지?
            {
                TicTacToe(result);
                round++;
            }
            else
            {
                Console.WriteLine($"이미 선택한 칸입니다. 빈칸을 선택하세요.");
                continue;
            }
        }
        else
        {
            Console.WriteLine($"1부터 9까지의 번호를 입력하세요.");
            continue;
        }

    }
    else
    {
        Console.WriteLine($"숫자로 위치를 입력하세요.");
        continue;
    }





}

무엇인가요?

  • 입력 부분입니다
  • Console.WriteLine($"플레이어 {(round % 2 == 0 ? "O" : "X")} 의 차례입니다."); 현재 라운드를 계산해 O의 턴인지 X의 턴인지 확인합니다
  • string input = Console.ReadLine();
    (중대사항) 숫자 입력만 받도록 해야하기 때문에 처음은 string 값으로 줍니다

 

  • if (int.TryParse(input, out int result)) 입력문자가 숫자인지 문자인지 체크합니다
  • if (result > 0 && result < 10) 입력숫자가 1~9 사이인지 체크합니다
  • if (position[result-1] == ".") .이 있는칸은 입력받지 않은 칸이기에 해당 입력부분이 비어있으면
    TicTacToe(result); 해서 다시 판을 그리고 round++; 라운드 수를 증가시킵니다

 

  • 소요시간 - 4시간
  • AI 질문? - 함

     

종합평가: FFF

  • AI 질문 10회 이상
  • 풀이 시간 2시간 이상
  • 이해가 어려움