Ya tienes la lógica del mokepon que selecciona el usuario para el combate. Ahora, debes preparar al mokepon enemigo para que esté listo para combatir y determinar al ganador de la pelea.
Preparando los ataques del enemigo
Declara dos variables, ataquesMokeponEnemigo para almacenar un arreglo con los ataques del enemigo seleccionado y otra variable ataqueEnemigo donde se guardarán los ataques aleatorios para el combate.
let ataquesMokeponEnemigo;let ataqueEnemigo =[];
Luego de que el jugador seleccione su mokepon a través de la función seleccionarMascotaJugador(), lanza la función seleccionarMascotaEnemigo() para ejecutar la misma lógica aleatoria para seleccionar un mokepon aleatorio y determinar sus ataques también de forma aleatoria.
Una vez esté lista la lógica de los ataques del mokepon seleccionado por el usuario, lanzaremos la función ataqueAleatorioEnemigo() para preparar los ataques del enemigo.
Con esta función, se selecciona un ataque aleatorio del mokepon enemigo para combatir contra los ataques del mokepon del jugador, cada vez que el mismo se selecciona un ataque.
La lógica para el combate está casi lista, tanto la lógica del mokepon y del usuario como el mokepon aleatorio. Solo resta un paso para finalizar la lógica de todo el combate de tu videojuego.
Yo ya no pude avanzar desde la clase anterior porque no me acepta el valor (e)
botones.forEach((boton) => {
boton.addEventListener('click', (e) => {
Hola!! yo cambié un poquito el código porque entiendo que si dejamos solo en random la elección del enemigo de la secuencia de ataques no se está considerando el personaje elegido por el mismo, es decir, si el enemigo elige por ejemplo Hipodoge, el random de la secuancia de ataques del enemigo solo debería formarse por 3 aguas, 1fuego y 1 tierra (cualquier combinación de estos 5 elementos). No se si estoy interpretando mal la solución que se propone, pero en todo caso dejo mi aporte de como lo implementé en mi código.
La variable** ataquePC** contiene los ataques del personaje elegido por el enemigo, luego lo que hice fue ordenar estos ataques en forma random con el método sort()
ataquePC.sort(()=>Math.random()-0.5**)**;
De esta forma, el enemigo solo podrá atacar con una secuencia que corresponda al personaje elegido por la pc.
hola paula, yo también me di cuenta que con la solución propuesta es indiferente la mascota del enemigo, la posibilidad de ataques es la misma en cualquier caso, yo intente buscar la forma de que las opciones de ataques dependieran de la mascota del enemigo pero no se como hacer para que una vez el enemigo use un tipo de ataque, este no pueda volver a ser usado como en el caso del jugador, ya que si el enemigo puede seguir lanzando su tipo de ataque, es muy probable que en la partida el enemigo lance 4 veces o 5 veces un mismo tipo de ataque, espero hacerme entender.
me pregunto si en tu solución propuesta el enemigo podrá repetir ataques, es decir, si el enemigo tiene el hipodoge una vez use 1 ataque de agua solo lo pueda usarlo 2 veces mas.
Hola Seba! Lo que hice yo fue directamente que la secuencia de ataques del enemigo se cargue completa, es decir, cargo los posibles ataques del enemigo (los que corresponden al mokepon seleccionado por la pc) y luego se reacomodan de manera random. Con lo cual las posibilidades de la secuencia solo son en base a los ataques cargados. La diferencia con la forma en la que se implementa en el curso es que, en mi caso, se genera la secuencia completa, y en el del curso se va cargando uno a uno.
Sinceramente no intenté hacerlo de ésta última forma ya que con la solución que se me ocurrió en un principio anduvo bien el juego. 😊
Los errores te hacen mas fuerte, yo despues de terminar las clases del profe diego:
posdata: buen trabajo¡¡
Solo aplica si no los cometes de nuevo XD.
Ja, ja, ja literalmente yo.
Aqui mi solucion para que se tome en cuenta la mascota del enemigo y para que sus ataques no puedan repetirse:
let newArray =[]functionselectEnemyPet(){let randomPet =randomNumber(0, mokepones.length-1); enemysPet.innerHTML= mokepones[randomPet].name; enemysAttack = mokepones[randomPet].attack;for(let ind in enemysAttack){ newArray.push(ind);}console.log(enemysAttack);};functionsetEnemyAttack(){console.log(newArray);let randomInd =randomNumber(0, newArray.length-1);let randomAttack;if(newArray.length<=1){ randomAttack = newArray[0];}else{ randomAttack = newArray[randomInd];}console.log(randomAttack);if(enemysAttack[randomAttack].name==="🔥"){ enemyAttackCounter.push("FUEGO");}elseif(enemysAttack[randomAttack].name==="🌊"){ enemyAttackCounter.push("AGUA");}elseif(enemysAttack[randomAttack].name==="🌱"){ enemyAttackCounter.push("TIERRA");} newArray.splice(randomAttack,1);console.log(enemyAttackCounter);};
NOTA: me tomo un laaarrrgo rato(horas) dar con la solucion, y estoy seguro que hay muchas soluciones posibles, asi que no te rindas y nunca pares de aprender!
genial, gracias!
increible :D
Espero poder tener la capacidad de aprender y aplicar las lógicas que ha venido haciendo el prof en estas últimas clases en otros proyectos sin ayuda
alamaye en este punto ya siento más dificil seguirle el paso al profe. Me detengo mucho a analizar y comprender pero ME ENCANTA :3
Tengo excactamente la misma sensacion!!
somos un gran grupo así 🙃 kjakjka
Un ligero cambio:
Sugiero que en vez de añadir un cambio de calor al botón después de ser seleccionado mejor sele agregue la propiedad disable, esto para evitar que vuelva a usar.
Muestro ejemplo:
Me funcionó para cada uno de los 5 botones que vaya usando, genial!! gracias
Es buena idea, para que no se vuelvan a seleccionar los botones. Aunque yo pondria el "disabled" en cada uno de los tres "if" porque así como está sólo me deshabilitó el de TIERRA.
no entiendo porque en las validaciones de las condicionales el coloca, 0,1 para fuego, 3,4 para agua y el resto para tierra.
teniendo en cuenta que mi numero aleatorio va de 0 a 4 quiere decir que ataque tierra solamente saldra si sale el 2? porque solo una opcion para tierra? porque dos opciones para fuego y para agua.
Tengo la misma duda.
Misma duda, todavía nadie respondió..
Veo a muchas personas con experiencia en los comentarios, dando soluciones que a veces nosotros los nuevos ni comprendemos jajajaja... Estoy haciendo el curso tal cual y como lo hace el profesor con el fin de entender lo máximo posible y luego de culminarlo pasar a una de sus rutas desde 0 :´).
Es verdad, sólo leo los comentarios en busca de ayuda pero me topo con comentarios de expertos que me desaniman por no poder comprender al 100 todos los conceptos XD.
pienso exactamente lo mismo!
hahaha pero que c...
Qué se hace en esta clase
Se asignan los ataques del enemigo, de manera aleatoria, guardándolo en un arreglo
Considerando los ataques que tiene el mokepón del enemigo
En la función ataqueAleatorioEnemigo() creo el siguiente código
// Variable que guarde un número (índice)let i =aleatorio(0, ataquesMokeponEnemigo.length-1)/* Se valida ataque asignado según índice y se guarda el nombre en el array ataqueEnemigo */if(ataquesMokeponEnemigo[i].nombre==='🔥'){ ataqueEnemigo.push('FUEGO')}elseif(ataquesMokeponEnemigo[i].nombre==='🌊'){ ataqueEnemigo.push('AGUA')}else{ ataqueEnemigo.push('TIERRA')}/// Se elimina ataque asignado a enemigo del arreglo ataquesMokeponEnemigoataquesMokeponEnemigo.splice(i,1)
creo que de todos los aportes que he visto por allí de como hacer para que el mokepon enemigo respete sus ataques asignado, tu código para mi fue el mas fácil de comprender, gracias. Sin ánimos de menospreciar el trabajo de los demás.
Creo que algo que pude confundir un poco, es que se están creando las funciones de manera implícita pero el hecho de que se defina allí, no significa que ocurra ahora mismo.
boton.addEventListener('click', (e) => { }
Esto significa que estoy creando una funcion sin nombre, por lo que solo se ven los parentesis, y estoy pasandole como parámetro "e", el cual es un objeto estandar del sistema y que estaba disponible en ese momento DENTRO de addEventListener... Entonces:
funcionSinNombre(e) se ejecutará correctamente, pero, no se puede llamar desde otro punto porque no tiene un nombre explícito... También puede resultar más dificil de depurar.
Me parece excelente como va el curso, pero hay conceptos que requieren práctica para que los más nuevos lo entiendan, y explicarlos un poquito podría potenciar su uso en la creatividad de todos. Yo soy nuevo en JavaScript, espero no equivocarme mucho y que les sea util.
A mi no me acepto el elemento (e) no entiendo porque, mi codigo esta igual al de el
Espero me puedas ayudar, muchas gracias
Muy importante conocer los tiempos y como trabajan los "listeners"
Mis secuencias solo son TIERRA, TIERRA, TIERRA, TIERRA sin importar que seleccione, Tengo el código tal cual, A este punto es bien difcil y no entiendo casi nada, solo quiero acabar el curso por ansiedad geez T_T
te puedo solucionar eso bro!
me paso lo mismo y un compañero coloco su solución en el video anterior era darle espacio de cada lado en los iconos de fuego y agua, busca en los comentarios del video anterior ahí esta exactamente en que parte del código debes hacer esa modificación
Cada vez que veo que comete un error y no le puedo decir, automaticamente entro en MOD ANSIEDAD
Jajaja
X2 jeje a menos que no sepa que existe la edición.
a mi me gusta que tengan algunos errores , te hace dar cuenta que hasta a los mejores les pasa y lo importante es buscar donde están y hallarles solución
Igual que algunos compañeros, me di cuenta que en la solución planteada por el profe no se tienen en cuenta los ataques del mokepon enemigo y si estos se repiten o no. Estuve intentando seguir la lógica de que una vez que elijamos un ataque, el enemigo elija un ataque también y así fue como me quedó.
Lo primero que hice fue crear un array global (enemyAttacks) para almacenar los números aleatorios que se convertirán en los ataques enemigos. Luego creé otro array global (enemySequence) en el que se almacena la secuencia de ataques enemigos ya transformados en emojis(los cuales he estado utilizando como ataques)
Luego, igual que el profe, declaré una variable y le agregué el número aleatorio entre 0 y 4 en este caso
Posteriormente utilicé el método includes para verificar si el número aleatorio randomAttack que se acaba de generar se encuentra en el array enemyAttacks.
if(enemyAttacks.includes(randomAttack)===false)
Si la condición no se cumple (false)(el ataque no se repite)
entonces se agrega el numero aleatorio randomAttack al array enemyAttacks y se genera un nuevo condicional en el cual comparamos al array que contiene los ataques del mokepon enemigo enemyMokeponAttacks en la posicion randomAttack(que tiene como valor un numero de ataque que no se ha repetido, por ejemplo el 2) en su .name (que tiene por nombre el emoji correspondiente) con los distintos ataques 🔥, 💧 o 🍃 y si coincide, el ataque será agregado al array que contiene la secuencia de ataques enemigos enemySequence. Luego llama a la funcion que compara los ataques para dar una victoria (la cual se encuentra rota ahora mismo)
Y por último, si la condición en la que comparamos si el número aleatorio que se generó al inicio de la función randomAttack nos da como resultado true quiere decir que el número aleatorio se repite dentro del array de ataques enemyAttacks y se repetiría el ataque, asi que no se realiza el .push sino que se llama nuevamente a la funcion para que empiece de nuevo y logre encontrar un número que no se repita
else{chooseEnemyAttack()}}
Intenté explicar lo mejor que pude, espero que les sirva de ayuda!
Quiero que sepas que me ayudaste un monton, un abrazo! ¡GRACIAS!
Amigo, muchísimas gracias, me sirvió un montón!
Saludos 💪
bro hay alguien en 2026?
Yo. Está fácil la clase, ¿No?
Presente!
Voy viendo 4 veces una a una: las clases de Js desde la 44 hasta la 57 y no encuentro un condenado error, incluso repasé el codigo en git y regrese a la clase 20.... ahora repasaré la clase 57, si no soluciono, ya me toca hacer todo el cuerso de nuevo
Hola, tengo un problema con mi codigo no me selecciona otro boton de ataque mas que el de tierra. Ya intente con varios metodos pero nada sirve. Les agradeceria la ayuda.
<// Funcion iniciar juegoconst sectionSeleccionarAtaque =document.getElementById("seleccionar-ataque")const sectionReiniciarJuego =document.getElementById("reiniciar")const botonMascotaJugador =document.getElementById("boton_mascota")const botonReiniciar =document.getElementById("boton-reiniciar")//seleccionar mascotaconst sectionSeleccionarMascota =document.getElementById("seleccionar-mascota")//seleccion mascota enemigoconst spanMascotaEnemigo =document.getElementById("mascota-enemigo")//Combateconst spanVidasJugador =document.getElementById("vidas-jugador")const spanVidasEnemigo =document.getElementById("vidas-enemigo")//Crear mensajeconst sectionMensajes =document.getElementById("resultado")const ataqueDelJugador =document.getElementById("ataque-del-jugador")const ataqueDelEnemigo =document.getElementById("ataque-del-enemigo")const contenedorTarjetas =document.getElementById("contenedorTarjetas")const contenedorAtaques =document.getElementById("contenedorAtaques")//Mensaje final//Arrays: se declara con "= []" y puede contener muchos valores independientemente de su tipo.let mokepones =[];let botones =[];//Variables globales: estas variables son accesibles para cualquiera de nuestras funciones. Las variables dentro de las funciones solo pueden ser usadas por esa funcion donde fueron creadas.let ataqueJugador =[];let ataqueEnemigo =[];let indexAtaqueJugador
let indexAtaqueEnemigo
let ataquesMokeponEnemigo
let opcionDeMokepones
let inputHipodoge
let inputCapipepo
let inputRatigueya
let inputLangostelvis
let inputTucapalma
let inputPydos
let mascotaJugador
let ataquesMokepon
let botonFuego
let botonAgua
let botonTierra
let spanMascotaJugador
let vidasJugador =3let vidasEnemigo =3classMokepon{constructor(nombre, imagen, vida){this.nombre= nombre
this.imagen= imagen
this.vida= vida
this.ataques=[]}}//-new- hace referencia a un nuevo objeto en una clase ya existente. Los valores deben ir en el orden en el que se indico en el constructor.let hipodoge =newMokepon("Hipodoge","./Assets/mokepons_mokepon_hipodoge_attack.webp",5)let capipepo =newMokepon("Capipepo","./Assets/mokepons_mokepon_capipepo_attack.webp",5)let ratigueya =newMokepon("Ratigueya","./Assets/mokepons_mokepon_ratigueya_attack.webp",5)let langostelvis =newMokepon("Langostelvis","./Assets/DALL_E_2022-12-06_18.23.04-removebg-preview.png",5)let tucapalma =newMokepon("Tucapalma","./Assets/DALL_E_2022-12-06_17.39.28-removebg-preview.png",5)let pydos =newMokepon("Pydos","./Assets/DALL_E_2022-12-06_18.22.03-removebg-preview.png",5)hipodoge.ataques.push({nombre:"agua💧",id:"boton_agua"},{nombre:"agua💧",id:"boton_agua"},{nombre:"agua💧",id:"boton_agua"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"tierra🌱",id:"boton_tierra"},)capipepo.ataques.push({nombre:"tierra🌱",id:"boton_tierra"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"agua💧",id:"boton_agua"},{nombre:"fuego🔥",id:"boton_fuego"},)ratigueya.ataques.push({nombre:"fuego🔥",id:"boton_fuego"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"agua💧",id:"boton_agua"},{nombre:"tierra🌱",id:"boton_tierra"},)langostelvis.ataques.push({nombre:"agua💧",id:"boton_agua"},{nombre:"agua💧",id:"boton_agua"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"tierra🌱",id:"boton_tierra"},)tucapalma.ataques.push({nombre:"agua💧",id:"boton_agua"},{nombre:"agua💧",id:"boton_agua"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"fuego🔥",id:"boton_fuego"},)pydos.ataques.push({nombre:"fuego🔥",id:"boton_fuego"},{nombre:"fuego🔥",id:"boton_fuego"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"tierra🌱",id:"boton_tierra"},{nombre:"agua💧",id:"boton_agua"},)mokepones.push(hipodoge, capipepo, ratigueya, langostelvis, tucapalma, pydos)functioniniciarJuego(){ sectionSeleccionarAtaque.style.display="none" mokepones.forEach((mokepon)=>{ opcionDeMokepones =` <input type="radio" id=${mokepon.nombre} name=Mascota />
<label class ="tarjeta-de-mokepon" for=${mokepon.nombre}>
<p>${mokepon.nombre}</p>
<img src=${mokepon.imagen} alt=${mokepon.nombre} >
</label>
` contenedorTarjetas.innerHTML+= opcionDeMokepones
inputHipodoge =document.getElementById('Hipodoge') inputCapipepo =document.getElementById("Capipepo") inputRatigueya =document.getElementById("Ratigueya") inputLangostelvis =document.getElementById("Langostelvis") inputTucapalma =document.getElementById("Tucapalma") inputPydos =document.getElementById("Pydos") spanMascotaJugador =document.getElementById("mascota-jugador")}) sectionReiniciarJuego.style.display="none" botonMascotaJugador.addEventListener("click", seleccionarMascotaJugador) botonReiniciar.addEventListener("click", reiniciarJuego)}functionseleccionarMascotaJugador(){ sectionSeleccionarMascota.style.display="none" sectionSeleccionarAtaque.style.display="flex"if(inputHipodoge.checked){ spanMascotaJugador.innerHTML= inputHipodoge.id mascotaJugador = inputHipodoge.id}elseif(inputCapipepo.checked){ spanMascotaJugador.innerHTML= inputCapipepo.id mascotaJugador = inputCapipepo.id}elseif(inputRatigueya.checked){ spanMascotaJugador.innerHTML= inputRatigueya.id mascotaJugador = inputRatigueya.id}elseif(inputLangostelvis.checked){ spanMascotaJugador.innerHTML= inputLangostelvis.id mascotaJugador = inputLangostelvis.id}elseif(inputTucapalma.checked){ spanMascotaJugador.innerHTML= inputTucapalma.id mascotaJugador = inputTucapalma.id}elseif(inputPydos.checked){ spanMascotaJugador.innerHTML= inputPydos.id mascotaJugador = inputPydos.id}else{alert("No seleccionaste tu mascota")}extraerAtaques(mascotaJugador)seleccionarMascotaEnemigo()}functionextraerAtaques(mascotaJugador){let ataques
for(let i =0; i < mokepones.length; i++){if(mascotaJugador === mokepones[i].nombre){ ataques = mokepones[i].ataques}}mostrarAtaques(ataques)}functionmostrarAtaques(ataques){ ataques.forEach((ataque)=>{ ataquesMokepon =` <button id=${ataque.id} class="boton-ataque Bataque">${ataque.nombre} </button>
` contenedorAtaques.innerHTML+= ataquesMokepon
}) botonFuego =document.getElementById("boton_fuego") botonAgua =document.getElementById("boton_agua") botonTierra =document.getElementById("boton_tierra") botones =document.querySelectorAll(".Bataque")}functionsecuenciaAtaque(){ botones.forEach((boton)=>{ boton.addEventListener("click",(e)=>{if(e.target.textContent==="fuego🔥"){ ataqueJugador.push("fuego")console.log(ataqueJugador) boton.style.background="#112f58"}elseif(e.target.textContent==="agua💧"){ ataqueJugador.push("agua")console.log(ataqueJugador) boton.style.background="#112f58"}else{ ataqueJugador.push("tierra")console.log(ataqueJugador) boton.style.background="#112f58"}ataqueAleatorioEnemigo()})})}functionseleccionarMascotaEnemigo(){let enemigoAleatorio =aleatorio(0, mokepones.length-1) spanMascotaEnemigo.innerHTML= mokepones[enemigoAleatorio].nombre ataquesMokeponEnemigo = mokepones[enemigoAleatorio].ataquessecuenciaAtaque()}functionataqueAleatorioEnemigo(){let ataqueAleatorio =aleatorio(0, ataquesMokeponEnemigo.length-1)if(ataqueAleatorio ==0|| ataqueAleatorio ==1){ ataqueEnemigo.push("fuego")}elseif(ataqueAleatorio ==3|| ataqueAleatorio ==4){ ataqueEnemigo.push("agua")}else{ ataqueEnemigo.push("tierra")}iniciarPelea()console.log(ataqueEnemigo)}functioniniciarPelea(){if(ataqueJugador.length===5){combate()}}functionindexAmbosOponentes(jugador, enemigo){ indexAtaqueJugador = ataqueJugador[jugador] indexAtaqueEnemigo = ataqueEnemigo[enemigo]}functioncombate(){for(let index =0; index < ataqueJugador.length; index++){if(ataqueJugador[index]=== ataqueEnemigo[index]){indexAmbosOponentes(jugador, enemigo)crearMensaje("Empate")}}if(ataqueJugador == ataqueEnemigo){crearMensaje("Empate")}elseif(ataqueJugador =="fuego"&& ataqueEnemigo =="tierra"){crearMensaje("GANASTE") vidasEnemigo-- spanVidasEnemigo.innerHTML= vidasEnemigo
}elseif(ataqueJugador =="agua"&& ataqueEnemigo =="fuego"){crearMensaje("GANASTE") vidasEnemigo-- spanVidasEnemigo.innerHTML= vidasEnemigo
}elseif(ataqueJugador =="tierra"&& ataqueEnemigo =="agua"){crearMensaje("GANASTE") vidasEnemigo-- spanVidasEnemigo.innerHTML= vidasEnemigo
}else{crearMensaje("PERDISTE") vidasJugador-- spanVidasJugador.innerHTML= vidasJugador
}revisarVidas()}functionrevisarVidas(){if(vidasEnemigo ==0){mensajeFinal("FELICITACIONES GANASTE!!!🎉🎉")}elseif(vidasJugador ==0){mensajeFinal("LO SIENTO; PERDISTE😿😿. VUELVE A JUGAR")}}functioncrearMensaje(resultado){let nuevoAtaqueJugador =document.createElement("p")let nuevoAtaqueEnemigo =document.createElement("p") sectionMensajes.innerHTML= resultado
nuevoAtaqueJugador.innerHTML= indexAtaqueJugador
nuevoAtaqueEnemigo.innerHTML= indexAtaqueEnemigo
ataqueDelJugador.appendChild(nuevoAtaqueJugador) ataqueDelEnemigo.appendChild(nuevoAtaqueEnemigo)}functionmensajeFinal(resultadoFinal){ sectionMensajes.innerHTML= resultadoFinal
botonFuego.disabled=true botonAgua.disabled=true botonTierra.disabled=true sectionReiniciarJuego.style.display="block"}functionreiniciarJuego(){location.reload()}functionaleatorio(min, max){returnMath.floor(Math.random()*(max - min +1)+ min)}window.addEventListener("load", iniciarJuego)>
Lograste resolverlo? Tengo el mismo error, siempre me devuelve el ataque Tierra
Resolviste el error? Tengo el mismo problema
y se supone que esto es programación básica, pero es muy interesante, por que hace que uno piense en las soluciones, aparte de que si uno pone atención hay otras cosas que se le puede agregar al codigo para que valla quedando mas pulido
piensa el 95% del tiempo en el problema 5% en la solución 😊
Sinceramente a este punto requiere bastante detenimiento entender que esta pasando, pero me emociona ver que el código funciona y todas las cosas que son posibles realizar.
Super F!
Se rompio mi codigo JS
Selecciono los ataques pero ninguno se registra y solo se queda alli el juego
Profe Diego ayudeeee
¿Podrías compartir el código y los errores de la consola, por fa?