Héroes contra monstruos: un sistema de batalla para un juego de rol
Estás implementando un sistema de batalla para un juego de rol sencillo. Un héroe lucha contra varios monstruos, y debes determinar el resultado de cada escaramuza. El héroe y los monstruos comparten algunas estadísticas:
- HP o Health Points: la cantidad de daño que el personaje puede soportar. Si llega a 0 (o menos), el personaje muere.
- ATT o Attack: la capacidad ofensiva del personaje.
- DEF o Defense: la capacidad defensiva del personaje.
Tanto para el héroe como para el monstruo, el daño infligido se calcula restando la puntuación de defensa del oponente a la puntuación de ataque del atacante multiplicada por dos.
En cada ronda, el héroe ataca primero y su cantidad de daño se resta de los HP del monstruo. Si el monstruo sobrevive (HP > 0), es su turno de atacar. Si el héroe sobrevive (HP > 0), comienza una nueva ronda. El héroe también puede tener algunas POT, o Healing Potions, en su mochila: solo cuando sus HP sean iguales o menores que 10, se puede (y se debe) usar una poción para recuperar 10 HP al comienzo de una nueva ronda. Cuando el héroe se cura, no puede atacar, pero recibe solo la mitad del daño del ataque del monstruo. Cada poción se puede usar una sola vez y luego debe desecharse.
Dado un hash que contiene las estadísticas de los personajes (las que tienen el prefijo p son las estadísticas del héroe y las que tienen el prefijo m son las del monstruo), debes devolver una cadena:
- "Victory in x rounds" si gana el héroe.
- "Game Over in x rounds" si gana el monstruo.
(donde x es el número de rondas transcurridas)
Ejemplos
battle({
"pHP" => 12,
"pATT" => 10,
"pDEF" => 10,
"pPOT" => 0,
"mHP" => 20,
"mATT" => 6,
"mDEF" => 14
}) ➞ "Victory in 4 rounds"
# Hero's damage rate = (10 * 2) - 14 = 6
# Monster's damage rate = (6 * 2) - 10 = 2
# Round 1: mHP - 6 = 14, pHP - 2 = 10
# Round 2: No potions to use! mHP - 6 = 8, pHP - 2 = 8
# Round 3: mHP - 6 = 2, pHP - 2 = 6
# Round 4: mHP - 6 = -4 ... monster is dead
battle({
"pHP" => 10,
"pATT" => 10,
"pDEF" => 10,
"pPOT" => 2,
"mHP" => 10,
"mATT" => 8,
"mDEF" => 14
}) ➞ "Victory in 3 rounds"
# Hero's damage = 6, monster's damage = 6
# Round 1: mHp - 6 = 4, pHP - 6 = 4
# Round 2: Player uses a potion, heals 10 HP, receive half the monster damage, pHP = 11
# Round 3: mHP - 6 = -2 ... monster is dead
battle({
"pHP" => 12,
"pATT" => 7,
"pDEF" => 6,
"pPOT" => 2,
"mHP" => 30,
"mATT" => 8,
"mDEF" => 10
}) ➞ "Game Over in 5 rounds"
# Hero's damage rate = 4, Monster's damage rate = 10
# Round 1: mHP - 4 = 26, pHP - 10 = 2
# Round 2: Hero heals 10 hp, monster hit for 5 HP, pHP = 7
# Round 3: Hero heals 10 hp, monster hit for 5 HP, pHP = 12
# Round 4: mHP - 4 = 22, pHP - 10 = 2
# Round 5: No potions to use! mHP - 4 = 18, pHP - 10 = -8 ... hero is deadNotas
- El héroe ataca (o se cura) primero en cada ronda.
- Se debe usar una poción cuando los HP sean iguales o menores que 10, excepto en la primera ronda.
- Cuando el héroe usa una poción, no puede atacar al monstruo en esa misma ronda, pero puede defenderse del ataque del monstruo y recibe solo la mitad del daño.
- Recuerda desechar la poción después de usarla.