📜  2人游戏(用户与用户)的井字游戏的实现

📅  最后修改于: 2021-05-06 08:05:44             🧑  作者: Mango

对于1人游戏(用户与CPU),请参阅井字游戏的实现

游戏规则

  • 该游戏将在两个人之间进行(在此程序中,人与人之间)。
  • 首先,游戏将以两个玩家的名字作为输入。
  • 一个玩家选择“ O”,另一个选择“ X”以标记各自的单元格。
  • 将有一场比赛折腾,这将决定哪个玩家先行动。
  • 游戏从一名玩家开始,当一名玩家的整行/整列/对角线填充有他/她各自的字符(“ O”或“ X”)时,游戏结束。
  • 如果游戏是平局,则显示一条消息“游戏为平局”。

取胜策略–有趣的事实
如果两个球员都发挥出最佳状态,那么注定您将永远不会输(“尽管仍然可以进行比赛”)。比赛第一还是第二都没关系。用另一种方式–“两个专家玩家将始终平局”。
这不是很有趣吗?

以下是该游戏的代码:

C++
// C++ program to play Tic-Tac-Toe
#include 
using namespace std;
  
// Length of the board
#define SIDE 3
  
// Name fo the players
string PLAYER1, PLAYER2;
  
// Function to show the current
// board status
void showBoard(char board[][SIDE])
{
    printf("\n\n");
  
    printf("\t\t\t %c | %c | %c \n",
           board[0][0],
           board[0][1],
           board[0][2]);
  
    printf("\t\t\t------------\n");
  
    printf("\t\t\t %c | %c | %c \n",
           board[1][0],
           board[1][1],
           board[1][2]);
  
    printf("\t\t\t------------\n");
    printf("\t\t\t %c | %c | %c \n\n",
           board[2][0],
           board[2][1],
           board[2][2]);
  
    return;
}
  
// Function to show the instructions
void showInstructions()
{
    printf("\t\t\t Tic-Tac-Toe\n\n");
  
    printf("Choose a cell numbered "
           "from 1 to 9 as below"
           " and play\n\n");
  
    printf("\t\t\t 1 | 2 | 3 \n");
    printf("\t\t\t------------\n");
    printf("\t\t\t 4 | 5 | 6 \n");
    printf("\t\t\t------------\n");
    printf("\t\t\t 7 | 8 | 9 \n\n");
  
    printf("-\t-\t-\t-\t-\t"
           "-\t-\t-\t-\t-\n\n");
  
    return;
}
  
// Function to initialise the game
void initialise(char board[][SIDE],
                int moves[])
{
    // Initiate the random number
    // generator so that the same
    // configuration doesn't arises
    srand(time(NULL));
  
    // Initially the board is empty
    for (int i = 0; i < SIDE; i++) {
        for (int j = 0; j < SIDE; j++)
            board[i][j] = ' ';
    }
  
    // Fill the moves with numbers
    for (int i = 0; i < SIDE * SIDE; i++)
        moves[i] = i;
  
    // randomise the moves
    random_shuffle(moves,
                   moves + SIDE * SIDE);
  
    return;
}
  
// Function to declare winner of the game
void declareWinner(string whoseTurn)
{
    if (whoseTurn == PLAYER1)
        cout << PLAYER1 << " has won\n";
    else
        cout << PLAYER1 << " has won\n";
    return;
}
  
// Function that returns true if
// any of the row is crossed with
// the same player's move
bool rowCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++) {
        if (board[i][0] == board[i][1]
            && board[i][1] == board[i][2]
            && board[i][0] != ' ')
            return (true);
    }
    return (false);
}
  
// Function that returns true if any
// of the column is crossed with the
// same player's move
bool columnCrossed(char board[][SIDE])
{
    for (int i = 0; i < SIDE; i++) {
        if (board[0][i] == board[1][i]
            && board[1][i] == board[2][i]
            && board[0][i] != ' ')
            return (true);
    }
    return (false);
}
  
// Function that returns true if any
// of the diagonal is crossed with
// the same player's move
bool diagonalCrossed(char board[][SIDE])
{
    if (board[0][0] == board[1][1]
        && board[1][1] == board[2][2]
        && board[0][0] != ' ')
        return (true);
  
    if (board[0][2] == board[1][1]
        && board[1][1] == board[2][0]
        && board[0][2] != ' ')
        return (true);
  
    return (false);
}
  
// Function that returns true if the
// game is over else it returns a false
bool gameOver(char board[][SIDE])
{
    return (rowCrossed(board)
            || columnCrossed(board)
            || diagonalCrossed(board));
}
  
// Function to play Tic-Tac-Toe
void playTicTacToe(string whoseTurn)
{
    // A 3*3 Tic-Tac-Toe board for playing
    char board[SIDE][SIDE];
  
    int moves[SIDE * SIDE];
  
    // Initialise the game
    initialise(board, moves);
  
    // Show instructions before playing
    showInstructions();
  
    int moveIndex = 0, x, y;
    int r, c;
  
    // Keep playing till the game is
    // over or it is a draw
    while (gameOver(board) == false
           && moveIndex != SIDE * SIDE) {
        if (whoseTurn == PLAYER1) {
  
        // Lable for player1 worng choice
        // of row and column
        player1:
  
            // Input the desired row and
            // column by player 1 to
            // insert X
            cout << PLAYER1
                 << " Enter the respective"
                 << " row and column to "
                    "insert X :\n";
            cin >> r >> c;
  
            if (r <= 3 && c <= 3) {
  
                // To check desired row and
                // column should be empty
                if (board[r - 1] == ' ')
                    board[r - 1] = 'X';
  
                // If input is on already
                // filled position
                else {
                    cout << "You cannot Overlap"
                         << " on Already "
                            "filled position:\n";
                    goto player1;
                }
            }
  
            // Input is not valid
            else {
                cout << "\nInput is not "
                     << "valid please enter "
                     << "right one\n";
  
                goto player1;
            }
  
            showBoard(board);
            moveIndex++;
            whoseTurn = PLAYER2;
        }
  
        else if (whoseTurn == PLAYER2) {
  
        // Lable for player2 worng choice
        // of row and column
        player2:
  
            // Input the desired row and
            // column by player 1 to
            // insert X
            cout << PLAYER2
                 << " Enter the respective"
                 << " row and column to "
                    "insert O :";
            cin >> r >> c;
            if (r <= 3 && c <= 3) {
  
                // Input the desired row and
                // column by player 1 to
                // insert X
                if (board[r - 1] == ' ')
                    board[r - 1] = 'O';
  
                // If input is on already
                // filled position
                else {
                    cout << "You cannot Overlap"
                         << " on Already "
                         << "filled position:\n";
                    goto player2;
                }
            }
  
            // Input is not valid
            else {
                cout << "\nInput is not "
                     << "valid please enter "
                     << "right one :\n";
                goto player2;
            }
  
            showBoard(board);
            moveIndex++;
            whoseTurn = PLAYER1;
        }
    }
  
    // If the game has drawn
    if (gameOver(board) == false
        && moveIndex == SIDE * SIDE)
        printf("It's a draw\n");
    else {
  
        // Toggling the user to declare
        // the actual winner
        if (whoseTurn == PLAYER1)
            whoseTurn = PLAYER2;
        else if (whoseTurn == PLAYER2)
            whoseTurn = PLAYER1;
  
        // Declare the winner
        declareWinner(whoseTurn);
    }
    return;
}
  
// Driver Code
int main()
{
    // Take the name of players
    cout << "Enter name of first Player: ";
    cin >> PLAYER1;
  
    cout << "Enter name of Second Player: ";
    cin >> PLAYER2;
  
    // Use current time as seed for
    // random generator
    srand(time(0));
  
    // Lets do toss
    int toss = rand() % 2;
  
    // Let us play the game
    if (toss == 1) {
        cout << "Player "
             << PLAYER1
             << " win the toss"
             << endl;
  
        playTicTacToe(PLAYER1);
    }
    else {
        cout << "Player "
             << PLAYER2
             << " win the toss"
             << endl;
        playTicTacToe(PLAYER2);
    }
  
    return (0);
}


输出:
以下是上述代码的输出: