Skip to content

Commit 2d8abb0

Browse files
committed
mouredev#42 - python
1 parent 3c4faf0 commit 2d8abb0

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import random
2+
from dataclasses import dataclass
3+
4+
def gen_values():
5+
while True:
6+
yield random.randint(0, 100)
7+
gen = gen_values()
8+
9+
def es_potencia_de_dos(n):
10+
return n > 0 and (n & (n - 1)) == 0
11+
12+
def gen_parejas(luchadores_con_poderes):
13+
# Creamos una lista de luchadores que aún no han sido emparejados
14+
disponibles = luchadores_con_poderes[:]
15+
parejas = []
16+
17+
while len(disponibles) > 1:
18+
# Elegimos dos luchadores aleatorios de la lista de luchadores disponibles
19+
luchador1 = random.choice(disponibles)
20+
disponibles.remove(luchador1) # Quitamos el luchador1 de la lista
21+
luchador2 = random.choice(disponibles)
22+
disponibles.remove(luchador2) # Quitamos el luchador2 de la lista
23+
24+
# Añadimos la pareja a la lista de parejas
25+
parejas.append((luchador1, luchador2))
26+
27+
return parejas
28+
29+
@dataclass
30+
class Luchador:
31+
nombre: str
32+
velocidad: int
33+
ataque: int
34+
defensa: int
35+
salud: int = 100
36+
37+
lista_luchadores = ["Goku", "Vegeta", "Piccolo", "Gohan", "Krillin", "Trunks", "Freezer", "Majin Buu"]
38+
luchadores_con_poderes = []
39+
40+
if not es_potencia_de_dos(len(lista_luchadores)):
41+
raise ValueError("El número de luchadores debe ser una potencia de 2.")
42+
43+
print("+"+"-"*16+"+")
44+
print("| Participantes: |")
45+
print("+"+"-"*51+"+")
46+
print(f"| {'Nombre':<10} {'|':<3} {'Velocidad':<11} {'|':<3} {'Ataque':<8} | {'Defensa'} |")
47+
print("="*52+"+")
48+
49+
for luchador in lista_luchadores:
50+
luchador_valores = Luchador(luchador, next(gen), next(gen), next(gen))
51+
luchadores_con_poderes.append(luchador_valores)
52+
print(f"| {luchador_valores.nombre:<10} {'|':<7} {luchador_valores.velocidad:<7} {'|':<5} {luchador_valores.ataque:<6} {'|':<4} {luchador_valores.defensa:<4} |")
53+
print("+------------+---------------+------------+---------+")
54+
55+
parejas = gen_parejas(luchadores_con_poderes)
56+
57+
print("\n+"+"-"*35+"+")
58+
print(f"| {'Parejas de batalla:':<34}|")
59+
print("+"+"-"*35+"+")
60+
for pareja in parejas:
61+
print(f"| {pareja[0].nombre:<10} {'|':<3} {'vs':<4} {'|':<3} {pareja[1].nombre:<9} |")
62+
print("+"+"-"*35+"+")
63+
64+
def batalla(luchador1, luchador2):
65+
print(f"\n\033[38;5;214m[!!] Inicia batalla: {luchador1.nombre} vs {luchador2.nombre}\033[0m")
66+
67+
# Determinar quién ataca primero
68+
atacante, defensor = (luchador1, luchador2) if luchador1.velocidad >= luchador2.velocidad else (luchador2, luchador1)
69+
70+
while luchador1.salud > 0 and luchador2.salud > 0:
71+
print(f"\nTurno de {atacante.nombre} atacando a {defensor.nombre}")
72+
73+
# Determinar si el ataque es esquivado
74+
if random.random() < 0.2:
75+
print(f"{defensor.nombre} esquiva el ataque!")
76+
else:
77+
# Calcular daño
78+
if atacante.ataque > defensor.defensa:
79+
dano = atacante.ataque - defensor.defensa
80+
else:
81+
dano = int(atacante.ataque * 0.1)
82+
83+
defensor.salud -= dano
84+
print(f"\033[31m[-] {defensor.nombre} recibe {dano} de daño. Salud restante: {defensor.salud} \033[0m")
85+
86+
# Cambiar roles para el siguiente turno
87+
atacante, defensor = defensor, atacante
88+
89+
ganador = luchador1 if luchador1.salud > 0 else luchador2
90+
return ganador
91+
92+
93+
def torneo(parejas_iniciales):
94+
95+
ronda = 1
96+
97+
print("\n¡Comienza el torneo!")
98+
99+
luchadores = [l for pareja in parejas_iniciales for l in pareja]
100+
101+
while len(luchadores) > 1:
102+
print(f"\n--- Ronda {ronda} ---")
103+
104+
# Usar las parejas iniciales en la primera ronda
105+
if ronda == 1:
106+
parejas = parejas_iniciales
107+
else:
108+
parejas = gen_parejas(luchadores) # Generar nuevas parejas en rondas siguientes
109+
110+
ganadores = []
111+
112+
for pareja in parejas:
113+
ganador = batalla(pareja[0], pareja[1])
114+
ganadores.append(ganador)
115+
print(f"\n\033[34m[!] Ganador de la batalla entre {pareja[0].nombre} y {pareja[1].nombre}: {ganador.nombre}\033[0m")
116+
117+
luchadores = ganadores
118+
ronda += 1
119+
120+
print("\n¡El torneo ha terminado!")
121+
print(f"\033[32m[+] El ganador del torneo es: {luchadores[0].nombre}\033[0m")
122+
123+
torneo(parejas)

0 commit comments

Comments
 (0)