Estoy escribiendo un simple juego de piedra, papel o tijera basado en consola como ejercicio. Sin embargo, la siguiente condición siempre se evalúa como verdadera.
if (playerselection === computerselection) { console.log('Draw!');He introducido varios comandos de console.log, así como puntos de interrupción para identificar si hay un problema con el alcance o una alteración en los parámetros; este no parece ser el caso. La selección de jugadores podría ser 'Roca', mientras que la selección de computadoras podría ser 'Tijeras' (ambos verificados durante la depuración) y, sin embargo, la condición se trata como verdadera y la consola muestra "¡Dibujar!". El código completo se muestra a continuación:
array = ['Rock', 'Paper', 'Scissors']; computerPlay(); userPlay(); evaluation(); function computerPlay() { computerselection = array[Math.floor(Math.random() * array.length)]; } function userPlay() { playerselection = prompt('Choose: Rock, Paper or Scissors', 'Choose it! NOW!!'); } function evaluation(playerselection, computerselection) { if (playerselection === computerselection) { console.log('Draw!'); } else if ( (playerselection == "rock" && computerselection == "scissors") || //All possible victories (playerselection == "paper" && computerselection == "rock") || (playerselection == "scissors" && computerselection == "paper")) { console.log("You win!"); } else { console.log("You lose)"); } }¿Cuál es la causa de que la primera condición if se evalúe como verdadera cada vez, incluso si console.log(playerselection === computerelection) se evalúa como falsa durante la depuración?
Algunas pistas.
En
function evaluation(playerselection, computerselection) {tiene una declaración de dos variables (locales) y las usa para la comparación.
Más tarde, llamas a la función
evaluation() sin algunos parámetros y Javascript toma un valor predeterminado de undefined , como para todas las demás variables declaradas sin valor.
Aquí el código con algunos cambios:
evaluation ,if ... else , Los datos en la array deben estar en minúsculas como entrada.
function computerPlay() { return array[Math.floor(Math.random() * array.length)]; } function userPlay() { return (prompt('Choose: rock, paper or scissors') || '').toLowerCase(); } function evaluation(playerselection, computerselection) { if (playerselection === computerselection) { console.log('Draw!'); return; } if ( playerselection === "rock" && computerselection === "scissors" || playerselection === "paper" && computerselection === "rock" || playerselection === "scissors" && computerselection === "paper" ) { console.log("You win!"); return; } console.log("You lose"); } const array = ['rock', 'paper', 'scissors']; evaluation(userPlay(), computerPlay());Aquí, ambas variables no están en el ámbito global y, por lo tanto, no son accesibles dentro de la función evaluar(). Esta es la razón por la cual ambos no están undefined dentro de evaluar () y satisfacen la condición if cada vez.
Intente definir ambas variables en el ámbito global como se muestra a continuación y elimine los parámetros de la declaración de función de evaluación ().
let computerselection = ""; let playerselection = ""; function evaluation() { //code stuff }