Implementación de Tic-Tac-Toe para juego de 2 personas (Usuario vs. Usuario)

Para el juego de 1 persona (Usuario vs. CPU), consulte Implementación del juego Tic-Tac-Toe 

Reglas del juego

  • El juego debe ser jugado entre dos personas (en este programa entre HUMANO a HUMANO).
  • Primero, el juego tomará los nombres de los dos jugadores como entrada.
  • Uno de los jugadores elige ‘O’ y el otro ‘X’ para marcar sus respectivas celdas.
  • Habrá un sorteo del juego, que decidirá qué jugador se moverá primero.
  • El juego comienza con uno de los jugadores y termina cuando uno de los jugadores tiene una fila/columna/diagonal completa llena con su carácter respectivo (‘O’ o ‘X’).
  • Si el juego es Empate entonces, se muestra un mensaje «El juego es Empate».

Estrategia ganadora: un hecho interesante
Si ambos jugadores juegan de manera óptima, está destinado a que nunca pierdas («aunque el partido aún puede empatar»). No importa si juegas primero o segundo. De otra manera: «Dos jugadores expertos siempre dibujarán».
¿No es esto interesante?

A continuación se muestra el código para el juego: 

C++

// C++ program to play Tic-Tac-Toe
#include <bits/stdc++.h>
using namespace std;
 
// Length of the board
#define SIDE 3
 
// Name of 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) {
 
        // Label for player1 wrong 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) {
 
        // Label for player2 wrong 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);
}

Salida: 
A continuación se muestra la salida del código anterior: 

Publicación traducida automáticamente

Artículo escrito por mishrapriyanshu557 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *