C++ 틱택토 게임

Ammar Ali 2024년2월15일
  1. C++ 틱택토 게임
  2. 1단계: 3x3 그리드를 그리는 함수 만들기
  3. 2단계: 사용자에게 행 및 열 번호를 입력하도록 요청
  4. 3단계: 사용자가 입력한 위치가 점유되어 있는지 확인
  5. 4단계: 게임 승자 확인 기능 만들기
C++ 틱택토 게임

이 자습서에서는 C++에서 조건문과 루프를 사용하여 tic tac toe 게임을 만드는 방법에 대해 설명합니다.

C++ 틱택토 게임

Tic tac toe는 2인용 게임으로, 각 플레이어는 3x3 격자 안의 한 위치에 표시를 하고, 수평, 수직 또는 대각선의 직선에 세 개의 표시를 성공적으로 한 플레이어가 게임의 승자가 됩니다. . 게임의 예시 이미지는 아래와 같습니다.

C++ Tic Tac Toe 게임

플레이어 X의 세 마커가 직선 대각선에 있기 때문에 플레이어 X가 tic tac toe 게임의 승자임을 알 수 있습니다. C++로 같은 게임을 만들려면 같은 알고리즘을 사용하여 펜과 종이를 사용하여 게임을 플레이해야 합니다.

펜을 사용하여 종이에 3x3 그리드를 그린 다음 각 플레이어는 빈 공간의 그리드 내부에 마커를 배치합니다. 한 플레이어가 세 개의 마커를 일직선으로 배치하면 해당 플레이어가 게임에서 승리하고 게임이 종료됩니다.

플레이어 중 누구도 직선으로 3개의 마커를 배치하지 않거나 그리드 내부의 모든 장소가 점유된 경우 게임은 무승부로 종료됩니다. 동일한 알고리즘을 사용하여 C++에서 tic tac toe 게임을 만들 수 있습니다.

첫 번째 단계에서는 3x3 그리드를 그리는 함수를 만들어야 합니다. 두 번째 단계에서는 사용자로부터 행 및 열 번호 형식으로 입력을 받고 입력이 유효한지 확인해야 합니다.

세 번째 단계에서는 사용자가 입력한 위치가 점유되어 있는지 여부를 확인하고 점유되지 않은 경우 사용자가 입력한 위치에 그리드 내부에 플레이어의 마커를 배치하고, 장소가 점유되면 플레이어에게 다른 위치를 입력하도록 요청합니다. 자리가 모두 차면 게임을 종료하고 동점임을 발표합니다.

네 번째 단계에서는 플레이어의 마커 세 개가 일직선에 있는지 확인합니다. 플레이어의 마커가 일직선에 있으면 게임을 종료하고 게임에서 이긴 플레이어 이름을 발표하고, 마커가 일직선에 있지 않으면 두 번째 단계로 돌아가서 반복합니다.

1단계: 3x3 그리드를 그리는 함수 만들기

이제 3x3 보드를 그려야 하는 첫 번째 단계부터 게임 만들기를 시작하겠습니다. 파이프 문자 | 조합을 사용하여 보드를 그릴 수 있습니다. 및 대시 문자 - 키보드에서.

대시 문자 -를 사용하여 수평선을 그리고 파이프 문자 |를 그릴 수 있습니다. 그리드에 있는 수직선을 그리기 위해 숫자를 사용하여 그리드의 행과 열 번호를 표시할 수 있습니다. 예를 들어, C++ cout() 함수를 사용하여 3x3 격자를 그립니다.

아래 코드를 참조하십시오.

#include <iomanip>
#include <iostream>

using namespace std;
void drawGameBoard(char Gameboard[][3]);

int main() {
  char Gameboard[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
  drawGameBoard(Gameboard);
  return 0;
}

void drawGameBoard(char Gameboard[][3]) {
  cout << "     1   2   3" << endl;
  cout << "   -------------" << endl;

  cout << " 1"
       << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | "
       << Gameboard[0][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 2"
       << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | "
       << Gameboard[1][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 3"
       << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | "
       << Gameboard[2][2] << " | " << endl;
  cout << "   -------------" << endl;
}

출력:

     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------

위의 코드는 endl 문을 사용하여 커서를 새 줄로 이동합니다. 위 출력에서 세로로 재생되는 숫자는 행 번호를 나타내고 가로 숫자는 열 번호를 나타냅니다.

2단계: 사용자에게 행 및 열 번호를 입력하도록 요청

두 번째 단계에서는 사용자에게 마커를 배치하려는 행과 열 번호를 입력하도록 요청할 수 있습니다. 조건문을 사용하여 사용자 입력을 확인하고 행 또는 열 번호가 1~3 범위에 없으면 오류를 표시하고 사용자에게 입력을 다시 입력하도록 요청합니다.

루프를 사용하여 사용자로부터 입력을 받고 사용자가 유효한 행과 열 번호를 입력할 때까지 루프가 계속됩니다. 예를 들어 while 루프와 if-else 문을 사용하여 사용자로부터 입력을 받아봅시다.

아래 코드를 참조하십시오.

#include <iomanip>
#include <iostream>

using namespace std;
void drawGameBoard(char Gameboard[][3]);

int main() {
  int Boardrow;
  int Boardcolumn;
  bool is_Boardrow;
  bool is_Boardcolumn;
  char Gameboard[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
  drawGameBoard(Gameboard);

  is_Boardrow = false;
  while (!is_Boardrow) {
    cout << "BoardRow: ";
    cin >> Boardrow;
    if (Boardrow == 1 || Boardrow == 2 || Boardrow == 3) {
      is_Boardrow = true;
    } else {
      cout << endl << "Invalid Boardrow!" << endl;
    }
  }
  is_Boardcolumn = false;
  while (!is_Boardcolumn) {
    cout << "BoardColumn: ";
    cin >> Boardcolumn;
    if (Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3) {
      is_Boardcolumn = true;
    } else {
      cout << endl << "Invalid Boardcolumn!" << endl;
    }
  }
  return 0;
}

void drawGameBoard(char Gameboard[][3]) {
  cout << "     1   2   3" << endl;
  cout << "   -------------" << endl;

  cout << " 1"
       << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | "
       << Gameboard[0][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 2"
       << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | "
       << Gameboard[1][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 3"
       << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | "
       << Gameboard[2][2] << " | " << endl;
  cout << "   -------------" << endl;
}

출력:

     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
BoardRow: 5

Invalid Boardrow!
BoardRow: 1
BoardColumn: 6

Invalid Boardcolumn!
BoardColumn: 2

위의 코드에서는 사용자 입력을 저장하기 위해 BoardrowBoardcolumn이라는 두 개의 정수를 사용했습니다. 입력 상태를 저장하기 위해 is_boardRowis_boardColumn이라는 두 개의 부울 변수를 사용했습니다.

두 부울 변수를 false로 설정하면 루프가 반복되어 사용자에게 행 및 열 번호를 입력하도록 요청하고 입력된 숫자가 유효하면 부울이 true로 설정되고 루프가 끊어집니다. 우리는 두 개의 루프를 사용했습니다. 하나는 행 번호용이고 다른 하나는 열 번호용입니다.

위의 출력은 유효하지 않은 행 또는 열 번호를 입력할 때 코드가 유효하지 않은 행 또는 열 번호를 표시하고 사용자에게 입력을 다시 입력하도록 요청함을 보여줍니다.

3단계: 사용자가 입력한 위치가 점유되어 있는지 확인

세 번째 단계에서는 사용자가 입력한 위치에 플레이어의 마커를 배치해야 하지만 그 전에 입력한 위치가 점유되어 있는지 확인해야 합니다.

포지션이 점유된 경우 사용자에게 다른 포지션을 입력하도록 요청하고, 포지션이 점유되지 않은 경우 보드 내부의 입력된 위치에 플레이어의 마커를 배치합니다.

한 플레이어가 게임 보드나 그리드에 마커를 성공적으로 배치한 후 플레이어를 변경해야 합니다. 예를 들어 루프와 조건문을 사용하여 보드에 마커를 배치해 보겠습니다.

아래 코드를 참조하십시오.

#include <iomanip>
#include <iostream>

using namespace std;

void drawGameBoard(char Gameboard[][3]);
char checkGameWinner3by3(char Gameboard[][3]);

int main() {
  char Gameboard[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
  char Gameplayer = 'X';
  char Gamewinner = ' ';
  int Boardrow;
  int Boardcolumn;
  bool is_Validmove;
  bool is_Boardrow;
  bool is_Boardcolumn;

  cout << "************ TIC TAC TOE Game ************\n";
  while (Gamewinner == ' ') {
    is_Validmove = false;
    is_Boardrow = false;
    is_Boardcolumn = false;
    drawGameBoard(Gameboard);
    cout << "GamePlayer ";

    if (Gameplayer == 'X') {
      cout << 'X';
    } else {
      cout << 'O';
    }
    cout << "'s turn:" << endl;
    is_Validmove = false;

    while (!is_Validmove) {
      is_Boardrow = false;
      while (!is_Boardrow) {
        cout << "BoardRow: ";
        cin >> Boardrow;
        if (Boardrow == 1 || Boardrow == 2 || Boardrow == 3) {
          is_Boardrow = true;
        } else {
          cout << endl << "Invalid Boardrow!" << endl;
        }
      }
      is_Boardcolumn = false;
      while (!is_Boardcolumn) {
        cout << "BoardColumn: ";
        cin >> Boardcolumn;
        if (Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3) {
          is_Boardcolumn = true;
        } else {
          cout << endl << "Invalid Boardcolumn!" << endl;
        }
      }

      if (Gameboard[Boardrow - 1][Boardcolumn - 1] == ' ') {
        Gameboard[Boardrow - 1][Boardcolumn - 1] = Gameplayer;
        is_Validmove = true;
        if (Gameplayer == 'X') {
          Gameplayer = 'O';
        } else {
          Gameplayer = 'X';
        }
      } else {
        cout << "The selected space is occupied!" << endl;
        cout << "Select a different space:" << endl << endl;
        drawGameBoard(Gameboard);
      }
    }
    cout << endl;
  }
  system("pause");
  return 0;
}

void drawGameBoard(char Gameboard[][3]) {
  cout << "     1   2   3" << endl;
  cout << "   -------------" << endl;

  cout << " 1"
       << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | "
       << Gameboard[0][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 2"
       << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | "
       << Gameboard[1][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 3"
       << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | "
       << Gameboard[2][2] << " | " << endl;
  cout << "   -------------" << endl;
}

출력:

************ TIC TAC TOE Game ************
     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 1
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 2
BoardColumn: 2

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   | O |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow:

위의 코드에서는 입력한 위치의 상태를 저장하기 위해 또 다른 부울 변수 is_validMove를 사용했습니다. 부울은 false로 설정되고 while 루프는 자체적으로 반복됩니다. 부울은 true로 설정되며 사용자가 아직 점유되지 않은 위치에 들어가면 true로 설정됩니다.

빈 문자열로 설정된 또 다른 변수 Gamewinner를 사용했으며 다음 단계에서 승자를 선언하고 게임을 중지하는 데 사용됩니다.

사용자로부터 입력을 받는 while 루프 아래에서 if-else 문을 사용하여 Gameboard 배열 내부에 입력된 위치를 확인하고 위치가 비어 있으면 플레이어의 마커를 추가하고 설정합니다. is_validmove 부울을 true로 변경하고 플레이어를 변경하고 공간이 비어 있지 않으면 공간이 점유 중임을 표시하고 사용자에게 다른 공간이나 위치를 입력하도록 요청한 후 게임판을 그립니다.

위 출력에서 플레이어 마커가 게임 보드 내부에 배치되는 것을 볼 수 있습니다.

4단계: 게임 승자 확인 기능 만들기

마지막 단계에서는 게임의 승자를 확인하는 기능을 만들어 보겠습니다. 게임 승자를 확인하려면 그리드 또는 게임 보드의 각 행, 열 및 대각선 항목을 확인해야 합니다.

보드의 행, 열 또는 대각선 항목에 세 개의 동일한 마커가 있는 경우 해당 마커를 반환하고 세 개의 마커가 없는 항목이 없으면 빈 문자열을 반환합니다.

게임 승자 함수의 출력을 Gamewinner 변수에 저장하고 게임 승자가 있으면 메인 루프가 중지됩니다. 그렇지 않으면 계속됩니다.

승자가 있으면 이를 발표하고 게임을 종료합니다. 그렇지 않으면 게임은 무승부가 됩니다. 예를 들어 for 루프와 조건문을 사용하여 게임 승자 함수를 만들어 보겠습니다.

아래 코드를 참조하십시오.

#include <iomanip>
#include <iostream>

using namespace std;

void drawGameBoard(char Gameboard[][3]);
char checkGameWinner3by3(char Gameboard[][3]);

int main() {
  char Gameboard[3][3] = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}};
  char Gameplayer = 'X';
  char Gamewinner = ' ';
  int Boardrow;
  int Boardcolumn;
  bool is_Validmove;
  bool is_Boardrow;
  bool is_Boardcolumn;

  cout << "************ TIC TAC TOE Game ************\n";
  while (Gamewinner == ' ') {
    is_Validmove = false;
    is_Boardrow = false;
    is_Boardcolumn = false;
    drawGameBoard(Gameboard);
    cout << "GamePlayer ";
    if (Gameplayer == 'X') {
      cout << 'X';
    } else {
      cout << 'O';
    }
    cout << "'s turn:" << endl;
    is_Validmove = false;
    while (!is_Validmove) {
      is_Boardrow = false;
      while (!is_Boardrow) {
        cout << "BoardRow: ";
        cin >> Boardrow;
        if (Boardrow == 1 || Boardrow == 2 || Boardrow == 3) {
          is_Boardrow = true;
        } else {
          cout << endl << "Invalid Boardrow!" << endl;
        }
      }
      is_Boardcolumn = false;
      while (!is_Boardcolumn) {
        cout << "BoardColumn: ";
        cin >> Boardcolumn;
        if (Boardcolumn == 1 || Boardcolumn == 2 || Boardcolumn == 3) {
          is_Boardcolumn = true;
        } else {
          cout << endl << "Invalid Boardcolumn!" << endl;
        }
      }
      if (Gameboard[Boardrow - 1][Boardcolumn - 1] == ' ') {
        Gameboard[Boardrow - 1][Boardcolumn - 1] = Gameplayer;
        is_Validmove = true;
        if (Gameplayer == 'X') {
          Gameplayer = 'O';
        } else {
          Gameplayer = 'X';
        }
      } else {
        cout << "The selected space is occupied!" << endl;
        cout << "Select a different space:" << endl << endl;
        drawGameBoard(Gameboard);
      }
    }
    cout << endl;
    Gamewinner = checkGameWinner3by3(Gameboard);
    if (Gamewinner == 'X' || Gamewinner == 'O') {
      drawGameBoard(Gameboard);
      cout << "Congratulations! GamePlayer ";
      if (Gamewinner == 'X') {
        cout << 'X';
      } else {
        cout << 'O';
      }
      cout << " is the Gamewinner!" << endl;
    } else if (Gamewinner == 'T') {
      drawGameBoard(Gameboard);
      cout << "It's a tie!" << endl;
    }
  }

  system("pause");
  return 0;
}

void drawGameBoard(char Gameboard[][3]) {
  cout << "     1   2   3" << endl;
  cout << "   -------------" << endl;

  cout << " 1"
       << " | " << Gameboard[0][0] << " | " << Gameboard[0][1] << " | "
       << Gameboard[0][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 2"
       << " | " << Gameboard[1][0] << " | " << Gameboard[1][1] << " | "
       << Gameboard[1][2] << " | " << endl;
  cout << "   -------------" << endl;

  cout << " 3"
       << " | " << Gameboard[2][0] << " | " << Gameboard[2][1] << " | "
       << Gameboard[2][2] << " | " << endl;
  cout << "   -------------" << endl;
}
char checkGameWinner3by3(char Gameboard[][3]) {
  for (int i = 0; i < 3; i++) {
    if (Gameboard[i][0] == Gameboard[i][1] &&
        Gameboard[i][0] == Gameboard[i][2]) {
      return Gameboard[i][0];
    }
  }

  for (int i = 0; i < 3; i++) {
    if (Gameboard[0][i] == Gameboard[1][i] &&
        Gameboard[0][i] == Gameboard[2][i]) {
      return Gameboard[0][i];
    }
  }

  if (Gameboard[0][0] == Gameboard[1][1] &&
      Gameboard[1][1] == Gameboard[2][2]) {
    return Gameboard[0][0];
  }

  if (Gameboard[0][2] == Gameboard[1][1] &&
      Gameboard[1][1] == Gameboard[2][0]) {
    return Gameboard[0][2];
  }

  return ' ';
}

출력:

************ TIC TAC TOE Game ************
     1   2   3
   -------------
 1 |   |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 1
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 |   |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 2
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O |   |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 2
BoardColumn: 2

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 |   |   |   |
   -------------
GamePlayer O's turn:
BoardRow: 3
BoardColumn: 1

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 | O |   |   |
   -------------
GamePlayer X's turn:
BoardRow: 3
BoardColumn: 3

     1   2   3
   -------------
 1 | X |   |   |
   -------------
 2 | O | X |   |
   -------------
 3 | O |   | X |
   -------------
Congratulations! GamePlayer X is the Gamewinner!

코드에서 보드를 입력으로 받아들이고 두 개의 for 루프와 두 개의 if 문을 포함하는 checkGameWinner3by3() 함수를 볼 수 있습니다. for 루프는 행과 열을 확인하는 데 사용되며 if 문은 대각선 항목을 확인하는 데 사용됩니다.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook