forked from mouredev/hello-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path12.DragonBall.js
More file actions
137 lines (115 loc) · 4.17 KB
/
12.DragonBall.js
File metadata and controls
137 lines (115 loc) · 4.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
* EJERCICIO:
* ¡El último videojuego de Dragon Ball ya está aquí!
* Se llama Dragon Ball: Sparking! ZERO.
*
* Simula un Torneo de Artes Marciales, al más puro estilo
* de la saga, donde participarán diferentes luchadores, y el
* sistema decidirá quién es el ganador.
*
* Luchadores:
* - Nombre.
* - Tres atributos: velocidad, ataque y defensa
* (con valores entre 0 a 100 que tú decidirás).
* - Comienza cada batalla con 100 de salud.
* Batalla:
* - En cada batalla se enfrentan 2 luchadores.
* - El luchador con más velocidad comienza atacando.
* - El daño se calcula restando el daño de ataque del
* atacante menos la defensa del oponente.
* - El oponente siempre tiene un 20% de posibilidad de
* esquivar el ataque.
* - Si la defensa es mayor que el ataque, recibe un 10%
* del daño de ataque.
* - Después de cada turno y ataque, el oponente pierde salud.
* - La batalla finaliza cuando un luchador pierde toda su salud.
* Torneo:
* - Un torneo sólo es válido con un número de luchadores
* potencia de 2.
* - El torneo debe crear parejas al azar en cada ronda.
* - Los luchadores se enfrentan en rondas eliminatorias.
* - El ganador avanza a la siguiente ronda hasta que sólo
* quede uno.
* - Debes mostrar por consola todo lo que sucede en el torneo,
* así como el ganador.
*/
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
class Luchador {
constructor(nombre, velocidad, ataque, defensa) {
this.nombre = nombre;
this.velocidad = velocidad;
this.ataque = ataque;
this.defensa = defensa;
this.salud = 100;
}
reset() {
this.salud = 100;
}
}
function esPotenciaDe2(n) {
return n && (n & (n - 1)) === 0;
}
function dañoReal(ataque, defensa) {
if (defensa >= ataque) return Math.floor(ataque * 0.1);
return ataque - defensa;
}
function combate(luchador1, luchador2) {
luchador1.reset();
luchador2.reset();
console.log(`\n🔥 ${luchador1.nombre} VS ${luchador2.nombre}`);
let atacante = luchador1.velocidad >= luchador2.velocidad ? luchador1 : luchador2;
let defensor = atacante === luchador1 ? luchador2 : luchador1;
let turno = 1;
while (luchador1.salud > 0 && luchador2.salud > 0) {
console.log(`\n🔁 Turno ${turno}`);
console.log(`👉 Ataca ${atacante.nombre}`);
const esquiva = Math.random() < 0.2;
if (esquiva) {
console.log(`💨 ${defensor.nombre} esquivó el ataque`);
} else {
const daño = dañoReal(atacante.ataque, defensor.defensa);
defensor.salud -= daño;
console.log(`💥 Daño causado: ${daño}`);
console.log(`❤️ Salud de ${defensor.nombre}: ${Math.max(defensor.salud, 0)}`);
}
[atacante, defensor] = [defensor, atacante];
turno++;
}
const ganador = luchador1.salud > 0 ? luchador1 : luchador2;
console.log(`🏆 ¡Gana ${ganador.nombre}!\n`);
return ganador;
}
function torneo(luchadores) {
if (!esPotenciaDe2(luchadores.length)) {
console.log("❌ El número de luchadores debe ser potencia de 2 (4, 8, 16...)");
return;
}
let ronda = 1;
while (luchadores.length > 1) {
console.log(`\n====== RONDA ${ronda} ======\n`);
// Barajar luchadores
luchadores = luchadores.sort(() => Math.random() - 0.5);
const ganadores = [];
for (let i = 0; i < luchadores.length; i += 2) {
const ganador = combate(luchadores[i], luchadores[i + 1]);
ganadores.push(ganador);
}
luchadores = ganadores;
ronda++;
}
console.log(`🎉 El campeón definitivo es: ${luchadores[0].nombre.toUpperCase()} 🥇`);
}
// ⚔️ Luchadores de ejemplo
const luchadores = [
new Luchador("Goku", 90, 95, 70),
new Luchador("Vegeta", 85, 90, 75),
new Luchador("Gohan", 80, 85, 80),
new Luchador("Piccolo", 70, 78, 85),
new Luchador("Trunks", 75, 82, 70),
new Luchador("Freezer", 88, 93, 68),
new Luchador("Cell", 84, 89, 72),
new Luchador("Majin Buu", 60, 85, 95),
];
// 🧪 Iniciar torneo
torneo(luchadores);