Skip to content

Commit b0240e8

Browse files
authored
Merge pull request #5396 from lesclaz/reto32-python
#32 - Python
2 parents ed593fa + e3d9750 commit b0240e8

File tree

1 file changed

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

1 file changed

+154
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# EJERCICIO:
2+
# ¡Deadpool y Wolverine se enfrentan en una batalla épica!
3+
# Crea un programa que simule la pelea y determine un ganador.
4+
# El programa simula un combate por turnos, donde cada protagonista posee unos
5+
# puntos de vida iniciales, un daño de ataque variable y diferentes cualidades
6+
# de regeneración y evasión de ataques.
7+
# Requisitos:
8+
# 1. El usuario debe determinar la vida inicial de cada protagonista.
9+
# 2. Cada personaje puede impartir un daño aleatorio:
10+
# - Deadpool: Entre 10 y 100.
11+
# - Wolverine: Entre 10 y 120.
12+
# 3. Si el daño es el máximo, el personaje que lo recibe no ataca en el
13+
# siguiente turno, ya que tiene que regenerarse (pero no aumenta vida).
14+
# 4. Cada personaje puede evitar el ataque contrario:
15+
# - Deadpool: 25% de posibilidades.
16+
# - Wolverine: 20% de posibilidades.
17+
# 5. Un personaje pierde si sus puntos de vida llegan a cero o menos.
18+
# Acciones:
19+
# 1. Simula una batalla.
20+
# 2. Muestra el número del turno (pausa de 1 segundo entre turnos).
21+
# 3. Muestra qué pasa en cada turno.
22+
# 4. Muestra la vida en cada turno.
23+
# 5. Muestra el resultado final.
24+
25+
import dataclasses
26+
from random import choice, randint
27+
import time
28+
29+
30+
# Representa un peleador.
31+
@dataclasses.dataclass
32+
class Fighter:
33+
34+
name: str
35+
min_damage: int
36+
max_damage: int
37+
evasion_possibilities: int
38+
health_regeneration: int
39+
life_points: int
40+
turns: int = 0
41+
attacks: int = 0
42+
max_damage_inflicted: int = 0
43+
min_damage_inflicted: int = 0
44+
damage_inflicted: int = 0
45+
46+
47+
# Representa un turno en la pelea.
48+
@dataclasses.dataclass
49+
class Turn:
50+
51+
number: int
52+
attacker: Fighter
53+
damage: int
54+
55+
# Representa la pelea
56+
class Fight:
57+
58+
def __init__(self, fighter_one: Fighter, fighter_two: Fighter) -> None:
59+
self.fighter_one = fighter_one
60+
self.fighter_two = fighter_two
61+
self.current_turn = Turn(1, choice([fighter_one, fighter_two]), 0)
62+
self.previous_turn = Turn(
63+
0,
64+
fighter_one if self.current_turn.attacker == fighter_two else fighter_two,
65+
0
66+
)
67+
68+
@property
69+
def fighter_attacker(self) -> Fighter:
70+
return self.fighter_one if self.current_turn.attacker == self.fighter_one else self.fighter_two
71+
72+
def __attempt_health_regeneration(self) -> None:
73+
health_generated = randint(0, self.fighter_attacker.health_regeneration + 1)
74+
if health_generated > 0:
75+
self.fighter_attacker.life_points += health_generated
76+
print(f"Se regenera y recupera {health_generated} puntos de vida.")
77+
78+
def __to_attack(self) -> int:
79+
damage_receiver = self.fighter_one if self.previous_turn.attacker == self.fighter_one else self.fighter_two
80+
self.current_turn.damage = randint(10, self.current_turn.attacker.max_damage + 1)
81+
if randint(1, self.previous_turn.attacker.evasion_possibilities) == 1:
82+
return 0
83+
else:
84+
damage_receiver.life_points -= self.current_turn.damage
85+
return self.current_turn.damage
86+
87+
def __switch_turn(self):
88+
proximo = self.previous_turn.attacker
89+
self.previous_turn = self.current_turn
90+
self.current_turn = Turn(self.previous_turn.number + 1, proximo, 0)
91+
92+
def comment_turn(self) -> None:
93+
if self.previous_turn.number == 0:
94+
print("Comienza la pelea!")
95+
96+
self.fighter_attacker.turns += 1
97+
98+
print(f"El atacante del turno {self.current_turn.number} es {self.fighter_attacker.name}.")
99+
100+
if self.previous_turn.damage == self.previous_turn.attacker.max_damage:
101+
print(f"Pero no ataca por recibir el daño máximo en el turno anterior.\n\n")
102+
self.__switch_turn()
103+
return
104+
else:
105+
self.__attempt_health_regeneration()
106+
damage_inflicted = self.__to_attack()
107+
if damage_inflicted == 0:
108+
print(f"{self.current_turn.attacker.name} ataca pero {self.previous_turn.attacker.name} logra esquivarlo.\n\n")
109+
else:
110+
print(f"{self.current_turn.attacker.name} ataca y provoca un daño de {self.current_turn.damage}.")
111+
self.fighter_attacker.damage_inflicted += damage_inflicted
112+
if damage_inflicted > self.fighter_attacker.max_damage_inflicted:
113+
self.fighter_attacker.max_damage_inflicted = damage_inflicted
114+
if damage_inflicted < self.fighter_attacker.min_damage_inflicted or self.fighter_attacker.min_damage_inflicted == 0:
115+
self.fighter_attacker.min_damage_inflicted = damage_inflicted
116+
print(
117+
f"Los puntos de vida actual de {self.previous_turn.attacker.name} son "
118+
f"{self.previous_turn.attacker.life_points if self.previous_turn.attacker.life_points > 0 else 0}.\n\n"
119+
)
120+
121+
self.fighter_attacker.attacks += 1
122+
if self.fighter_one.life_points > 0 and self.fighter_two.life_points > 0:
123+
self.__switch_turn()
124+
125+
126+
if __name__ == '__main__':
127+
128+
def print_fighter_statistics(fighter: Fighter) -> None:
129+
print(f"Estadisticas de {fighter.name}:")
130+
print(f"Total de daño infringido al rival :: {fighter.damage_inflicted} en {fighter.turns} turnos.")
131+
print(f"Ataque más poderoso :: {fighter.max_damage_inflicted} puntos.")
132+
print(f"Ataque más debil :: {fighter.min_damage_inflicted} puntos.")
133+
134+
deadpool_life_points = int(input("Introduzca los puntos de vida inicial para Deadpool: "))
135+
wolverine_life_points = int(input("Introduzca los puntos de vida inicial para Wolverine: "))
136+
137+
# Peleadores
138+
deadpool = Fighter("Deadpool", 10, 100, 5, 70, deadpool_life_points)
139+
wolverine = Fighter("Wolverine", 10, 120, 6, 70, wolverine_life_points)
140+
141+
# La pelea
142+
fight = Fight(deadpool, wolverine)
143+
144+
while fight.fighter_one.life_points > 0 and fight.fighter_two.life_points > 0:
145+
fight.comment_turn()
146+
time.sleep(1)
147+
148+
print(
149+
f"{fight.current_turn.attacker.name} es el ganador de la pelea! "
150+
f"Con {fight.current_turn.attacker.life_points} puntos de vida restantes.\n\n"
151+
)
152+
print_fighter_statistics(fight.current_turn.attacker)
153+
print()
154+
print_fighter_statistics(fight.previous_turn.attacker)

0 commit comments

Comments
 (0)