Skip to content

Commit 5fb6d70

Browse files
authored
#32 - Python
Ejercicio #32 del Roadmap 2024
1 parent 21db668 commit 5fb6d70

File tree

1 file changed

+137
-0
lines changed
  • Roadmap/32 - BATALLA DEADPOOL Y WOLVERINE/python

1 file changed

+137
-0
lines changed
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
"""
2+
* EJERCICIO:
3+
* ¡Deadpool y Wolverine se enfrentan en una batalla épica!
4+
* Crea un programa que simule la pelea y determine un ganador.
5+
* El programa simula un combate por turnos, donde cada protagonista posee unos
6+
* puntos de vida iniciales, un daño de ataque variable y diferentes cualidades
7+
* de regeneración y evasión de ataques.
8+
* Requisitos:
9+
* 1. El usuario debe determinar la vida inicial de cada protagonista.
10+
* 2. Cada personaje puede impartir un daño aleatorio:
11+
* - Deadpool: Entre 10 y 100.
12+
* - Wolverine: Entre 10 y 120.
13+
* 3. Si el daño es el máximo, el personaje que lo recibe no ataca en el
14+
* siguiente turno, ya que tiene que regenerarse (pero no aumenta vida).
15+
* 4. Cada personaje puede evitar el ataque contrario:
16+
* - Deadpool: 25% de posibilidades.
17+
* - Wolverine: 20% de posibilidades.
18+
* 5. Un personaje pierde si sus puntos de vida llegan a cero o menos.
19+
* Acciones:
20+
* 1. Simula una batalla.
21+
* 2. Muestra el número del turno (pausa de 1 segundo entre turnos).
22+
* 3. Muestra qué pasa en cada turno.
23+
* 4. Muestra la vida en cada turno.
24+
* 5. Muestra el resultado final.
25+
"""
26+
from abc import ABC,abstractmethod
27+
from random import randint
28+
from time import sleep,time
29+
import logging
30+
31+
#Congiguración del nivel del log a mostrar
32+
logging.basicConfig(level=logging.DEBUG,
33+
format="%(asctime)s -- %(levelname)s: %(message)s",
34+
datefmt="%d/%m/%Y - %H:%M:%S")
35+
36+
#decorador para mostrar que función se ha ejecutado y cuando
37+
def time_decorator(function):
38+
def original_function(*args):
39+
result = function(*args)
40+
logging.debug(f"Se ha ejecutado la función \"{function.__name__}\"")
41+
return result
42+
return original_function
43+
44+
#CLASES ABSTRACTAS
45+
class AbstractCharacter(ABC):
46+
@abstractmethod
47+
def __init__(self):
48+
pass
49+
50+
@abstractmethod
51+
def attack(self):
52+
pass
53+
54+
class DeadPool(AbstractCharacter):
55+
def __init__(self,life:int = 0):
56+
self.name:str = "Deadpool"
57+
self.life:int = life
58+
self.strength:int = 100
59+
self.agility:int = 25
60+
61+
@time_decorator
62+
def attack(self):
63+
return randint(10,self.strength) #random entre 10 y 100 para determinar el ataque de Deadpool
64+
65+
class Wolverine(AbstractCharacter):
66+
def __init__(self,life:int = 0 ):
67+
self.name:str = "Wolverine"
68+
self.life:int = life
69+
self.strength:int = 120
70+
self.agility:int = 20
71+
72+
@time_decorator
73+
def attack(self):
74+
return randint(10,self.strength) #random entre 10 y 100 para determinar el ataque de Wolverine
75+
76+
class Battle():
77+
78+
def set_life(self,fighter:AbstractCharacter):
79+
while True:
80+
try:
81+
life = int(input (f"Dime los puntos de vida de {fighter.name} por favor: "))
82+
except:
83+
logging.warning("El dato introducido no es un número") #se controla que se introduzca un número válido
84+
print("Parece que has introducido algo que no es un número...")
85+
else:
86+
if life <= 0: #y también que los puntos de vida sean mayores a cero
87+
logging.warning("El número es cero o menor que cero")
88+
print("Por favor introduce un número positivo mayor que cero...")
89+
else:
90+
fighter.life = life #hasta que no se introduce un valor válido no sale del bucle
91+
break
92+
93+
def __hit(self,attacker:AbstractCharacter,defender:AbstractCharacter): #Función que ejecuta el golpe del atacante al defensor
94+
hit = attacker.attack() # devuelve el entero del golpe para calcular después si es crítico o no
95+
print(f"{attacker.name} golpea a {defender.name}") # en la función principal
96+
dodge_chance = randint(0,100)
97+
if dodge_chance <= defender.agility:
98+
logging.info(F"** {defender.name.upper()} ESQUIVA **")
99+
print(f"{defender.name} esquiva el ataque")
100+
else:
101+
print(f"Y hace {hit} puntos de daño")
102+
defender.life -= hit
103+
return hit
104+
105+
def battle(self,fighter_1:AbstractCharacter,fighter_2:AbstractCharacter,turn:int = 1): #función recursiva que recibe los dos atacantes y el turno (si no se recibe turno, se entiende que es el turno número 1)
106+
if fighter_1.life <= 0: # caso base 1: el combatiente 1 no tiene vida
107+
logging.info(f"Gana el combate {fighter_2.name}")
108+
print(f"¡¡FIN DE LA PELEA!! El ganador es {fighter_2.name}\n".upper())
109+
elif fighter_2.life <= 0: #caso base 2: el combatiente 2 no tiene vida
110+
logging.info(f"Gana el combate {fighter_1.name}")
111+
print(f"¡¡FIN DE LA PELEA!! El ganador es {fighter_1.name}\n".upper())
112+
else: #si no es ningún caso base, se simula el turno
113+
print(f"--- TURNO {turn} ---")
114+
hit = self.__hit(fighter_1,fighter_2)
115+
print(f"-- Vida restante de {fighter_1.name} {fighter_1.life}\n-- Vida restante de {fighter_2.name} {fighter_2.life}\n")
116+
turn += 1
117+
sleep(1)
118+
if hit == fighter_1.strength and fighter_2.life > 0:
119+
logging.info("** GOLPE CRÍTICO **")
120+
print(f"** Como ha sido un golpe crítico, {fighter_2.name} tiene que regenerarse y no puede atacar en el siguiente turno **\n")
121+
self.battle(fighter_1,fighter_2,turn) #si es crítico se llama a la misma función respetando el mismo orden de los combatientes
122+
else:
123+
self.battle(fighter_2,fighter_1,turn) #si no es crítico, se invierte el orden de los combatientes para que "pase el turno"
124+
125+
print("\nTe doy la bienvenida a la mas que esperada y ansiada pelea en la Tierra 10005 entre.... ¡¡¡¡DEADPOOL y WOLVERINE!!!\n")
126+
wade_wilson = DeadPool() #se crean los personajes con vida = 0
127+
logan = Wolverine()
128+
battle = Battle()
129+
battle.set_life(wade_wilson) #se setean los puntos de vida
130+
battle.set_life(logan)
131+
logging.info("Comienza la pelea")
132+
print("Todo listo... LFG!!\n")
133+
sleep(1)
134+
start_time = time()
135+
battle.battle(wade_wilson,logan) #se ejecuta la pelea
136+
end_time = time()
137+
logging.info(f"El combate ha durado {end_time-start_time:.4} segundos") # se muestra en el log cuántos segundos ha tardado en acabar la pelea

0 commit comments

Comments
 (0)