Skip to content

Commit 8a6ba03

Browse files
authored
Merge pull request #6597 from Rafacv23/#42
#42 - Javascript
2 parents 6e58019 + 8a39490 commit 8a6ba03

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
// Hecho por @Rafacv23 | https://github.com/Rafacv23 | https://twitter.com/rafacanosa | https://www.rafacanosa.dev
2+
3+
// Global constants
4+
const EVADE_CHANCE = 0.2
5+
const HEALTH = 100
6+
7+
class Fighter {
8+
constructor(nombre, velocidad, ataque, defensa) {
9+
this.nombre = nombre
10+
this.velocidad = this.checkAttribute(velocidad, "velocidad")
11+
this.ataque = this.checkAttribute(ataque, "ataque")
12+
this.defensa = this.checkAttribute(defensa, "defensa")
13+
this.salud = HEALTH // Inicialmente, todos tienen 100 de salud
14+
}
15+
16+
// ensure that the attribute are between 0 and 100
17+
checkAttribute(value, attribute) {
18+
if (value < 0 || value > 100) {
19+
throw new Error(`El valor de ${attribute} debe ser entre 0 y 100`)
20+
}
21+
return value
22+
}
23+
24+
attack(defender) {
25+
if (defender.salud === 0) {
26+
console.log(`${defender.nombre} ha perdido toda su salud`)
27+
return
28+
}
29+
30+
// calculamos si el defensor evita el ataque o no
31+
const evade = Math.random()
32+
33+
if (evade < EVADE_CHANCE) {
34+
console.log(`${defender.nombre} ha esquivado el ataque`)
35+
return
36+
}
37+
// Calcular el daño
38+
let damage
39+
40+
if (defender.defensa > this.ataque || defender.defensa === this.ataque) {
41+
damage = this.ataque * 0.1 // Recibe solo el 10% del ataque
42+
console.log(`${defender.nombre} bloquea gran parte del daño!`)
43+
} else {
44+
damage = this.ataque - defender.defensa // Full damage
45+
}
46+
47+
// Evitar que el daño sea negativo
48+
if (damage < 0) damage = 0
49+
50+
// Aplicar el daño al defensor
51+
defender.salud -= damage
52+
53+
console.log(
54+
`${this.nombre} ha atacado a ${defender.nombre} con ${damage.toFixed(
55+
2
56+
)} de daño`
57+
)
58+
console.log(`Salud restante de ${defender.nombre}: ${defender.salud}`)
59+
}
60+
61+
showInfo() {
62+
console.log(`Nombre: ${this.nombre}`)
63+
console.log(`Velocidad: ${this.velocidad}`)
64+
console.log(`Ataque: ${this.ataque}`)
65+
console.log(`Defensa: ${this.defensa}`)
66+
console.log(`Salud: ${this.salud}`)
67+
}
68+
}
69+
70+
const fighters = [
71+
new Fighter("Goku", 85, 95, 80),
72+
new Fighter("Vegeta", 80, 90, 85),
73+
new Fighter("Piccolo", 70, 75, 90),
74+
new Fighter("Gohan", 88, 92, 78),
75+
new Fighter("Trunks", 78, 88, 82),
76+
new Fighter("Kefla", 60, 90, 85),
77+
new Fighter("Freezer", 75, 85, 80),
78+
new Fighter("Cell", 83, 87, 90),
79+
]
80+
81+
function shuffleFighters(fighters) {
82+
for (let i = fighters.length - 1; i > 0; i--) {
83+
const j = Math.floor(Math.random() * (i + 1))
84+
;[fighters[i], fighters[j]] = [fighters[j], fighters[i]]
85+
}
86+
return fighters
87+
}
88+
89+
function drawFighters() {
90+
let round = 1
91+
92+
while (fighters.length > 1) {
93+
if (fighters.length === 2) {
94+
console.log(`\n--- Ronda Final ---`)
95+
} else {
96+
console.log(`\n--- Ronda ${round} ---`)
97+
}
98+
99+
// Shuffle fighters for random matchups
100+
shuffleFighters(fighters)
101+
102+
// Process battles in pairs
103+
for (let i = 0; i < fighters.length; i++) {
104+
const fighter1 = fighters[i]
105+
const fighter2 = fighters[i + 1]
106+
107+
console.log(
108+
`\n${fighter1.nombre} (Salud: ${fighter1.salud}) vs ${fighter2.nombre} (Salud: ${fighter2.salud})`
109+
)
110+
111+
// Decide who attacks first based on speed
112+
let attacker, defender
113+
if (fighter1.velocidad >= fighter2.velocidad) {
114+
attacker = fighter1
115+
defender = fighter2
116+
} else {
117+
attacker = fighter2
118+
defender = fighter1
119+
}
120+
121+
// Fight until one of them loses
122+
while (attacker.salud > 0 && defender.salud > 0) {
123+
attacker.attack(defender)
124+
if (defender.salud > 0) {
125+
defender.attack(attacker)
126+
}
127+
}
128+
129+
// Remove the defeated fighter
130+
if (attacker.salud <= 0) {
131+
console.log(`${attacker.nombre} ha sido eliminado`)
132+
console.log(`${defender.nombre} avanza a la siguiente ronda`)
133+
fighters.splice(fighters.indexOf(attacker), 1)
134+
} else if (defender.salud <= 0) {
135+
console.log(`${defender.nombre} ha sido eliminado`)
136+
console.log(`${attacker.nombre} avanza a la siguiente ronda`)
137+
fighters.splice(fighters.indexOf(defender), 1)
138+
}
139+
}
140+
141+
round++
142+
}
143+
144+
// The last remaining fighter is the winner
145+
if (fighters.length === 1) {
146+
console.log("\n¡El torneo ha terminado! El ganador/a es:")
147+
fighters[0].showInfo()
148+
}
149+
}
150+
151+
// function that sims the tournament
152+
;(function tournament() {
153+
if (
154+
(fighters.length & (fighters.length - 1)) !== 0 ||
155+
fighters.length === 0
156+
) {
157+
console.log("El número de luchadores debe ser una potencia de 2")
158+
return
159+
}
160+
drawFighters()
161+
})()

0 commit comments

Comments
 (0)