Saltar al contenido principal

Boletín 305. Batallas en Risk (opcional)

En este boletín vamos a implementar una parte de uno de los juegos de mesa más famosos del mundo: el Risk. Concretamente programaremos las batallas.

Enunciado

En el Risk se conquistan territorios con una estrategia basada en dados. Las batallas comienzan cuando el atacante mueve un determinado número de tropas al territorio que desea conquistar.

La batalla se divide en oleadas. En cada oleada, el defensor debe lanzar un determinado número de dados. El número de dados que tira cada contrincante no puede ser mayor que el número de tropas disponibles, ni mayor que el número de dados disponibles.

Tras tirar los dados, cada bando ordena sus dados de mayor a menor y luego los alinean con los del enemigo.

Finalmente, para cada par de dados defensor-atacante, el atacante pierde una tropa si el valor de su dado es igual o menor que el valor del dado del defensor. En caso contrario, es el defensor quien pierde una tropa.

Cuando uno de los jugadores se queda sin tropas, pierde la batalla.

Veamos un ejemplo donde hay 3 dados disponibles, el defensor tiene 2 tropas y el atacante tiene 4 tropas. El defensor tira los dados y saca 4 y 5. El atacante tira tres dados y obtiene 3, 4 y 2. Ordenamos los dados y los emparejamos:

En este caso, 5 (defensa) es mayor que 4 (ataque) y 4 (defensa) es mayor que 3 (ataque). Es decir, la primera y segunda pareja de dados del defensor tienen un valor mayor o igual que el atacante, por lo que el atacante pierde dos tropas (quedaría con 2). El tercer dado del atacante se descarta ya que no está emparejado con ninguno del defensor. En la próxima oleada, el defensor deberá lanzar de nuevo 2 dados, y el atacante también. El juego terminaría cuando uno de los dos jugadores se quede sin tropas.

Implementa esta mecánica del Risk en Java. El número máximo de dados será de 3. Al comienzo del programa se pedirá el número de tropas del defensor y del atacante.

Cuando un jugador se quede sin tropas se indicará el ganador y se finalizará el juego.