Estoy siguiendo un curso de JS para principiantes y la primera lección fue sobre cómo hacer un juego de "piedra, papel o tijera".
El instructor dijo algo acerca de que esta no era la forma más eficiente de determinar el ganador, pero en realidad no se refirió a cómo escribirlo. Todo lo que puedo pensar es usar la declaración Switch en lugar de if.
¿Alguien puede mostrarme cómo se debe hacer?
function getResult(){ if (computerChoice === userChoice) { result = "It's a draw"; } else if (computerChoice == "rock" && userChoice == "scissors") { result = 'You lost'; } else if (computerChoice == "rock" && userChoice == "paper") { result = 'You won!'; } else if (computerChoice == "paper" && userChoice == "scissors") { result = 'You won'; } else if (computerChoice == "paper" && userChoice == "rock") { result = 'You lost'; } else if (computerChoice == "scissors" && userChoice == "rock") { result = 'You won'; } else if (computerChoice == "scissors" && userChoice == "paper") { result = 'You lost'; } resultDisplay.innerHTML=result; }Gracias, Amin
Si asocia un número con cada opción posible, luego puede restarlos entre sí. Si no hay empate, solo quedan 2 opciones posibles (después del módulo), lo que le permite determinar de manera concisa quién ganó.
const choices = ['rock', 'paper', 'scissors']; for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { console.log(getResult(choices[i], choices[j])); } } function getResult(computerChoice, userChoice){ const desc = `Comp: ${computerChoice}, you: ${userChoice}: `; if (computerChoice === userChoice) { return desc + "It's a draw"; } const diff = (3 + choices.indexOf(computerChoice) - choices.indexOf(userChoice)) % 3; return desc + (diff === 2 ? 'You won' : 'You lost'); }Puedes crear un objeto que defina si tu movimiento es débil o fuerte contra otro.
Ver el siguiente código:
function getResult() { const weapons = { rock: { weakTo: 'paper', strongTo: 'scissors' }, paper: { weakTo: 'scissors', strongTo: 'rock' }, scissors: { weakTo: 'rock', strongTo: 'paper' } } if (weapons[userChoice].strongTo === computerChoice) { result = "You Won"; } else if (weapons[userChoice].weakTo === computerChoice) { result = "You lost"; } else { result = "It's a draw"; } resultDisplay.innerHTML = result; }Al resolver un problema como este, es bueno pensar primero en su modelo de datos. ¿Cómo crearía una estructura de datos que facilitara la respuesta a la pregunta que necesita responder?
Tal vez algo como:
const winsVs = { rock: 'scissors', paper: 'rock', scissors: 'paper' } Ahora winsVs.rock === 'scissors' lo que significa que la roca gana contra las tijeras.
Ahora tiene una condición si con solo los tres casos: empate, gane y pierda.
const winsVs = { rock: 'scissors', paper: 'rock', scissors: 'paper' } function getResult(computerChoice, userChoice) { let result if (computerChoice === userChoice) { result = "It's a draw" } else if (winsVs[computerChoice] === userChoice) { result = "You lost" } else if (winsVs[userChoice] === computerChoice) { // could also be just `else {` since only one option is left. result = "You won" } return result } console.log(getResult('paper', 'paper')) // It's a draw console.log(getResult('rock', 'paper')) // You won console.log(getResult('paper', 'rock')) // You lost