Desarrollo del juego Batalla Naval en Python
Clase 36 de 63 • Curso de Python
Resumen
En este proyecto, crearás un juego de Batalla Naval (Battleship) en Python, donde dos jugadores colocan sus barcos en un tablero y se turnan para atacar las posiciones del oponente hasta que uno de los jugadores hunda todos los barcos del otro. Sigue estos pasos detallados para construir el juego.
Paso 1: Define la Clase Ship
- Crea la clase
Ship
:- Define el constructor
__init__
que recibaname
ysize
como parámetros. - Agrega atributos:
self.name
,self.size
,self.positions
(una lista vacía para las posiciones del barco) yself.hits
(inicializado en 0).
- Define el constructor
- Método
place_ship
:- Este método coloca el barco en el tablero (
board
) según la posición inicial (start_row
,start_col
) y la dirección (direction
). - Verifica si el barco cabe en el tablero. Si no cabe, devuelve
False
. - Si la posición está libre (
' '
), almacena las posiciones en la listapositions
. Si no, devuelveFalse
. - Actualiza el tablero con el símbolo del barco (
self.name[0]
), almacena las posiciones enself.positions
, y devuelveTrue
.
- Este método coloca el barco en el tablero (
- Método
hit
:- Incrementa el contador
self.hits
. - Devuelve
True
si el número de impactos (self.hits
) es igual al tamaño del barco (self.size
), indicando que el barco ha sido hundido.
- Incrementa el contador
Paso 2: Define Clases Específicas de Barcos
-
Crea las subclases:
- Crea una clase
Destroyer
que herede deShip
y tenga un tamaño de 2. - Crea una clase
Submarine
que herede deShip
y tenga un tamaño de 3. - Crea una clase
Battleship
que herede deShip
y tenga un tamaño de 4.
class Destroyer(Ship): def __init__(self): super().__init__('Destructor', 2) class Submarine(Ship): def __init__(self): super().__init__('Submarino', 3) class Battleship(Ship): def __init__(self): super().__init__('Acorazado', 4)
- Crea una clase
Paso 3: Define la Clase Player
- Crea la clase
Player
:- Define el constructor
__init__
que recibaname
como parámetro. - Crea un tablero
self.board
de 10x10, representado por una lista de listas, inicializado con espacios en blanco' '
. - Crea una lista
self.ships
para almacenar los barcos del jugador. - Crea un segundo tablero
self.hits
para registrar los ataques.
- Define el constructor
- Método
place_ships
:- Crea instancias de
Destroyer
,Submarine
yBattleship
. - Para cada barco, pide al jugador que ingrese la fila, columna y dirección (H para horizontal, V para vertical) donde desea colocar el barco.
- Llama a
place_ship
para intentar colocar el barco. Si no es posible, solicita nuevamente la entrada del usuario.
- Crea instancias de
- Método
print_board
:- Imprime el tablero de juego para mostrar la posición actual de los barcos o los impactos.
- Método
attack
:- Solicita al jugador la fila y columna para atacar.
- Verifica si la posición es válida y si el ataque es un impacto o agua.
- Actualiza el tablero del oponente y el tablero de impactos del jugador en consecuencia.
- Si se impacta un barco, verifica si ha sido hundido.
- Método
all_ships_sunk
:- Devuelve
True
si todos los barcos del jugador han sido hundidos.
- Devuelve
Paso 4: Define la Clase BattleshipGame
- Crea la clase
BattleshipGame
:- Define el constructor
__init__
que inicialice dos jugadores (player1
yplayer2
).
- Define el constructor
- Método
play
:- Pide a cada jugador que coloque sus barcos en el tablero.
- Alterna turnos entre los jugadores para atacar el tablero del oponente.
- Finaliza el juego cuando todos los barcos de un jugador han sido hundidos, declarando al otro jugador como ganador.
Paso 5: Ejecuta el Juego
-
Crea una instancia de
BattleshipGame
y llama al métodoplay()
para iniciar el juego.game = BattleshipGame() game.play()
Al ejecutar el programa, los jugadores podrán colocar sus barcos en el tablero y se turnarán para atacar hasta que uno de los jugadores hunda todos los barcos del oponente, ganando así el juego.
Este proyecto te permitirá practicar la manipulación de listas, clases, métodos, y cómo gestionar la interacción entre varias clases en Python.
¡Diviértete creando tu propio juego de Batalla Naval!