Академический Документы
Профессиональный Документы
Культура Документы
LENGUAJES DE PROGRAMACIÓN
CURSO 2012-2013
EL JUEGO DE HUNDIR LA
FLOTA
1. REQUISITOS DE LA PRÁCTICA
La práctica consiste en implementar el juego “Hundir la flota” para dos jugadores, de los
cuales uno será el ordenador.
Se trata de hundir los barcos de la flota del oponente antes de que el rival haga lo propio. Por
turnos alternativos los jugadores irán eligiendo casillas del tablero disponible y disparando.
Si el tiro da en el agua, pasará el turno y si acierta podrá escoger de nuevo una casilla.
Cada jugador dispondrá de una flota de 1 portaaviones (5 casillas), 2 acorazados (4 casillas),
2 fragatas (3 casillas) y 2 submarinos (2 casillas). Estos barcos se dispondrán en cualquier
posición que el jugador desee y con orientación horizontal o vertical (nunca diagonal).
La aplicación pedirá al jugador humano que coloque los barcos y comprobará que ninguno
se toque, es decir, que no ocupen casillas adyacentes. En este caso, se lo indicará al jugador y
le pedirá nuevas coordenadas.
La aplicación colocará de manera aleatoria los barcos del jugador ordenador. Habrá de
cumplir las mismas restricciones.
El juego acabará cuando el jugador o el ordenador hayan alcanzado a todos los barcos de su
oponente. Se debe implementar un mecanismo de abandono del juego en cualquier
momento por parte del jugador.
3. RESTRICCIONES DE LA PRÁCTICA
• El tablero de juego será de 10x10 casillas, aunque se deberá poder variar el tamaño
del tablero sin tener que modificar nada en el algoritmo, salvo el valor de la
constante ancho/alto.
• No se pueden colocar buques en diagonal.
• No se permiten barcos colocados en las casillas adyacentes a otro barco.
• En cada turno del jugador se mostrarán el tablero con los disparos que ha hecho, los
barcos hundidos (colocados en el tablero) y el estado de la flota (barcos a flote).
• La forma de representar los barcos en el tablero y los disparos fallidos queda a
criterio del alumno.
• Todo el proceso del juego en pantalla de mostrará en modo texto.
2
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
4. CONSIDERACIONES DE DISEÑO/IMPLEMENTACIÓN DE LA
PRÁCTICA
Basándome en el documento de Orientaciones las recomendaciones, he implementado 6
clases, de las cuales 3 son exigidas en dicho documento (Barco, Jugador y Ordenador), 1 es
necesaria para poner en marcha y jugar el juego (Hundir), y 1 me ha parecido conveniente
para separar y clarificar el proceso de establecimiento de las coordenadas (Coordenada).
Para las clases referidas a los jugadores he creado una clase genérica Jugador, de la cual son
herederas dos subclases, JugadorPersona y JugadorOrdenador.
3
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
5. DESCRIPCIÓN DE LAS CLASES IMPLEMENTADAS
a. CLASE “BARCO”
La clase Barco es la que gestiona las funcionalidades propias de los barcos, tanto del jugador
persona como del ordenador.
Atributos de la clase:
Métodos de la clase:
b. CLASE “COORDENADA”
La clase Coordenada es la que gestiona las distintas celdas dentro del tablero.
Atributos de la clase:
Métodos de la clase:
c. CLASE “JUGADOR”
La clase Jugador implementa las funcionalidades que son genéricas para ambos jugadores,
4
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
tanto el humano (JugadorPersona) como el ordenador (JugadorOrdenador).
Atributos de la clase:
Tipos ennumerados:
Mejoran la legibilidad del código porque nos permiten ahorrar líneas repetitivas en las que el
único parámetro que cambia es precisamente el ennumerado. En el caso de la clase jugador
los tipos que se han implementado son:
• Enumerado con el que se representan los distintos estados en que se puede encontrar
una casilla del tablero:
SinDisparar: No se ha realizado aún un disparo sobre la coordenada.
Agua: Se ha realizado un disparo y no se ha alcanzado un barco.
Tocado: Se ha realizado un disparo y se ha alcanzado un barco.
• Enumerado con el que se representan las distintas orientaciones que puede tomar un
barco:
vertical_arriba.
vertical_abajo.
horizontal_izquierda.
horizontal_derecha.
Invalido.
Métodos de la clase:
• Método “comprobarBarco”, que al colocar los barcos comprueba si un barco que parte
desde una posición inicial se toca con otro barco.
• Método “esCoordenadaCorrecta”, que indica si la coordenada es correcta y si se
encuentra dentro del tablero.
• Método “actualizaInformacion”, que refresca la información del tablero del jugador.
• Método “mostrarFlota”, que muestra la flota en “modo tablero”.
• Método “mostrarEstadoDisparosPorPantalla”, que proporciona en la pantalla el estado
de los disparos del jugador.
• Método “disparoNoRealizado”, que indica que no se ha disparado en la casilla a la que
se aplica.
• Método “barcoAlcanzado”, que indica si un miembro de la flota ha sido alcanzado.
• Método “flotaHundida”, que comprueba si toda la flota está hundida.
5
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
d. CLASE “JUGADORPERSONA”
La clase JugadorPersona hereda los métodos de la clase Jugador, y es la que implementa las
funcionalidades del jugador humano.
Atributos de la clase:
Métodos de la clase:
e. CLASE “JUGADORORDENADOR”
De la misma manera que la clase anterior, La clase JugadorOrdenador hereda los métodos de
la clase Jugador, y es la que implementa las funcionalidades del ordenador.
Atributos de la clase:
Métodos de la clase:
6
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
La que está a la derecha.
La inmediatamente inferior.
La que está a la izquierda.
Métodos de la clase:
7
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
Si no
Contenido= falso;
}
Devuelve Contenido;
}
}
8
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
Caso horizontal_izquierda{
Para (int i = 1; i < tamaño del barco; i++ ){ // Desplazar hacia la izquierda la x tantas
posiciones-1 como tenga el barco
Restar a la coordenada x 1 posición;
Generar coordenada del barco;
}
}
Caso vertical abajo{
Para (int i = 1; i < tamaño del barco; i++ ){// Desplazar hacia abajo la y tantas
posiciones-1 como tenga el barco
Sumar a la coordenada y 1 posición;
Generar coordenada del barco;
}
}
Caso vertical arriba{
Para (int i = 1; i < tamaño del barco; i++ ){// Desplazar hacia arriba la y tantas
posiciones-1 como tenga el barco
Restar a la coordenada y 1 posición;
Generar coordenada del barco;
}
Caso invalido{
Salir del caso;
}
Tanto para el jugador persona como el jugador ordenador tienen un procedimiento para
comprobar si el tiro ha sido acertado, y en este caso, repetir turno. En el caso del ordenador,
además, el orden de las consiguientes tiradas tras acierto vienen determinadas por las
condiciones iniciales de la práctica. Veamos ambos procedimientos:
Funcion Jugar{
…………….
Distintos métodos
……………….
// Turno jugador
Mostrar estado de los disparos del jugador en pantalla;
Mientras (no acaba partida) y (no acaba turno){
Introducir coordenada de disparo;
Comprobar si es correcta;
Comprobar que no se ha disparado antes en esta coordenada;
Si (no barco alcanzado){
Actualizar información del tablero;
Cambiar el estado de la coordenada a AGUA;
9
Memoria de la práctica curso 2012-2013:
“Hundir la flota”
Fin de turno;
{
Si (barco alcanzado){
Actualizar información del tablero;
Cambiar el estado de la coordenada a TOCADO;
Mostrar estado de los disparos del jugador en pantalla;
Pedir nuevo disparo;
Si (coordenada ya disparada) o (coordenada no valida){
Error;
}
}
}
Este procedimiento asegura que el ordenador repita tiro en caso de acierto siguiendo la pauta que
se exige en las condiciones iniciales, esto es:
La casilla inmediatamente superior a la de la tirada anterior.
La que está a la derecha.
La inmediatamente inferior.
La que está a la izquierda.
7. CONCLUSIONES
No puedo establecer mediciones del tiempo de respuesta en función del tiempo de ejecución, por
ser éste fuertemente dependiente de la interacción del jugador humano.
10