Ya programamos lo básico para que el juego funcione. Pero es momento de hacer que el computador elija por si solo entre piedra, papel, o tijera. Necesito compartirte algunos fundamentos para que realices la práctica de hoy. Estos son:
El objeto “Math” en JavaScript
En JavaScript existen entidades llamadas “Objetos” que guardan dentro de ellas variables (que se llaman “propiedades” cuando viven dentro de un objeto) y funciones (que se llaman “métodos” cuando viven dentro de un objeto.
En este sentido, Math es un objeto especial en JavaScript que contiene dentro de él numerosas funciones y valores que son esenciales para hacer cálculos matemáticos, como el número PI o la función de redondear números decimales.
¿Cómo usar el objeto Math de JavaScript?
Debes escribir “Math” (atención a la “M” en mayúscula), luego un punto (”.”) y finalmente la propiedad o método que desees invocar.
Si deseas invocar un método, recuerda que debes escribir los paréntesis “( )” para que el método se ejecute.
Ejemplos de propiedades
Propiedades de Math
Para qué sirve
Math.PI
Cuándo el código se ejecuta, el navegador sustituye esto por el número PI.
Math.E
Cuándo el código se ejecuta, el navegador sustituye esto por la constante de Euler.
Ejemplos de métodos
Métodos de Math
Para qué sirven
Math.ceil()
Redondea hacia arriba el número decimal que esté entre los paréntesis, hasta convertirlo en un número entero.
Math.floor()
Redondea hacia abajo el número decimal que esté entre los paréntesis, hasta convertirlo en un número entero.
Math.round()
Redondea el número decimal entre paréntesis hacia el entero más cercano.
Math.random()
Retorna un número decimal aleatorio entre el 0 (incluido) y el 1 (excluido).
Prueba estos valores y métodos en la consola del navegador 🙂
¿Cómo declarar funciones en JavaScript?
Cuando encuentras un segmento de código que puede repetirse dentro del programa, o que ejecuta un proceso muy específico dentro de tu código, entonces lo ideal es encapsularlo en una función.
Hay varias formas de declarar una función. Pero la más básica de todas consiste en escribir la palabra reservada function, seguida de la función con sus parámetros entre paréntesis, y el bloque de código entre llaves { }.
Cuando ejecutas la función, esta ejecuta todo el código que insertaste dentro de las llaves { } cuando la declaraste. De este modo, puedes ejecutar la función tantas veces como necesites con solo declararla una vez.
Cuando la declaras, puedes indicar parámetros y usarlos dentro del bloque de código. Luego, cuando la ejecutes, esos parámetros se sustituirán con los valores que escribas entre paréntesis al momento de ejecutarla.
También puedes utilizar la palabra reservada return dentro del bloque de código de la función para que, al ejecutarla, recibas el valor que indiques luego de escribir return (ojo, cuando la función llega a un return, su ejecución se detiene. Los comandos que escribas después de un return no se van a ejecutar).
Haz algunos experimentos con esto en la consola antes de continuar 😉
Generando una elección aleatoria para el computador
Intentemos ahora emplear lo aprendido para hacer que la computadora elija piedra, papel o tijera por si sola. Para hacerlo, primero tenemos que entender cómo funcionaría el algoritmo que le permite hacer la selección, y luego tendríamos que introducirlo en nuestro código.
Algoritmo de selección aleatoria
Primero necesitamos generar un número aleatorio. Ya sabemos que Math.random() nos entrega un número aleatorio entre 0 y 1. Sin embargo, nuestro juego necesita un número aleatorio entre 3 y 1 para funcionar. ¿Se te ocurre cómo podrías crearlo con código?
Para lograrlo, la operación sería esta:
Math.random()*( max - min +1)+ min
Si consideramos que nuestro valor máximo es 3 y el mínimo es 1, esto nos garantiza que siempre obtendremos un número entre 3.9999’ y 1. Por lo tanto, solo tendríamos que meter todo dentro de un Math.floor() para obtener un valor aleatorio entre 3 y 1.
Por lo tanto, para conseguir que la computadora elija aleatoriamente, necesitaríamos el siguiente código:
//OBTENIENDO LA ELECCIÓN DEL COMPUTADORlet max =3;let min =1;let eleccionDelComputador =Math.floor(Math.random()*( max - min +1)+ min );
Introduce esto en tu código, y prueba a ver como funciona 🙂
Convirtiendo el algoritmo en una función
Ahora, ¿por qué no intentas convertir eso en una función? Te dejaré una posible solución aquí abajo para que compares, pero intenta hacerlo por tu cuenta antes de fijarte en ella 😉
//OBTENIENDO LA ELECCIÓN DEL COMPUTADORfunctionnumeroAleatorio(min , max){returnMath.floor(Math.random()*( max - min +1)+ min );}let eleccionDelComputador =numeroAleatorio(1,3);
Haz el cambio y prueba tu juego 😁 Sin embargo, ¿Crees que podrías escribir el mismo código en menos líneas? 🤔 No hablo de borrar espacios o líneas, hablo de emplear una lógica diferente para llegar al mismo resultado. Una que requiera menos pasos, y que aun así llegue al mismo sitio 🙂
Para el reto de hacer menos líneas de código tu que dé el mismo resultado, tienen que tener en cuenta que no siempre tienen que achicar el código y que quede un código que no se pueda entender.
Recuerden "Un buen programador no es el que hace menos líneas de código, es el que hace código que se pueda entender".
Aquí esta como yo achiqué el código.
Utilicé un booleano llamado "o", que en código se expresa "||".
Espero haya sido de ayuda mi comentario.
Excelente aporte!
Súper eficiente
¿Cómo se obtiene la fórmula con la clase Math?
Para geeks que les encanta saber más.
Supongamos que queremos números aleatorios entre 1 y 5:
Definimos nuestro rango:
En papel sería hacer 5 - 1= 4En nuestro código hacemos:
(max - min) _
Generamos un numero aleatorio con Math.random y lo multiplicamos por el rango anterior.
Recuerda que Math.random() devuelve un número aleatorio entre 0 (incluido) y 1 (no incluido)
Math.random()*(max - min) _
El mínimo resultado que obtendremos será 0 x 4 = 0
Por simplicidad supongamos que el máximo será 0.999 x 4 = 3.996
OjO -> Como Puedes ver, nos falta algo ya que queremos que el valor mínimo sea 1 y el máximo 5,
y si le quitamos los decimales a estos resultados el mínimo sería 0 y el máximo sería 4.
Para corregir el mínimo, podemos sumar al resultado final el límite inferior:
(Math.random()*(max - min))+ min _
El mínimo resultado que obtendremos será (0 x 4) + 1 = 1
El maximo resultado que obtendremos será (0.999 x 4) + 1 = 4.996
OjO -> De nuevo estamos en problemas porque si bien ahora el mínimo es 1, el máximo sigue siendo 4
Es evidente que en lugar de multiplicar 0.999 x 4, necesitamos generar algo para que el valor máximo sea 0.999 x 5
La única forma de hacerlo es que el Rango sea 5
Aquí surge la idea de sumar 1 al rango:
(Math.random()*(max - min +1))+ min _
RECAPITULEMOS:
El mínimo resultado que obtendremos será 0 x 5 + 1= 1
El maximo resultado que obtendremos será (0.999 x 5) + 1 = 5.995
Yay! Lo hemos conseguido...Gracias por leer hasta aquí
Gracias por el aporte, justo iba a preguntar si toda esa fórmula que mostraron era una especie de ley matemática o si había surgido de la lógica del profesor.
Excelente aporte, muchas gracias por la explicación, así tiene mucho sentido al analizar la formula.
👀 tu si tu, tambien te equivocaste escibiendo math.ramdon en el codigo y por eso no te salio xd tmr
es: Math.random
al principio, tuve 2 horas buscando de solucionar un error... estaba escribiendo "tittle" en vez de escribir "title" JAJAJAJAJA me encanta esta nueva carrera
ja,ja,ja x2 también en title lo coloque con doble tt :S
me costo entender pero nah como el explica me da hasta entender por que me dejo mi ex :´(
JAJAJA same thought
y la conclusión seria: el problema no es tu ex, eres tu
A veces mejor vivir en la ignorancia 🤣🤣
10 - Aleatoriedad
Math.floor() → Quita los decimales a cualquier numero. La clase es Math y el punto . trae la función floor()
Math.random() → Genera un numero aleatorio, con la función random() Nunca es 0 pero tampoco 1 ejem: 0.1545615
Para programar un Nro aleatorio en un rango:
Declarar el rango → min = 1 y max = 3
Generamos el Nro aleatorio invocando Math.random()
Ese Nro lo multiplicamos por (max-min+1)
A toda la expresión le quitamos los decimales con Math.floor()
Podemos convertir todo este bloque de código en una FUNCION con:
Las variables se declaran dentro del parametro
return → retorna la funcion,
Esta funcion se puede invocar las veces que quiera
function*nombre*(*parametro*){return}
<!DOCTYPEhtml><html><head><metacharset="utf-8"/><title>Piedra, papel o tijera</title><script> function aleatiorio (min, max) {
return Math.floor(Math.random() * (max - min + 1) + min)
}
// 1 es piedra, 2 es papel, 3 es tijera
let jugador = 0
let pc = aleatiorio(1,3)
jugador = prompt("Elije: 1 para piedra, 2 para papel, 3 para tijera ")
//alert("Elejista " + jugador)
if(jugador == 1) {
alert("Elejiste 🥌")
} else if(jugador == 2){
alert("Elejista 🧻")
} else if(jugador == 3){
alert("Elejiste ✂")
} else{ // Si elije otra opcion que no sea 1,2 o 3. mostrar:
alert("ELEJISTE PERDER!!")
}
// para saber que eligio la pc
if(pc == 1) {
alert("PC elije 🥌")
} else if(pc == 2){
alert("PC elije 🧻")
} else if(pc == 3){
alert("PC elije ✂")
} else{ // Si elije otra opcion que no sea 1,2 o 3. mostrar:
alert("PC ELIJE PERDER!!")
}
// COMBATE
// 1. verificar que no empatamos
if(pc == jugador) {
alert("EMPATE")
} else if(jugador == 1 && pc == 3){
alert("GANASTE")
} else if(jugador == 2 && pc == 1){
alert("GANASTE")
} else if(jugador == 3 && pc == 2){
alert("GANASTE")
} else {
alert("PERDISTE")
}
</script></head><body><h2>Piedra, papel o tijera</h2></body></html>
Gracias!!
Hola con tu comentario entendi un poco mejor solo que algo que no comprendo bien es porque se utiliza un +1
( Nro lo multiplicamos por (max-min+1) ) de donde sale? :(
Buenas Practicas
Simplificar codigo no es reducir las lineas solamente, tambien es aumentar su comprensión al ser leido.
Al final de esta clase a todos nos queda un codigo muy redundante en su logica y un poco largo, eso complica su lectura y comprensión, una buena practica al programar es evitar las redundancias.
¿Como lo hacemos?
Con las funciones, estas nos permiten encapsular codigo que vayamos a utilizar multiples veces, esto significa que no tendremos que escribir una sentencia una y otra vez, sino solo una vez reutilizando ese codigo solamente cambiando sus parametros.
Aqui mi ejemplo:
Vas a pasar mas tiempo leyendo codigo de otra persona que escribiendo codigo.
Excelente forma de hacerlo!!
Super cool! Aunque el mensaje de cuando es una opción disponible se vería algo raro
Siento que el jugador "PC" sabe lo que hace porque me ha ganado en 7 ocasiones seguidas :O
Jajaja
Me pasaba igual y no pude dejar de jugar hasta que le gané 3 veces seguidas
xd
No te rindas!! tu puedes ganar!!
😅 Bueno, Freddy dijo lo más comprimido posible.
Esta bonito... aunque falto la alerta donde dice que eligio cada uno.
moooooy bueno
Si eres de lo que fue trolleado por el factor "aleatorio" pensando que tu codigo estaba mal y resulta que tu codigo estaba bien solo que la pc tiro 10 veces seguidas el mismo valor, vení que te doy un abrazo xq me paso lo mismo!
a mi no me paso xd
Jajaja algo asi me paso a mi con Chrome, lo recontra revisé, lo abrí con opera y funciono, lo volví a abrir con Chrome y funciono!
De a poco le perdemos el miedo, ahora pensar a como reducir el código!
saludos
Si no les sale a la primera Recuerden que se trata más de leer código que de programar! 👌
No se por que, pero a veces PC elige números que no van del 1 al 3. Así que me voy a tener que poner a leer y encontrar que hice mal.
Buenas tardes, me he tomado la libertad de hacer el famoso juego de piedra, papel, tijeras, lagarto, spock que sale en la seri The big bang theory. Espero que esté todo bien:
<html>
<head>
<meta charset="utf-8" />
<title>Mi primera programada</title>
<script>
// 1 es piedra, 2 es papel, 3 es tijera
let jugador = 0
let pc = Math.floor(Math.random() * 5);
jugador = prompt("Elige: 1 para piedra, 2 para papel, 3 para tijera, 4 para lagarto y 5 para spock")
//Elección del jugadorif(jugador ==1){alert("Elegiste 🪨")}elseif(jugador ==2){alert("Elegiste 📋")}elseif(jugador ==3){alert("Elegiste ✂️")}elseif(jugador ==4){alert("Elegiste 🦎")}elseif(jugador ==5){alert("Elegiste 🖖")}else{alert("Elegiste 👹")}//Elección del ordenadorif(pc ==1){alert("El ordenador eligió 🪨")}elseif(pc ==2){alert("El ordenador eligió 📋")}elseif(pc ==3){alert("El ordenador eligió ✂️")}elseif(pc ==4){alert("El ordenador eligió 🦎")}elseif(pc ==5){alert("El ordenador eligió 🖖")}//Combateif(pc==jugador){alert("Empate") resultado="empate"}elseif(jugador ==3&& pc ==2|| jugador ==2&& pc ==1|| jugador ==1&& pc ==4|| jugador ==4&& pc ==5|| jugador ==5&& pc ==3|| jugador ==3&& pc ==4|| jugador ==4&& pc ==2|| jugador ==2&& pc ==5|| jugador ==5&& pc ==1|| jugador ==1&& pc ==3){alert("GANASTE") resultado ="victoria"}else{alert("PERDISTE") resultado ="derrota"}</script>
Hola, esta interesante. Pero ten en cuenta que si no le sumas +1 te va a dar resultados de 0 - 4.
let pc =Math.floor(Math.random()*5+1)
Con esto ya te tomaria del 1 - 5 como resultado :)
Muchas gracias por tu comentario, Miguel Ángel. Me ha servido para mejorar el código.
Sin darme cuenta estoy aprendiendo y jugando con JavaScript ** :3 **
eso es lo magico de javascript
Eso es lo cool de las programción
Se me apago el cerebro.. tengo que reiniciarlo jajajajajaja
Si eso x 2
en este capitulo a mi también se me apago XD
Con funciones se puede reducir el codigo un ejemplo de ello.
Fuaa!! q admin, no se me ocurrio hacer todo eso en una solal funcion
Necesito contexto, donde esta "function"
FUNCIONES
¡Estas le dan vida a JavaScript y a nuestro código!
Debemos usar la palabra function y luego el nombre de esta función. Luego paréntesis () seguido de llaves {}.
Entonces en la memoria se va a guardar esta función. Ese espacio tendrá el nombre que ya le asignamos.
Dentro de los paréntesis colocamos parámetros que son los datos que necesita nuestra función para procesarlos y devolver un resultado. La función puede funcionar sin parámetros, si no los necesita. Por ejemplo, la función random() (que viene por defecto en el navegador) no necesita parámetros para devolvernos un número decimal aleatorio, pero la función alert() necesita que le enviemos la cadena de texto que se va a mostrar en pantalla, o no saldrá nada.
**Dentro de las llaves ** escribimos la lógica de nuestro código. Podemos escribir funciones dentro de otras funciones y devolver el resultado usando la palabra return. Puede que la función no necesite devolver resultado y puede entonces no tener la palabra return.
Las llaves {} Se pueden ver en diferentes expresiones de JavaScript, y sirven para encerrar código. Se usa en las funciones, condicionales y siclos, y podemos llamar a todo lo que está dentro un Objeto. Mientras avances sabrás por qué.
Invocar a la función es muy sencillo.
Solo hay que escribir el** nombre** que le asignamos al espacio de memoria de la función seguido de ().
nombre()``` Y dentro de los paréntesis escribimos la información que necesita la función para procesarla.Cuando se coloca aquí esta información se le llama **argumentos**.Es necesario enviar _argumentos_ para que sean recibidos en los _parámetros_ de la función.
Con la menor cantidad de líneas posibles(solo reduje la condición del combate y simplifique las condiciones en una sola línea, también es otra forma de ver el código)
como saco ese signo no lo encuentro 😢😢
como haces para que te genere color como las cajas
Pasé una hora buscando porque no me salía
Había escrito "Match" en lugar de "Math"
jajajajajjajajajjaja me hiciste el día
Mira al menos no fue una hora buscando el error, darse cuenta que el codigo estaba correctamente bien y luego ver que no habias guardado el codigo JAJAJAJAJA
Math.floor(Math.random()*(max - min +1)+ min);
gracias por tu aporte .
Para volver a invocar una funcion en consola solamente presionen flecha arriba :)
Una pregunta, ¿como hago para borrar lo que he escrito sin salir y volver a abrir "inspeccionar"?
Aaron: busca el botón "Clear Console", tiene esta forma: 🚫
Saludos! :D
prendiendo de nuevo programación y la tercera es la vencida
yo llevo como cinco pero no me rindo
también es mi tercera pero esta vez me traje de combo a mi novia a estudiar para que me empuje si me quedo y me saque de la frustración cuando no entienda nada XD