Está en la página 1de 11

Deep Space Conquerors

Esta práctica trabaja

RA 4. Desarrolla programas organizados en clases analizando y aplicando los principios de


la programación orientada a objetos.

g) Se han definido y utilizado clases heredadas.

i) Se han definido y utilizado interfaces.

RA 7. Desarrolla programas aplicando características avanzadas de los lenguajes


orientados a objetos y del entorno de programación.

b) Se han utilizado modificadores para bloquear y forzar la herencia de clases y


métodos.

d) Se han creado clases heredadas que sobrescriban la implementación de métodos


de la superclase.

e) Se han diseñado y aplicado jerarquías de clases.

f) Se han probado y depurado las jerarquías de clases.

g) Se han realizado programas que implementen y utilicen jerarquías de clases.

h) Se ha comentado y documentado el código.

Esta práctica tiene un peso total de 1,425 puntos sobre la nota final del curso.
Vamos a implementar un pequeño juego de dados y cartas.

Tendremos una clase ​Dado​. Dicha clase tiene dos enteros que especifican:

● el número de caras del mismo


● la puntuación de la cara de menor valor

Por ejemplo, podríamos tener un dado de 4 caras que fueran los valores: 7, 8, 9 y 10.

Esta clase cumple con la interfaz ​ILanzable​, que obliga a tener que implementar un método
lanzar​, que obviamente, devolverá un número al azar entre el número mínimo y el máximo.
El número mínimo de caras del dado será de 4. Además, la interfaz define otros dos
métodos, ​getMin y​ ​getMax,​ que devolverán respectivamente el mínimo número posible, y el
máximo del dado.

Existen 3 dados diferentes:

● Dado A​: Un dado de 4 caras con valores del 2 al 5.


● Dado B​: Un dado de 12 caras con valores del 1 al 12.
● Dado C​: Un dado de 6 caras con valores del 10 al 15.

El tablero estará compuesto por una serie de ​planetas​. Cada planeta puede estar
desocupado o conquistado por un ​jugador​. Cada planeta tiene un número máximo de 10
minas y un número determinado de habitantes (incluso antes de que sea conquistado). No
hay un máximo de habitantes en el planeta. Además, cada planeta tiene asociadas al inicio:

● 5 unidades de piedra
● 4 unidades de hierro
● 2 unidades de combustible
● 30 habitantes

Los planetas deberán poder imprimirse por pantalla:

● Nombre del planeta


● Si está conquistado o no y por quién
● Número de habitantes
● Materias primas en el planeta
● Minas actuales: de qué tipo y cuánto minan cada turno
● Escudo protector. Si tiene, deberá mostrar los puntos de defensa restantes.

Además, podremos obtener ​cartas​. Todas las cartas comparten un nombre y un precio,
pero no comparten nada más en común. Existen diferentes tipos de cartas:

● De ​materiales​. Dicha carta aporta materias primas al jugador: “Piedra”, “Oro”,


“Hierro” o “Combustible”. Cada carta aporta 1 punto del material que toque.
○ Las cartas de materiales son gratuitas.
● De ​naves​. Existen 3 tipos de naves distintas:
○ Naves de transporte​: transportan pasajeros de un planeta a otro. Dichas
naves implementarán la interfaz ITransportable, que definirá el método
transportar, que acepta un planeta destino y un número de personas. Al
comprar esta carta se utilizará el ​dado C para determinar la capacidad de
transporte.
○ Naves de carga​: transportan materiales de un planeta a otro. Es capaz de
transportar un número determinado de materiales de un planeta a otro. Este
número se determinará tirando el ​dado A al comprarse. Puede transportar
diferentes tipos de carga en un mismo viaje. Estas naves implementarán la
interfaz ITransportador, que definirá un método transportar, que aceptará
como parámetros un planeta destino, un array con las materias primas a
transportar, y un array con las cantidades que transporta de cada materia.
○ Naves de ataque​: atacan otras naves o planetas. Deberán implementar la
interfaz ​IAtacador​, que definen el método ​atacar​. Este método debe aceptar
un objeto que implemente la interfaz ​IAtacable​, que a su vez define el
método ​serAtacado​, que recibirá los puntos de ataque de la nave atacante y
los restará. Tienen un poder de ataque, que es el daño que restarán a las
demás naves o planetas a los que ataque.
■ Este poder de ataque por defecto es de 3.
○ Todas las naves implementan la interfaz IAtacable.
○ Todos los objetos que implementen la interfaz IAtacable deben a su vez
definir unos puntos de defensa y unos métodos ​getPuntosDefensa ​y
serAtacado,​ que recibirá los puntos de daño con los que le atacan.
○ Las naves tienen unos puntos de defensa diferentes según su tipo:
■ Las naves de transporte tienen 4 puntos de defensa.
■ Las naves de ataque tienen 7 puntos de defensa.
■ Las naves de carga tienen 4 puntos de defensa.
○ Las cartas de nave tienen un precio en unidades de oro. Dicho precio viene
dado por el tipo de nave:
■ Las naves de transporte cuestan 2 unidades de oro.
■ Las naves de ataque cuestan 5 unidades de oro.
■ Las naves de carga cuestan 3 unidades de oro.

● De ​construcciones​. Estas construcciones nos permitirán conseguir recursos o


defendernos de ataques:
○ Mina​: recolecta una cantidad de materias primas (supondremos que el
combustible es un mineral que también se puede minar). El jugador elegirá
qué tipo de material minará al recoger la carta. La puntuación obtenida al
lanzar el dado será la cantidad extraída en cada turno, excepto para el oro,
que siempre mina 2 unidades. Para ello, usaremos el ​dado A.​ Para poder
minar, necesita 10 personas en el planeta asociadas a dicha mina.
■ El oro es la única materia prima que no se asocia al planeta, sino al
jugador.
○ Escudo protector​: protege el planeta de ataques. Los escudos por defecto
tienen 20 puntos de defensa, a los que habrá que sumar los puntos
resultantes de lanzar el ​dado A.​ Además, deberán asociarse 15 personas al
escudo.
○ Las cartas de construcciones tienen un precio:
■ Las minas cuestan 1 punto de oro.
■ Los escudos protectores cuestan 5 puntos de oro.
○ Para poder construir en un planeta que no está conquistado por tí (ni por
nadie más), necesitas mover al menos a una persona.
○ Una vez que asignas personas a construcciones, no puedes deshacerlo, a no
ser que el escudo protector sea destruido. En dicho caso, las personas no
mueren sino que vuelven al total de habitantes “no asignados”.
○ Siempre hay cartas de construcciones disponibles para comprar, no como
con las naves, que hay sólo una determinada cantidad.

Todas las cartas definen los métodos ​getPrecio ​y getNombre,​ que no podrán ser nunca
redefinidos en las clases hijas. El precio de las cartas se mide en puntos de oro. Los
jugadores, tendrán que pagar ese oro (no hace falta que el oro vaya a ningún sitio, vale con
restarlo de sus reservas).

Los planetas implementan la interfaz IAtacable. Al ser atacado, en el caso de que cuente
con un escudo protector, tiene una probabilidad determinada de evitar cualquier daño: si se
saca el número más alto del dado o el más bajo, se esquivará el ataque. Para ello se
utilizará el ​dado B.​

● Si un escudo es atacado y sus puntos de defensa llegan a 0, el planeta se


considerará conquistado por el jugador atacante, y todos sus habitantes y minas
pasarán a formar parte del jugador atacante.
● Si el planeta es atacado y no posee escudo, se considerará conquistado.
● No es posible atacar un planeta que no esté conquistado por otro jugador.

Un ​jugador ​puede conquistar un planeta de dos formas:

● Si un jugador es el primero en mover al menos 1 persona al planeta y construir algo


en un planeta deshabitado (entiéndase, que no ha sido conquistado antes), el
planeta pasa a ser suyo, junto con sus habitantes y materias primas.
● Si un jugador ataca un planeta y logra destruir su escudo, el planeta pasa a ser suyo
también, junto con sus habitantes, construcciones y materias primas. Recuerda que
no puedes atacar un planeta desocupado.
● Las naves que estén orbitando el planeta ​no se conquistan​.
● Los jugadores tienen un nombre que los identifica.

Cada turno, el jugador podrá realizar 2 de las siguientes acciones:

● Opciones 1 y 2: Comprar cartas de naves o de construcción​. Para ello, deberá


utilizar sus puntos de oro.
○ Al comprar una carta de nave, el jugador debe asignarla inmediatamente a
un planeta concreto, que deberá obligatoriamente estar conquistado por él.
○ Al comprar una carta de construcción:
■ Si es una mina, se seleccionará el material y se tirará el dado para
averiguar cuántas unidades minará en cada turno.
■ Si es un escudo, se tirará el dado para añadir puntos extra de
defensa.
○ Esta carta se guardará en un mazo especial. Al construir, dicha carta se
asignará al planeta que se seleccione. Un planeta puede ser orbitado por 100
naves como máximo.
○ De cualquier manera, debe existir un método que retire dichas unidades de
oro del jugador.
● Opción 3: Coger una carta del mazo de materias primas​. Dichas cartas estarán
“boca abajo”. Supón que este mazo es infinito. Como ya se ha especificado, cada
carta aporta 1 punto de un material al azar. Supón igual probabilidad para todos los
materiales. Al comprar esta carta, el jugador debe asignarla inmediatamente a un
planeta concreto, excepto para el oro.
● Opción 4: Construir​. El coste de construir se especifica más adelante. Simularía
coger una carta del tipo de construcción correspondiente del mazo del jugador y
asignarla a un planeta en concreto. Para poder hacerlo, deberá cumplir los requisitos
de construcción.
● Opción 5: Mover una nave de un planeta a otro​.
○ No se puede mover al mismo planeta.
○ Si una nave está en un planeta A y el usuario quiere mover carga de otro
planeta B (suyo) a un tercer planeta C (también suyo), deberá gastar 2
turnos: uno para ir de A a B, y otro para cargar de B a C.
○ Las naves de carga no pueden cargar desde/hacia un planeta que no sea
propio.
○ Las naves de carga o transporte no pueden viajar a planetas conquistados
por otros usuarios (pero sí a planetas no conquistados).
● Opción 6: Atacar​. La nave debe estar en el mismo planeta que su objetivo. Hay que
tener en cuenta que si se ataca un planeta, existe una probabilidad de que el ataque
sea fallido.
● Opción 7: Transportar carga​. Mostrará las naves de carga que posee el usuario,
estén en el planeta que estén, y pedirá seleccionar una de ellas. Una vez
seleccionada, se mostrarán las cantidades de materias primas disponibles en el
planeta sobre el que orbita la nave. Se seleccionará el material y se preguntará
cuántas cantidades de dicha materia quiere transportar.
○ Si el usuario llega justo al máximo de la nave de carga, saltamos a la
siguiente pregunta.
○ Si el usuario se pasa de unidades, se avisará y se volverá a preguntar.
○ Si selecciona la opción 0, se cancelará la operación y no se le contará la
jugada, volviendo a mostrarse el menú.
○ Si el usuario no llega al límite de la nave todavía, volveremos a mostrar el
menú de materias, añadiendo una nueva opción “Navegar sin completar la
carga”, que permitirá mandar la nave aún cuando queden unidades libres en
la nave.

Por último, se preguntará a qué planeta desea enviar la carga. Se mostrará una lista
de todos los planetas no conquistados por los jugadores contrarios. Se añadirá una
opción 0 que cancelará la acción y volverá al menú principal sin contar la jugada.

● Opción 8: Transportar personas. Mostrará las naves de carga que posee el


usuario, estén en el planeta que estén, junto con el número de habitantes
“asignables” en el planeta y pedirá seleccionar una de ellas. Una vez seleccionada,
se preguntará cuántas personas se quiere transportar.
○ Si el usuario llega justo al máximo de la capacidad de la nave, saltamos a la
siguiente pregunta.
○ Si el usuario se pasa de personas, se avisará y se volverá a preguntar.
○ Si selecciona la opción 0, se cancelará la operación y no se le contará la
jugada, volviendo a mostrarse el menú.

Por último, se preguntará a qué planeta desea enviar a las personas. Se mostrará
una lista de todos los planetas no conquistados por los jugadores contrarios. Se
añadirá una opción 0 que cancelará la acción y volverá al menú principal sin contar
la jugada.

● Opción 9: Mejorar una nave​:


○ Si se mejora una nave de ataque, al daño actual que inflige se le suma el
poder de ataque por defecto.
○ Si se mejora una nave de carga, su capacidad de carga se multiplica por 2.
○ Si se mejora una nave de transporte, su capacidad de transporte de
pasajeros se multiplica por 2.
● Opción 10: Reparar​. Repara un objeto que implemente la interfaz IReparable.
● Opción 11: Mostrar la información de los planetas​ (no cuenta como jugada)
● Opción 12: Pasar turno​: el jugador decide no realizar nada. Perderá las acciones
que le resten del turno (es decir, puede no realizar ninguna acción o realizar una y
después pasar).
Un jugador sigue en la partida mientras no esté eliminado. Un jugador es eliminado cuando
ya no posea ningún planeta conquistado. Si el jugador se elimina, todas sus naves serán
eliminadas también.

Costes de reparación/mejora:

● Los objetos que sean reparables implementarán la interfaz ​IReparable​, que define el
método ​reparar,​ que sume a su defensa un número de puntos concreto.
● Los objetos que sean mejorables implementarán la interfaz ​IMejorable​, que define el
método ​mejorar.​
● Reparación de naves: se necesitan 3 unidades de hierro y 2 de combustible para
reparar 10 puntos de defensa.
● Mejora de naves: se necesitan 3 unidades de hierro, 2 de piedra y 2 de combustible.
● Reparación de escudo protector: se necesitan 2 de piedra, 2 de hierro y 3 de
combustible para reparar 15 puntos de defensa.

Costes de construcción:

● Construcción de una mina: se necesitan 2 unidades de hierro, 2 de piedra y 1 de


combustible. Además, deberán asociarse 10 personas a la mina.
● Escudo protector: se necesitan 5 unidades de piedra, 4 de hierro y 4 de combustible.
Además, deberán asociarse 15 personas al escudo.

Nota importante: para construir o reparar cualquier elemento, es ​IMPRESCINDIBLE ​que las
materias primas necesarias estén en dicho planeta. Recuerda que las naves también están
siempre orbitando un planeta.

Más información sobre el ​tablero​:

● Como ya hemos comentado, el tablero dispone de una serie de cartas de naves a la


venta. En cada momento sólo habrá 4 cartas disponibles. Si alguien compra alguna,
esa carta se repondrá, generando una nueva carta de tipo aleatorio. Considera que
hay un número infinito de cartas.
● Las cartas de construcción también son infinitas.
● Debe almacenar los ​jugadores ​que jueguen la partida. Para ello, antes de empezar
se deberá preguntar cuántos jugadores jugarán. Supón un mínimo de 2 y un máximo
de 4 jugadores.
● Debe permitir añadir jugadores uno a uno a la estructura que los almacena.

Inicio del juego:

1. Se inicializarán los planetas con sus correspondientes habitantes y materias primas.


2. Se solicitará el número de jugadores y los nombres de cada uno.
3. Se le asigna a cada jugador 3 puntos de oro.
4. Se decidirá quién empieza (puedes usar el código generado en la práctica de la
Oca) mediante el dado B.
5. Se mostrará la información de todos los planetas.
6. Se asignará aleatoriamente cada jugador a un planeta base.

Al final de cada ronda:

1. Las minas generarán los materiales indicados.


2. En cada planeta nacen 2 personas más, que directamente pueden ser asignadas
(para no complicar mucho, supón que incluso tras el último turno nace gente).
3. Se muestran los jugadores ​ordenados por su puntuación actual​. Considera dicho
orden como el orden natural.
4. Se muestran las rondas restantes si las hay. Si no quedan turnos, o alguien ha
eliminado a los demás jugadores, se acabará el juego.

Debes crear las excepciones oportunas y controlar el flujo del código mediante dichas
excepciones.

Puntuación:

El juego consiste en conquistar todos los planetas o ser el jugador con mayor puntuación al
final de un número determinado de rondas. La puntuación se consigue:

● Cada planeta conquistado suma 10 puntos (No se guarda la puntuación de planetas


que fueron tuyos pero fueron conquistados después por otro jugador).
● Cada escudo protector en pié en tus planetas suma 3 puntos.
● Cada mina en tus planetas suma 2 puntos.
● Por cada 20 habitantes de la suma total de tus planetas sumas 1 punto. Nota
importante, si has mandado habitantes a un planeta pero al final el planeta no ha
sido colonizado, no se contarán dichos habitantes. Ejemplo, mando al planeta A 3
habitantes con la intención de conquistarlo, pero el juego acaba y no me da tiempo
de construir. Esos 3 habitantes no se contarán para el cálculo y se considerarán
perdidos.
● Por cada nave tuya que no ha sido destruida sumas 2 puntos.
● Cada punto de oro en tu poder suma 1 punto.
● Cada 3 puntos de cualquier otra materia prima suman 1 punto (no se suman
fracciones de puntos).

Puntos de la práctica que debes realizar.

Como ya se comentó en clase, no tienes que implementar todas las acciones. Tienes que
hacer:

● La acción comprar carta de nave.


● La acción comprar carta de construcción.
● La acción coger carta del mazo de materias primas.
● La acción atacar.
● La acción mover nave no es obligatoria, pero si se realiza correctamente aporta 0.5
puntos. Si dicho método se realiza pero no funciona correctamente, no sumará nada.
● El cálculo de la puntuación de cada jugador.
● El minado y nacimiento de personas al final de cada ronda.
● La comprobación, al final de cada JUGADA, de si el juego ha terminado.

Importante: Se deberá generar la documentación ​de todo el código en formato ​javadoc​.


Dicha documentación deberá estar en una carpeta del proyecto llamada doc, a la altura de
la carpeta src. Se entregará el proyecto de eclipse comprimido en formato zip con el
siguiente nombre:

nombreApellidos_practicaHerencia.zip

El profesor anunciará en clase la fecha de entrega. 7 días antes de la misma, se


establecerá el plazo de entrega para poder optar al 10. En ese día, se publicará el javadoc
de la práctica realizada por el profesor. A partir de esa fecha, la nota máxima a la que se
puede optar es un 7.
Consejos:

● Puedes comparar objetos con == si lo que buscas es comparar si es exactamente el


mismo objeto, es decir, la misma referencia.
● Genera los getters y setters, y los métodos toString.
● Crea excepciones para manejar el juego: una para valores no admitidos por los
métodos; una para cuando el jugador cancele en mitad de una acción y permita no
contar la jugada; otra cuando se dé una situación anómala en el juego y otra, por
ejemplo, cuando algo que sea atacable sea destruido. Te ayudarán después a tener
un código más claro y corto.
● Saca a un método todo aquello que sea susceptible de ser reutilizado.
● Crea una clase principal, que contenga un tablero, y que sea la única que muestra
cosas por pantalla (además de otras clases auxiliares que decidas crear).
● Puedes crear una clase auxiliar que recoja los datos del usuario del teclado. Así te
ahorrarías tener que escribir el mismo código muchas veces. Además, en esta clase
puedes crear métodos que validen si algo cumple con requisitos impuestos por tí,
como que el usuario introduzca un número entre dos valores posibles, o que escriba
algo que no esté en blanco, o que introduzca una cadena entre un array de posibles
valores. Todo esto sin tener que escribir el código una y otra vez.

Reducción de puntos:

● Si la práctica no funciona, la nota de cada criterio de evaluación se multiplicará por


0,5.
● Si la aplicación funciona pero existen uno o dos errores no manejados y la aplicación
provoca una excepción, la nota de cada criterio de evaluación se multiplicará por
0,75.
● Si el fichero entregado no cumple con los requisitos de entrega, la nota de cada
criterio de evaluación se multiplicará por 0,75.
● Por cada requisito no realizado, la nota de los criterios se reducirá en un 10% cada
vez.

También podría gustarte