Ya tenemos un juego funcional de piedra papel o tijera, pero ¿qué tal si lo cambiamos para que gane el mejor de tres partidas?
Fundamentos para la práctica
Antes de empezar a hacer modificaciones, repasemos los fundamentos que te permitirán hacerlo:
Operadores de comparación en JavaScript
Hay algunos operadores que te ayudarán a escribir condiciones en tu código:
Operador
Significado
==
Retorna “verdadero” si un lado es igual al otro (Ojo, NO distingue entre números y strings. Por lo tanto: 3 == “3” //verdadero).
===
Retorna “verdadero” si un lado es estrictamente igual al otro (Ojo, SÍ distingue entre números y strings. Por lo tanto: 3 === “3” //falso).
!=
Retorna "verdadero" si un lado es diferente del otro lado (Ojo, NO distingue entre números y strings. Por lo tanto: 3 != “3” //falso).
!==
Retorna "verdadero" si un lado es estrictamente diferente del otro lado (Ojo, SÍ distingue entre números y strings. Por lo tanto: 3 != “3” //verdadero).
&&
Funciona como un “y” en la condición. Te permite juntar varias condiciones y devuelve “verdadero” solo si todas se cumplen.
<
Devuelve “verdadero” si el valor a la izquierda es menor que el valor a la derecha.
<=
Devuelve “verdadero” si el valor a la izquierda es menor o igual que el valor a la derecha.
>
Devuelve “verdadero” si el valor a la izquierda es mayor que el valor a la derecha.
>=
Devuelve “verdadero” si el valor a la izquierda es mayor o igual que el valor a la derecha.
💡 También tienes el operador ||, que funciona como un “o” en la condición. Te permite juntar varias condiciones, y devuelve “verdadero” si alguna de ellas se cumple.
No pudimos incluirlo en la tabla por un problema técnico, pero sientete libre de usarlo también 👍
💡 Aquí te dejo un fragmento de código que puedes copiar y pegar en la consola del navegador. Solo cambia la condición y los operadores para que experimentes como funciona cada operador 👍
while es una instrucción en JavaScript (al igual que if) que te permite crear ciclos. Su estructura es la siguiente:
while( condición ){//Código a ejecutar mientras se cumpla la condición}
Por ejemplo:
while( diaDeLaSemana <6){irA( escuela ); diaDeLaSemana = diaDeLaSemana +1;}//El bloque de código se repetirá hasta que diaDeLaSemana = 6
anímate a experimentar un poco con esto, y luego acompáñame a realizar la práctica de hoy 😉
Cómo implementar ciclos en el juego de piedra, papel y tijera
Empecemos 😁
1. Agrega variables para contar las victorias
Primero agrega un par de variables que te permitan contar cuantas victorias, derrotas y empates ha acumulado el jugador. Y también necesitas modificar el juego para que el jugador los acumule con cada partida.
Para que el juego no se sienta tan largo vamos a detenerlo luego de 2 victorias o 2 derrotas. Así que es buena idea programar una función que le informe al jugador los resultados finales, y podrías agregar una segunda función que reinicie las variables para un próximo juego.
Intenta hacerlo por tu cuenta, y cuando termines compáralo con el ejemplo de aquí abajo 🙂
//FUNCIÓN PARA LAS ALERTASfunctionalertaDeElecciones(quienElije , eleccion){if( eleccion ==1){alert("El "+ quienElije +" eligió 🥌");}elseif( eleccion ==2){alert("El "+ quienElije +" eligió 📄");}elseif( eleccion ==3){alert("El "+ quienElije +" eligió ✂️");}else{alert("Hubo un error con la elección del "+ quienElije +" 🙃");}}//FUNCIÓN PARA GENERAR NÚMEROS ALEATORIOSfunctionnumeroAleatorio(min , max){returnMath.floor(Math.random()*( max - min +1)+ min );}//FUNCIÓN PARA DECIDIR EL GANADORfunctionquienGanaEntre(eleccionJugador , eleccionOponente){if( eleccionJugador == eleccionOponente ){alert("¡EMPATE! 🤼"); empates = empates +1;}elseif( eleccionJugador ==1&& eleccionOponente ==3){alert("¡GANASTE! 🥳"); victorias = victorias +1;}elseif( eleccionJugador ==2&& eleccionOponente ==1){alert("¡GANASTE! 🥳"); victorias = victorias +1;}elseif( eleccionJugador ==3&& eleccionOponente ==2){alert("¡GANASTE! 🥳"); victorias = victorias +1;}else{alert("PERDISTE... 😢"); derrotas = derrotas +1;}}//FUNCIÓN PARA NOMBRAR AL GANADOR FINALfunctionmostrarResultados(){alert("Has acumulado "+ victorias +" victorias, "+ derrotas +" derrotas y "+ empates +" empates.");if( victorias ==2){alert("TÚ eres el GANADOR");resetearVariables();}elseif( derrotas ==2){alert("EL COMPUTADOR es el GANADOR");resetearVariables();}else{alert("Hubo un error... 🙃");resetearVariables();}}//FUNCIÓN PARA RESETEAR VARIABLES DE VICTORIASfunctionresetearVariables(){ victorias =0; derrotas =0; empates =0;}//ELECCIÓN DEL JUGADORlet eleccionDelJugador =0;eleccionDelJugador =prompt("Elige: 1 para 🥌, 2 para 📄, 3 para ✂️");alertaDeElecciones("jugador", eleccionDelJugador );//ELECCIÓN DEL COMPUTADORlet eleccionDelComputador =numeroAleatorio(1,3);alertaDeElecciones("computador", eleccionDelComputador );//DECIDIENDO EL GANADORlet victorias =0;let derrotas =0;let empates =0;quienGanaEntre( eleccionDelJugador , eleccionDelComputador );
2. Implementa el ciclo “while”
Es momento de implementar el ciclo en tu código. Para hacerlo, ten presente la siguiente información:
El juego se detiene cuando el jugador acumule dos victorias o dos derrotas.
La elección del jugador y del computador debe repetirse en cada ciclo.
Al completar el ciclo, debes mostrarle los resultados al jugador y resetear las variables de juego.
Hacer esto requiere que muevas algunas cosas dentro del código. Intenta hacerlo por tu cuenta, y luego lo comparas con el código aquí abajo 😉
//FUNCIÓN PARA LAS ALERTASfunctionalertaDeElecciones(quienElije , eleccion){if( eleccion ==1){alert("El "+ quienElije +" eligió 🥌");}elseif( eleccion ==2){alert("El "+ quienElije +" eligió 📄");}elseif( eleccion ==3){alert("El "+ quienElije +" eligió ✂️");}else{alert("Hubo un error con la elección del "+ quienElije +" 🙃");}}//FUNCIÓN PARA GENERAR NÚMEROS ALEATORIOSfunctionnumeroAleatorio(min , max){returnMath.floor(Math.random()*( max - min +1)+ min );}//FUNCIÓN PARA DECIDIR EL GANADORfunctionquienGanaEntre(eleccionJugador , eleccionOponente){if( eleccionJugador == eleccionOponente ){alert("¡EMPATE! 🤼"); empates = empates +1;}elseif( eleccionJugador ==1&& eleccionOponente ==3){alert("¡GANASTE! 🥳"); victorias = victorias +1;}elseif( eleccionJugador ==2&& eleccionOponente ==1){alert("¡GANASTE! 🥳"); victorias = victorias +1;}elseif( eleccionJugador ==3&& eleccionOponente ==2){alert("¡GANASTE! 🥳"); victorias = victorias +1;}else{alert("PERDISTE... 😢"); derrotas = derrotas +1;}}//FUNCIÓN PARA NOMBRAR AL GANADOR FINALfunctionmostrarResultados(){alert("Has acumulado "+ victorias +" victorias, "+ derrotas +" derrotas y "+ empates +" empates.");if( victorias ==2){alert("TÚ eres el GANADOR");resetearVariables();}elseif( derrotas ==2){alert("EL COMPUTADOR es el GANADOR");resetearVariables();}else{alert("Hubo un error... 🙃");resetearVariables();}}//FUNCIÓN PARA RESETEAR VARIABLES DE VICTORIASfunctionresetearVariables(){ victorias =0; derrotas =0; empates =0;}//ELECCIÓN DEL JUGADORlet eleccionDelJugador =0;//ELECCIÓN DEL COMPUTADORlet eleccionDelComputador =0;//DECIDIENDO EL GANADORlet victorias =0;let derrotas =0;let empates =0;while( victorias <2&& derrotas <2){ eleccionDelJugador =prompt("Elige: 1 para 🥌, 2 para 📄, 3 para ✂️"); eleccionDelComputador =numeroAleatorio(1,3);alertaDeElecciones("jugador", eleccionDelJugador );alertaDeElecciones("computador", eleccionDelComputador );quienGanaEntre( eleccionDelJugador , eleccionDelComputador );}mostrarResultados();
Anímate a probarlo algunas veces y sientete orgulloso de lo que haz logrado 🥳 En el futuro te enseñaremos a crear un botón en tu sitio web que puedes configurar para que inicie el juego cuando alguien lo presione 🙂 Pero, mientras tanto, acompañame a aprender cómo funciona la estructura de archivos de un sitio web 😉
Algo que aprendí en esta clase es: cómo darme cuenta de mis errores en VSC.
Abajo a la izquierda nos muestra un alerta sobre un error y lo bueno es que nos dice en qué línea de código esta el mismo.
Seguramente muchos ya lo saben pero quería compartirlo porque me pasaba buscando en todo el código un error.
Saludos!
Cómo soy nuevo, no lo sabía, excelente dato Ariel
Siempre se aprende algo nuevo! Muy bien!
// COMBATEif(pc == jugador){alert("EMPATE")}elseif((jugador ==1&& pc ==3)||(jugador ==2&& pc ==1)||(jugador ==3& pc ==2)){ triunfos++alert("GANASTE")}else{ perdidas++alert("PERDISTE")}
Compañero como pegas el codigo y te quede con los colores y formatos del visual?
Hola Mauro, cuando hagas un comentario, dale click a este icono en las opciones del comentario: </> eso te creará uno espacio especial para que puedas poner tu código, saludos! :)
Freddy tiene razón repitan la clase hasta que aprendan!!! Les recomiendo que SI estén programando a la vez que Freddy
esoo es muy cierto yo lo hago a la par que freddy parando el video
++✨La velocidad a la que aprendes no importa, lo que importa es que aprendas
–Freddy++
✨La velocidad a la que aprendes no importa, lo que importa es que aprendas
--Freddy
Si te gusta resolver problemas, y al ver muchas veces que tu código no funciona y te dan ganas de entrar y revisar constantemente tu código hasta pulirlo al punto que no tengas ningún error y/o pulirlo al punto de tener la menor cantidad de código y sobretodo entender paso a paso que esta pasando en el flujo del código, leyendo, editando, borrando o agregando nuevas líneas, te lo aseguro, este mundo es para ti y seguro te espera grandes cosas.
me puede ayudar con mi codigo ya no se que hacer, me sale la eleccion del pc como "mal elegido" en el juego, no compite que hago?
😃
Hola! Se me ocurrió que si estamos hablando de matemática podemos restar las elecciones y evaluar el resultado, entonces reduje la líneas del combate a lo siguiente, y de paso agregué un contador para los empates:
Es importante no frustrarse si sienten que hay cosas que no entienden al principio. A veces toca dar un salto de fé, confiar en que lo que se escribe debe ser así, tambien repitan la clases cuantas veces necesiten, ¡repitan! ¡repitan!, no les de pena. Pausen el video, terminen de escribir ustedes en su propio computador y cuando ya estén a la par, continuen.
¡Excelente consejo, Ameth! Definitivamente una de las mejores maneras de retener lo que aprendemos es repasando, y por supuesto, poniéndolo en práctica.
Esto esta para enmarcarlo y ponerlo en nuestra área de trabajo.
Cuando un video de 10 minutos se vuelven 45 minutos XD
LIteral estuve 1:30 resolviendo el problema jajajaja
jajajaja, literal
AQUÍ UNA SOLUCIÓN!!
Perdónenme por usar operadores ternearios. AQUÍ 👈 dejo un documento para que sepan como usarlos. Son geniales!!
¿como se llama la extension para ver las lineas de colores en la izquierda? :O
Super cleeean. No conocía esa manera de reducir los condicionales.
"Repetir una clase no te hace débil, de hecho, te hace muy fuerte"
me encanto esa frase 😎
una manera que a mi me ha servido es veo y escucho el curso completo, luego repito todo el curso programado a la par que el maestro y haciendo pausas y revisando toodo y luego una vez con eso, repito otra vez el curso solo escuchando y ya enfocado en el proyecto personal referente al curso. Así siento que aprendo lo que esta pasando.
El curso o la clase?
'
Lo que dices es que ves el curso completo 3 veces ?
La primera vez prestas atención
La segunda vas progamando a la par
Y luego ves el curso por tercera vez
correcto?
Otra pregunta, cuando dices curso completo te refieres a todas las clases asi de seguido y luego repites el curso ya programando o como. Me parecio buena tu manera de estudiar pero queria tener eso claro. :D
Mi reduccion de codigo, aplicando lo explicado
<script>// Jugador , PC , combinaciones de Juegos//Piedra = 1 , Papel = 2 , Tijeras = 3//Forma Propia//El computador elige de forma aleatoria.//let computador = Math.floor(Math.random() * (3 * 1 + 1) + 1);//Forma Platzi// let min = 1; // let max = 3;// let computador = Math.floor(Math.random()* (max * min + min) + min); //Forma Platzi 2 - con funcionfunctionaleatorio(min, max){returnMath.floor(Math.random()*(max - min +1)+ min);}functioneleccion(jugada){let resultado ="";if(jugada ==1){ resultado ="🪨";}elseif(jugada ==2){ resultado ="📃";}elseif(jugada ==3){ resultado ="✂️";}else{ resultado ="MAL ELEGIDO";}return resultado;}functioncombate(pc, jugador){let desenlace ="";if(pc == jugador){ desenlace ="EMPATE 🤝";}elseif(jugador ==1&& pc ==3|| jugador ==2&& pc ==1|| jugador ==3&& pc ==2){ desenlace ="GANASTE 🏆"; triunfos++;}else{ desenlace ="PERDISTE 😣"; perdidas++;}return desenlace;}// 1 es piedra, 2 es papel, 3 es tijeralet jugador =0;let pc =0;let triunfos =0;let perdidas =0;while(triunfos <3&& perdidas <3){ pc =aleatorio(1,3); jugador =prompt("Elige: 1 para 🪨, 2 para 📰, 3 para ✂️");// alert("Elegiste " + jugador)alert("PC elige "+eleccion(pc));alert("Tú eliges "+eleccion(jugador));// COMBATEalert("Tu "+combate(pc, jugador));}alert("Ganaste "+ triunfos +" veces. Perdiste "+ perdidas +" veces.");</script>
muy bueno amigo
Está increíble, me gusto como agregaste los emojis para el resultado, gracias por el aporte.
Estoy segura que hay otras formas de hacerlo mas corto pero es lo mejor que pude hacer :)
<code>if(pc == jugador){alert("EMPATE")}elseif((jugador ==1&& pc ==3)||(jugador ==2&& pc ==1)||(jugador ==3&& pc ==2)){alert("GANASTE") triunfos = triunfos +1}else{alert("PERDISTE") perdidas = perdidas +1}
Muy bueno
Buena !
La funcion combate me quedo asi :
y dentro del while asi :
Hola Moni
Dentro de tu código hay un erro con el que sufrí por media hora para poder corregir yo también.
En la parte:
//combatealert(combate(pc,jugador))if(combate(pc,jugador)=="Ganaste!"){Goals+=1;}else{ lost +=1;}
Si lo dejas solo con else te va a sumar a las perdidas (lost) también los empates.
la forma de corregir eso podría ser con:
//combatealert(combate(pc,jugador))if(combate(pc,jugador)=="Ganaste!"){Goals+=1;}elseif(combate(pc,jugador)=="Perdiste!"){ lost +=1;}else"nulo"
Espero te sirva
Comparto mi codigo resumido :)
Agrego un pequeño tip que puede ser de utilidad,
escribir triunfos = triunfos + 1, es lo mismo que escribir
triunfos += 1
if(pc == jugador){alert('Empate')}elseif((jugador ==1&& pc ==3)||(jugador ==2&& pc ==1)||( jugador ==3&& pc ==2)){alert('Ganaste') triunfos +=1}else{alert('Perdiste') derrotas +=1}
Incluso puedes representarlo como >
triunfos++
Buenos días Juan! Me ha encantado la forma que has utilizado para solucionar el reto. Lo que si tengo una pequeña duda... He intentado replicar el código y me salen 3 errores: 1- Una de las llaves. 2- El primer || y por ultimo el else. Si tienes alguna idea o si puedes mandarme foto de tu código en vsc estaría mas que agradecido!
Yo les recomiendo que la primera vez que vean la clase busquen entender los conceptos que está explicando Freddy, más que tipear el código. Ya que a lo largo de sus carreras como programadores se pueden topar con distintas sintaxis pero los conceptos básicos van a seguir ahí :)
.
La segunda vez que vean la clase pueden buscar hacer memoria de lo que escribió Freddy y tipear pero ya van a tener clara la idea de lo que el programa debe hacer ;)
.
Espero que mi aporte pueda servirle a alguien, un saludo platzinautas!!
Ok, tengo que repetir ahora de la clase 1 a la 13 🤯💪
repetir, repetir y repetir...
¡Hazlo, Andrés! Cada quien aprender en ritmos distintos. Repasar es una de las mejores estrategias de aprendizaje. Habrá personas que lo capten más rápido y otras a las que les cueste mucho más que a ti. Por ello, no debemos frustrarnos.
Siempre recuerda, no es una carrera contra nadie. Se trata de mejorar y cada día ser una mejor versión de ti.
¡Nunca pares de aprender! 💚
Mi código :) :
//Num Aleatorioconstaleatorio=(min,max)=>Math.floor(Math.random()*(max-min +1)+ min)//ELECCION consteleccion=(jugada)=>{let resultado =""if(jugada ==1){ resultado ="Tijera ✌"}elseif(jugada ==2){ resultado ="Papel 🤚"}elseif(jugada ==3){ resultado ="Piedra ✊"}else{ resultado ="Elegiste mal amix"}return resultado
}let jugador =0;let pc =0;let triunfos =0;let perdidas =0;while(triunfos <3&& perdidas <3){ pc =aleatorio(1,3); jugador =prompt("Elige: 1 para tijera, 2 para papel y 3 para piedra")alert("PC elige: "+eleccion(pc))alert("Jugador elige: "+eleccion(jugador))if(jugador == pc){alert("EMPATE")}elseif((jugador ==1&& pc ==2)||(jugador ==2&& pc ==3)||(jugador ==3&& pc ==1)){alert("GANASTE") triunfos++}else{alert("PERDISTE") perdidas++}}alert("Tu ganaste "+ triunfos +" cantidad de veces. Y perdiste "+ perdidas +" cantidad de veces.")
Excelente aporte. 👌
hola, no entiendo porque utilizas Triunfos ++, que es lo que funciona con ese doble signo de suma "++".
hola, no di con el chiste, parece que tengo un problema de lógica de programación, repito clases y hago muchos intentos, siempre llego a este agujero negro, saben si existe algún otro curso que me refuerce esta parte de creación de funciones, parece que solo puedo entender los casos que desarrollamos en clase y no puedo generar nuevas soluciones a nuevos problemas.
Hola, Henry. 👋
Tranquilo. Es parte de un proceso. También me pasaba al principio. Me costaba identificar una forma adecuada de intentar resolver un problema, y justo es una habilidad que sigo desarrollando.
Te recomiendo la serie de cursos de Pensamiento Lógico, ya que abordan el proceso lógico para resolver problemas. Creo que te puede ser de utilidad.
Lo importante es que practiques constantemente y empieces con ejercicios simples para después llevarlo a problemas más complejos.
Nada, creo que necesito tomar este curso en otra plataforma o con otro tutor. por mas que intento superar este punto no puedo y me frustra mucho.
Una de las formas efectivas que tengo de aprender es prestar atención en el video, luego copiar exactamente lo que explica el video, pero, sin ver el video y preguntandome el porque escribo lo que escribo, me hizo falta ver al menos 3 o 4 veces los primeros videos hasta que ahora, lo entiendo, y lo puedo realizar sin ver el video! excelente curso y explicación, es cierto, platzi lo hace efectivo ♥