Creando un juego de tres en raya en C++

Creando Un Juego De Tres En Raya En C



Tic-tac-toe es un juego interesante, antiguo y clásico que ha entretenido a generaciones. En el tres en raya, dos jugadores compiten en una cuadrícula de 9 cuadrados marcada con un patrón de almohadillas. Cada jugador toma su turno y coloca el símbolo (O o X) en uno de los cuadrados vacíos. En este artículo, exploraremos cómo crear un juego de tres en raya en el lenguaje de programación C++. El siguiente ejemplo lo guiará en la creación de un juego de tres en raya simple pero atractivo, que abarca los conceptos esenciales, el desglose del código y las consideraciones para crear una experiencia de juego interactiva.

Crear un juego de tres en raya en C++

El siguiente ejemplo proporciona los conceptos básicos para crear este juego interactivo de tres en raya para dos jugadores. Muestra un enfoque simple y fácil para programarlo con C++ y proporciona un código fuente bien documentado para revivir esos desafíos de la infancia con amigos en un nuevo formato digital. Veamos el siguiente código.

Ejemplo: Tres en raya básico basado en consola sin utilizar la matriz 2D

En este ejemplo, usaremos una matriz 2D, funciones y condiciones if-else para crear el juego de tres en raya en C++. En este juego, dos jugadores pueden turnarse para ingresar sus movimientos y esto determina el estado del juego al verificar si hay un ganador o un empate. Vea el siguiente código proporcionado:







#incluir

usando el espacio de nombres estándar ;

vacío tablero de dibujo ( carbonizarse junta [ 3 ] [ 3 ] ) ;

bool esMoveValid ( carbonizarse junta [ 3 ] [ 3 ] , En t fila , En t columna ) ;

bool esBoardFull ( carbonizarse junta [ 3 ] [ 3 ] ) ;

carbonizarse comprobarGanador ( carbonizarse junta [ 3 ] [ 3 ] ) ;

En t principal ( ) {

  carbonizarse junta [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

  En t fila , columna ;

  carbonizarse jugador actual = 'X' ;

  mientras ( verdadero ) {

tablero de dibujo ( junta ) ;

corte << 'Jugador' << jugador actual << 'Es el turno. Ingrese la fila (1-3) y la columna (1-3): ' ;

comiendo >> fila >> columna ;

fila --;

columna --;

  si ( esMoveValid ( junta , fila , columna ) ) {

junta [ fila ] [ columna ] = jugador actual ;

    carbonizarse ganador = comprobarGanador ( junta ) ;

    si ( ganador != ' ' ) {

tablero de dibujo ( junta ) ;

corte << 'Jugador' << ganador << '¡Es un ganador! \norte ' ;

        romper ;

    }

    si ( esTableroLleno ( junta ) ) {

tablero de dibujo ( junta ) ;

corte << '¡Es un empate! \norte ' ;

        romper ;

    }

jugador actual = ( jugador actual == 'X' ) ? 'Oh' : 'X' ;

    } demás {

corte << 'Movimiento no válido. Elija otra celda. \norte ' ;

    } }

  devolver 0 ;

}

vacío tablero de dibujo ( carbonizarse junta [ 3 ] [ 3 ] ) {

corte << 'b| \ t 1 \ t | \ t 2 \ t | \ t 3 \ t | \norte ' ;

corte << ' ______________________ \norte ' ;

para ( En t metro = 0 ; metro < 3 ; metro ++ ) {

corte << metro + 1 << '| ' ;

  para ( En t t = 0 ; t < 3 ; t ++ ) {

corte << '' << junta [ metro ] [ t ] ;

      si ( t < 2 ) corte << ' \ t | \ t ' ;

  }

corte << ' \ t | \norte ' ;

  si ( metro < 2 ) corte << ' ______________________ \norte ' ;

}

corte << ' \norte ' ; }

bool esMoveValid ( carbonizarse junta [ 3 ] [ 3 ] , En t fila , En t columna ) {

  devolver ( fila >= 0 && fila < 3 && columna >= 0 && columna < 3 && junta [ fila ] [ columna ] == ' ' ) ;

}

bool esBoardFull ( carbonizarse junta [ 3 ] [ 3 ] ) {

  para ( En t metro = 0 ; metro < 3 ; metro ++ ) {

    para ( En t t = 0 ; t < 3 ; t ++ ) {

      si ( junta [ metro ] [ t ] == ' ' ) {

          devolver FALSO ;

      } } }

  devolver verdadero ; }

carbonizarse comprobarGanador ( carbonizarse junta [ 3 ] [ 3 ] ) {

  para ( En t metro = 0 ; metro < 3 ; metro ++ ) {

  si ( junta [ metro ] [ 0 ] == junta [ metro ] [ 1 ] && junta [ metro ] [ 1 ] == junta [ metro ] [ 2 ] && junta [ metro ] [ 0 ] != ' ' ) {

      devolver junta [ metro ] [ 0 ] ;

  }

  si ( junta [ 0 ] [ metro ] == junta [ 1 ] [ metro ] && junta [ 1 ] [ metro ] == junta [ 2 ] [ metro ] && junta [ 0 ] [ metro ] != ' ' ) {

    devolver junta [ 0 ] [ metro ] ;

  } }

  si ( junta [ 0 ] [ 0 ] == junta [ 1 ] [ 1 ] && junta [ 1 ] [ 1 ] == junta [ 2 ] [ 2 ] && junta [ 0 ] [ 0 ] != ' ' ) {

    devolver junta [ 0 ] [ 0 ] ;

  }

  si ( junta [ 0 ] [ 2 ] == junta [ 1 ] [ 1 ] && junta [ 1 ] [ 1 ] == junta [ 2 ] [ 0 ] && junta [ 0 ] [ 2 ] != ' ' ) {

    devolver junta [ 0 ] [ 2 ] ;

  }

  devolver ' ' ;

}

Aquí hay un desglose de su funcionalidad:



“#include ” es una directiva de preprocesador que incluye la biblioteca de flujo de E/S para operaciones de entrada/salida. El uso del “espacio de nombres std” permite el uso directo de funciones cout, cin, etc. en un programa C++, sin requerir el “prefijo std::”.



Hay cuatro prototipos de funciones en este programa: drawBoard(), isMoveValid(), isBoardFull() y checkWinner(). La declaración de función se conoce como prototipo de función. Aunque viene después de la función principal del programa, se utilizará. La función principal contiene el bucle del juego y la lógica para gestionar los turnos y movimientos de los jugadores. Dentro de la función principal, el tablero de juego se inicializa con espacios.





carbonizarse junta [ 3 ] [ 3 ] = { { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } , { ' ' , ' ' , ' ' } } ;

Después de esto, se definen dos variables de fila y columna para almacenar la entrada de movimientos del jugador. El 'char currentPlayer = 'X';' define que el jugador “X” va primero.

Ahora, comienza el ciclo del juego while (verdadero) y continúa hasta que hay un ganador o un empate. Este bucle ' while ' llama al 'drawBoard();' para mostrar el tablero. Después de mostrar el tablero en la consola, se le pide al usuario que elija una celda para marcar en la siguiente declaración de código:



corte << 'Jugador' << jugador actual << 'Es el turno. Introduzca fila y columna (1-3): ' ;

El jugador ingresa su movimiento en “cin >> fila >> col;”.

Al seleccionar una celda para marcar, el programa primero verificará la validez de la entrada, asegurándose de que la celda no esté ya llena llamando a la función isMoveValid().

junta [ fila ] [ columna ] = jugador actual ;

Esta declaración coloca la marca del jugador en el tablero.

carbonizarse ganador = comprobarGanador ( junta ) ;

si ( ganador != ' ' ) {

tablero de dibujo ( junta ) ;

corte << 'Jugador' << ganador << ' gana! \norte ' ;

Estas declaraciones buscan un ganador cada vez que un jugador marca una entrada en el tablero. Si hay un ganador, se anunciará el nombre del ganador y el programa saldrá del bucle del juego.

si ( esTableroLleno ( junta ) ) {

Esta declaración comprueba si hay un empate. La condición de empate se produce en el caso de que el tablero esté lleno y no haya ningún ganador. En este caso, '¡Es un empate!' está impreso en la pantalla.

jugador actual = ( jugador actual == 'X' ) ? 'Oh' : 'X' ;

Esta declaración cambia a los jugadores para darles a cada jugador la oportunidad de jugar su turno.

corte << 'Movimiento no válido. Elija otra celda. \norte ' ;

Si el movimiento no es válido, se le solicita al usuario que ingrese nuevamente y elija cualquier otra celda.

Después de la función “principal”, comenzarán las definiciones de funciones para los prototipos de funciones que están previamente declarados. La primera función que se define aquí es drawBoard() que se utiliza para dibujar el tablero de tres en raya en la consola. La función drawBoard() imprime el estado actual del tablero, incluidas las líneas de la cuadrícula.

La siguiente función que se define aquí es isMoveValid(). Esta función se utiliza para determinar si se permite un movimiento tanto dentro del tablero como en una celda vacía. La función isBoardFull() se utiliza para comprobar si el tablero aún está lleno. Esta es una condición para una situación de empate cuando no hay un ganador. isBoardFull() comprueba si todas las posiciones del tablero están ocupadas, lo que indica un empate si no hay un ganador. Si hay un ganador, se puede determinar mediante la función checkWinner(). checkWinner() comprueba todas las líneas ganadoras potenciales en busca de la marca del mismo jugador ('X' u 'O') y devuelve la marca del jugador ganador si se encuentra o un carácter de espacio ' ' si aún no hay un ganador. El siguiente es el resultado del programa. Muestra cada turno de cada jugador.

En primer lugar, el tablero está claro; Se le solicita al jugador “X” que elija la celda que se marcará. Aquí, el jugador “X” ingresa 2 y 2. Las celdas de la fila 2 y la columna 2 están marcadas. Consulte el tablero marcado a continuación:

Ahora es el turno del jugador O. Se le pide al jugador que elija una celda para marcar. El jugador “O” elige 1 para la fila y 1 para la columna. La celda elegida está marcada para el jugador 'O', como se muestra en el siguiente fragmento de salida:

Todos los turnos de cada jugador seguirán el mismo patrón. Es el turno del jugador X, que elige 1 para la fila y 2 para la columna. Consulte las siguientes instantáneas de salida proporcionadas:

Ahora le toca el turno al jugador “O”. El jugador elige 1 para la fila y 3 para la columna.

El siguiente turno vuelve a ser del jugador “X”. El jugador elige 3 para la fila y 1 para la columna.

El jugador “O” elige 3 para la fila y 2 para la columna.

El jugador “X” selecciona la segunda fila y la tercera columna.

El jugador 'O' ahora selecciona la segunda fila y la primera columna.

El jugador “X” elige esta vez la tercera fila y la tercera columna.

Ningún jugador podrá realizar ninguna línea horizontal, vertical o diagonal, por lo que se trata de un empate. No hay ganador para el conjunto de entradas elegido.

En general, el código comprende un bucle de juego principal que es responsable de manejar el estado del juego y la entrada del usuario, junto con varias funciones de utilidad que se utilizan para dibujar el tablero, validar los movimientos, comprobar si hay un tablero completo y determinar si hay un ganador. .

Conclusión

Desarrollar un juego de tres en raya usando C++ es un excelente ejercicio práctico para reforzar tus habilidades de programación. El artículo explica con precisión cómo crear tres en raya en C++. La guía paso a paso proporcionada en este artículo abarcó una matriz 2D, funciones y condiciones if-else para que los lectores comprendan la mecánica del juego, las interacciones del usuario y la estructuración eficiente del código. El recorrido detallado del código y la explicación de las funciones que son cruciales para el juego principal brindan a los lectores información invaluable tanto sobre las prácticas de programación de C++ como sobre las complejidades del desarrollo de un juego simple.