Tres en línea (tic tac toe) programado en C - Desarrollo del juego

Tres en línea en C – Programación de juego

En este post de programación en C te mostraré el código fuente para el juego conocido como tres en línea, tres en raya, tic tac toe, gatitos, etcétera.

Tres en línea (tic tac toe) programado en C - Desarrollo del juego
Tres en línea (tic tac toe) programado en C – Desarrollo del juego

He programado el juego en C estándar así que se puede compilar en varios sistemas operativos, y también se puede compilar con un compilador de C++.

El juego de tres en línea que he desarrollado en C soporta el modo jugador contra jugador, jugador contra CPU (con una pequeña inteligencia artificial) y CPU contra CPU. A lo largo del post te explicaré el código y cómo es que funciona cada parte del programa.

Por cierto, en este caso el juego se desarrolla en la consola pero se le puede agregar una interfaz usando alguna librería como Allegro.

Funcionamiento básico del juego

Todo el juego se desarrolla en una matriz de tipo char en donde estará un espacio vacío, la X o la O. En cada turno, se eligen unas coordenadas (ya sea que se le soliciten al usuario o el programa las elija) y se coloca la pieza.

Empate en tres en línea con C
Empate en tres en línea con C

Inmediatamente después de colocar la pieza se evalúa si hay un ganador. Se dice que hay un ganador cuando se pueden conectar 3 piezas en una línea recta sin importar la dirección de ésta, así que es necesario hacer un conteo en todas las direcciones para saber si alguien gana en este juego de tic tac toe en C.

Si no hay un ganador, se comprueba si hay un empate. Para saber si hay empate se recorre todo el tablero verificando que no haya ningún espacio vacío.

Finalmente si no hay ganador ni un empate, se le pasa el turno al oponente del jugador actual. Así hasta que alguna condición que termina el juego se cumple.

Lo que expliqué arriba se traduce en el siguiente código de C:

El código es muy simple y los comentarios proporcionan detalles extra de lo que se está haciendo (por si los nombres de las funciones no son obvios).

Modos de juego de tres en línea

Como mencioné al inicio, este juego tiene tres modos. En el primer caso se puede jugar un humano contra un humano. En cada turno se solicitan las coordenadas (números separados por coma) en donde se coloca la pieza que puede ser O o X.

Para el modo de CPU contra humano, el CPU tiene que pensar en su mejor movimiento; justo ahí es en donde se hace una pequeña simulación del lugar donde le conviene colocar la pieza.

Finalmente en el modo CPU contra CPU se enfrenta a la computadora contra sí misma.

Eligiendo la mejor posición según inteligencia artificial

Victoria del CPU en Tic tac toe programado en C
Victoria del CPU en Tic tac toe programado en C

Para que el CPU elija en dónde colocar las piezas debe hacer algunas simulaciones de lo que pasa si coloca la pieza en todas las opciones posibles. El orden que sigue es:

  1. Ganar si se puede
  2. Hacer perder al oponente si está a punto de ganar
  3. Tomar el mejor movimiento del oponente (en donde obtiene el mayor puntaje)
  4. Tomar mi mejor movimiento (en donde obtengo mayor puntaje)
  5. Elegir la de la esquina superior izquierda (0,0)
  6. Coordenadas aleatorias

En el peor de los casos elegirá alguna posición aleatoria, pero también es capaz de atacar y defenderse.

Por cierto, esto está altamente inspirado en el juego de Conecta 4. El código para este caso es el siguiente:

Es importante que mencione que se reciben dos apuntadores a dos enteros (variables por referencia) porque en C no podemos devolver dos valores en una función, así que mejor se reciben los apuntadores.

Dentro del código también vemos algunas funciones ayudantes, por ejemplo la función que devuelve el oponente de un jugador.

Saber si gana o es empate

Para saber si un jugador gana se verifica si se forma una línea recta y si el conteo es de 3 (por eso es que se llama tres en línea). Las funciones que cuentan y verifican son:

Es un algoritmo simple pero tedioso, pues se tiene que recorrer el tablero desde una posición hacia todas las direcciones posibles. En caso de que se conecte hacia arriba, la derecha, arriba derecha o abajo derecha, se devuelve un 1 indicando que el jugador gana.

Si el jugador no gana, se devuelve un 0. Y así es como se define si un jugador obtiene la victoria en este juego de gatitos en C. Ya para el caso de la verificación del empate el código queda así:

Poniendo todo junto

Hasta este punto te he explicado el funcionamiento general del juego. Obviamente te dejo el código fuente completo en mi GitHub, para que puedas analizarlo, mejorarlo, ejecutarlo, etcétera.

El código completo es un poco más extenso pero igualmente se explica por sí mismo. Y así es como se puede tener el juego de Tic Tac Toe completamente en C.

Por cierto, te dejo una demostración en línea para comprobar que el juego funciona perfectamente.

Recuerda que este código se puede compilar con gcc, clang y g++. También lo puedes importar en Dev C++, CodeBlocks, CLion, etcétera.

Te dejo con más tutoriales de C en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario