Jugando batalla naval - Juego programado con Python

Batalla naval en Python – Programación de juego

Hoy vamos a ver un juego programado en Python sin usar librerías para el funcionamiento del mismo.

Se trata del juego Battleship, juego de los barquitos, hundir la flota, hundiendo barquitos  o también llamado Batalla Naval programado totalmente en Python. Los requisitos del juego los veremos a continuación.

En este post te mostraré cómo programarlo, cómo jugarlo y dónde descargar el código fuente.

Requisitos de batalla naval en Python

  • Contar con una matriz de M columnas y N filas por cada jugador. Al inicio del juego toda la matriz tendrá únicamente el mar.
  • Colocar barcos al azar. Algunos de ellos ocupan dos celdas, y otros solo una. Los barcos que ocupan dos celdas pueden ser horizontales o verticales, pero ningún barco puede quedar encima de otro.
  • Los barcos están ocultos al inicio, y no importa qué tan cerca estén unos de los otros.
  • Cuando el juego inicia se debe indicar la cantidad de barcos que hay ocultos en el tablero, y se le debe dar al usuario la posibilidad de disparar indicando la fila y columna. La fila se indica con una letra.
  • Durante el desarrollo del juego se deben indicar los disparos restantes del jugador, así como los tiros acertados y tiros fallados. Estos tiros deben indicarse con un carácter.
  • También debe reproducirse un sonido distinto por cada disparo.
  • El juego se desarrolla por turnos y termina cuando un jugador gana o el otro pierde. Si un jugador acierta un disparo, puede seguir disparando.
  • Un jugador gana cuando derriba todos los barcos enemigos, y pierde cuando se le terminan sus disparos.
  • Cuando el juego termina se deben mostrar los barcos.
  • Al inicio se debe mostrar un menú con opciones de: Jugar, Acerca de y Salir. Siempre que se elija una de las primeras dos opciones se debe regresar a este menú.

Nota: he usado PyGame únicamente para reproducir los sonidos; ya que todo el juego es código nativo y se desarrolla en la terminal. Así que necesitas instalar la librería de pygame con pip install pygame.

Nota 2: este juego está basado altamente en mi juego de Batalla naval con Arduino. Obviamente el juego del post actual es mucho más fácil que el otro.

Algoritmo general

Vamos a tener varias funciones que reciben y devuelven una matriz, y esa matriz representa el tablero de un jugador. Con este paradigma podemos tener una batalla naval de infinitos jugadores.

Al inicio vamos a llenar la matriz con una constante de mar, que será un espacio vacío. Y luego en las funciones vamos a modificar esa matriz ya sea para colocar los barcos, ver si todos los barcos están hundidos, etcétera.

Todo está dividido en funciones que tienen un propósito y nombre que te ayudarán a entender el código.

Iniciando constantes

Primero veamos las constantes que van a definir a los barcos, sonidos, filas, columnas, etcétera. Básicamente toda la configuración del juego:

Desde aquí puedes ver que estoy definiendo los tres tipos de “naves”: el submarino, el destructor horizontal y el destructor vertical.

También estoy iniciando los sonidos de PyGame que son para el disparo acertado y el disparo fallado.

Matriz inicial con mar

Al inicio vamos a tener un tablero que solo tiene mar, así que lo iniciamos así:

Colocando barcos

Se nos pide que coloquemos las naves de ambos tableros en posiciones aleatorias. Entonces necesitamos varias funciones que nos permitan calcular coordenadas aleatorias, comprobar si hay mar en determinada coordenada, etcétera.

Aquí las tenemos:

Básicamente estas funciones calculan coordenadas aleatorias, verifican que haya mar en esas coordenadas y colocan el barco en cuestión.

Como siempre existe la posibilidad de que ya haya un barco ahí, hacemos un ciclo while que solo se detendrá hasta que termine de colocar los barcos.

Por cierto, recuerda que debe haber suficiente espacio en el tablero, ya que si no, se hará un ciclo infinito al tratar de colocar los barcos.

Nota: la colocación está en la función colocar_e_imprimir_barcos.

Imprimiendo tablero

Imprimir tablero de batalla naval con Python
Imprimir tablero de batalla naval con Python

Una parte importante de este juego de Battleship en Python es la de imprimir el tablero.

Obviamente no le vamos a mostrar los barcos al jugador al menos que el juego haya terminado, así que si detectamos un barco no imprimimos su verdadero carácter.

Recuerda que las filas se identifican por letras, y las columnas por números, así que hice una función que aumenta una letra en Python.

Solicitar coordenadas y disparar

Solicitar coordenadas para disparar - Juego battleship con Python
Solicitar coordenadas para disparar – Juego battleship con Python

Hasta ahora ya estamos imprimiendo nuestro tablero de batalla naval pero no estamos dando la posibilidad de disparar.

Recuerda que esto es por turnos, así que en cada turno debemos recoger las coordenadas del jugador totalmente validadas:

Como puedes ver, la función va a devolver las coordenadas como números hasta que las mismas sean válidas. El usuario no puede ingresar coordenadas incorrectas o alguna letra incorrecta.

Ahora veamos la función que dispara. Esta función regresa un booleano indicando si el disparo fue exitoso:

Saber si jugador gana Battleship

Jugador gana la partida de batalla naval - Mostrar ubicación de barcos
Jugador gana la partida de batalla naval – Mostrar ubicación de barcos

Veamos la siguiente función que indica si un tablero ya tiene todos los barcos hundidos. Esto significa que toda la matriz está llena de disparos acertados o de mar:

Jugar

Finalmente llegamos a la parte de este juego programado con Python. Simplemente hacemos un ciclo que se romperá cuando el jugador acierte o pierda, y eso lo comprobamos en cada iteración.

Espero que el código se explique por sí mismo:

Básicamente solicitamos el disparo dependiendo del jugador, disparamos, reproducimos el sonido, comprobamos si pierde o gana para ver si terminamos el juego, y si no se termina entonces le damos el turno al otro jugador para que se siga cumpliendo el ciclo.

Por cierto, no te mostré las funciones para reproducir los sonidos. Quedan así:

Poniendo todo junto

Jugando batalla naval - Juego programado con Python
Jugando batalla naval – Juego programado con Python

El código completo para descargar te lo dejo en GitHub. Es un simple archivo que más tarde puedes separar por módulos, pero lo dejo así por si lo actualizo más adelante.

Para terminar te dejo con más tutoriales, programas y juegos programados con Python.

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.

3 comentarios en “Batalla naval en Python – Programación de juego”

Dejar un comentario