Implementación del juego Tic-Tac-Toe

Reglas del juego

  • El juego debe ser jugado entre dos personas (en este programa entre HUMANO y COMPUTADORA).
  • Uno de los jugadores elige ‘O’ y el otro ‘X’ para marcar sus respectivas celdas.
  • 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 nadie gana, se dice que el juego está empatado.

    Implementación
    En nuestro programa, los movimientos realizados por la computadora y el humano se eligen al azar. Usamos la función rand() para esto.

    ¿Qué más se puede hacer en el programa?
    El programa no se juega de manera óptima por ambos lados porque los movimientos se eligen al azar. El programa se puede modificar fácilmente para que ambos jugadores jueguen de manera óptima (que entrará en la categoría de Inteligencia Artificial). Además, el programa se puede modificar para que el usuario mismo dé la entrada (usando scanf() o cin).
    Los cambios anteriores se dejan como ejercicio para los lectores.

    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 C++ Program to play tic-tac-toe
      
    #include<bits/stdc++.h>
    using namespace std;
      
    #define COMPUTER 1
    #define HUMAN 2
      
    #define SIDE 3 // Length of the board
      
    // Computer will move with 'O'
    // and human with 'X'
    #define COMPUTERMOVE 'O'
    #define HUMANMOVE 'X'
      
    // A 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;
    }
      
    // A 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;
    }
      
      
    // A 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;
    }
      
    // A function to declare the winner of the game
    void declareWinner(int whoseTurn)
    {
        if (whoseTurn == COMPUTER)
            printf("COMPUTER has won\n");
        else
            printf("HUMAN has won\n");
        return;
    }
      
    // A 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);
    }
      
    // A 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);
    }
      
    // A 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);
    }
      
    // A 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) );
    }
      
    // A function to play Tic-Tac-Toe
    void playTicTacToe(int 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 the instructions before playing
        showInstructions();
          
        int moveIndex = 0, x, y;
          
        // Keep playing till the game is over or it is a draw
        while (gameOver(board) == false && 
                moveIndex != SIDE*SIDE)
        {
            if (whoseTurn == COMPUTER)
            {
                x = moves[moveIndex] / SIDE;
                y = moves[moveIndex] % SIDE;
                board[x][y] = COMPUTERMOVE;
                printf("COMPUTER has put a %c in cell %d\n",
                        COMPUTERMOVE, moves[moveIndex]+1);
                showBoard(board);
                moveIndex ++;
                whoseTurn = HUMAN;
            }
              
            else if (whoseTurn == HUMAN)
            {
                x = moves[moveIndex] / SIDE;
                y = moves[moveIndex] % SIDE;
                board[x][y] = HUMANMOVE;
                printf ("HUMAN has put a %c in cell %d\n",
                        HUMANMOVE, moves[moveIndex]+1);
                showBoard(board);
                moveIndex ++;
                whoseTurn = COMPUTER;
            }
        }
      
        // 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 == COMPUTER)
                whoseTurn = HUMAN;
            else if (whoseTurn == HUMAN)
                whoseTurn = COMPUTER;
              
            // Declare the winner
            declareWinner(whoseTurn);
        }
        return;
    }
      
    // Driver program
    int main()
    {
        // Let us play the game with COMPUTER starting first
        playTicTacToe(COMPUTER);
          
        return (0);
    }

    Producción:

                    Tic-Tac-Toe
    
    Choose a cell numbered from 1 to 9 as below and play
    
                  1 | 2  | 3  
                --------------
                  4 | 5  | 6  
                --------------
                  7 | 8  | 9  
    
    -    -    -    -    -    -    -    -    -    -
    
    COMPUTER has put a O in cell 6
    
    
                    |    |    
                --------------
                    |    | O  
                --------------
                    |    |    
    
    HUMAN has put a X in cell 7
    
    
                    |    |    
                --------------
                    |    | O  
                --------------
                  X |    |    
    
    COMPUTER has put a O in cell 5
    
    
                    |    |    
                --------------
                    | O  | O  
                --------------
                  X |    |    
    
    HUMAN has put a X in cell 1
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X |    |    
    
    COMPUTER has put a O in cell 9
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X |    | O  
    
    HUMAN has put a X in cell 8
    
    
                  X |    |    
                --------------
                    | O  | O  
                --------------
                  X | X  | O  
    
    COMPUTER has put a O in cell 4
    
    
                  X |    |    
                --------------
                  O | O  | O  
                --------------
                  X | X  | O  
    
    COMPUTER has won
    

    Una variante interesante de este juego
    Como se dijo anteriormente, si dos jugadores experimentados están jugando al Tic-Tac-Toe, entonces el juego siempre empatará.
    Hay otra variante viral de este juego: Ultimate Tic-Tac-Toe, cuyo objetivo es hacer que el Tic-Tac-Toe normal sea más interesante y menos predecible.
    Echa un vistazo al juego aquí- Link1 Link2

    El artículo anterior implementa Tic-Tac-Toe simple donde los movimientos se realizan al azar. Consulte el artículo a continuación para ver cómo se realizan los movimientos óptimos.
    Algoritmo Minimax en Teoría de Juegos | Conjunto 3 (IA Tic-Tac-Toe: encontrar el movimiento óptimo)

    Grandes debates sobre la estrategia de «ganar/nunca perder»
    Quora
    Wikihow

    Este artículo es una contribución de Rachit Belwariar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuido@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

    Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 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 *