Всем отличного дня!
Мне было интересно, почему, если я уже выбрал «камень» (в const playerSelection), а компьютер выбрал «камень», он печатает мне, что «Компьютер выигрывает», или иногда печатает, что я выиграл игру, а не вничью. То же самое и с другим элементом в коде.
Что могло случиться, что результат игры также был случайным?
Вот мой код:
function computerPicks() {
let compChoices = ["rock", "paper", "scissors"] // let computer pick [rock, paper, scissors]
let randomizeChoice = Math.floor(Math.random() * compChoices.length) + 1 // randomize rock paper and scissors
if (randomizeChoice === 1) {
return "rock";
} if (randomizeChoice === 2) {
return "paper";
} if (randomizeChoice === 3) {
return "scissors";
}
}
console.info(computerPicks()); // view computer's choice
function playRound(playerSelection, computerSelection) {
if (playerSelection === "rock") {
if (computerSelection === "rock") {
return "It is a tie!!"
} else if (computerSelection === "paper") {
return "The computer wins!";
} else {
return "You win this game!";
}
}
else if (playerSelection === "paper") {
if (computerSelection === "paper") {
return "It is a tie!!"
} else if (computerSelection === "rock") {
return "The computer wins!";
} else {
return "You win this game!";
}
} else {
if (computerSelection === "rock") {
return "Computer wins!";
} else if (computerSelection === "paper") {
return "User wins!";
} else {
return "Draw!";
}
}
}
const playerSelection = "scissors"; // primary choice
const computerSelection = computerPicks(); // calls the randomized choices
console.info(playRound(playerSelection, computerSelection)); // print out the result
Я думаю, что это также рандомизация из-за того, как я вызвал рандомизатор или как он объявлен в функции computerPicks().
Добавьте возвращаемое значение по умолчанию в computerPicks
на случай, если ни один из операторов if не будет совпадать.
Всем спасибо, уже заработало! ^^
Ваша программа ведет себя не так, как ожидалось, потому что вы используете оператор '===' для сравнения строк. Оператор '===' является оператором строгого равенства, что означает, что он возвращает значение true только в том случае, если оба операнда относятся к одному и тому же объекту. В вашем случае «==» будет более подходящим, поскольку вы проверяете базовое равенство.
Если все строки являются литералами — я не вижу new String("I am a string object")
— тогда все они «примитивы» и ===
должны правильно приравниваться.
Вопрос был правильно ответил, так что это всего лишь предположение о том, какие изменения вы могли бы внести в свою игру, чтобы все упростить.
Работа со многими уровнями операторов if/else
может быть трудной для понимания, обслуживания и отладки.
Вы можете значительно уменьшить сложность, сохранив часть логики движка в объекте, который определяет, какие варианты лучше, чем какие (см. плохое имя whatBeatsWhat
).
// Explicit mapping of winning key (i.e. "rock") beating losing value (i.e. "scissors").
const whatBeatsWhat = {
rock: "scissors",
paper: "rock",
scissors: "paper",
}
// Derive computerChoices from keys of whatBeatsWhat.
const computerChoices = Object.keys(whatBeatsWhat)
function computerPicks() {
// Randomize rock paper and scissors.
let randomizeChoice = Math.floor(Math.random() * computerChoices.length)
// randomizeChoice will be one of [0,1,2] representing all possible indices of computerChoices.
return computerChoices[randomizeChoice]
}
function playRound(playerSelection, computerSelection) {
if (playerSelection === computerSelection) {
return "It is a tie!!"
}
// Check if playerSelection in whatBeatsWhat maps to computerSelection
// and if so, player has beaten computer.
if (whatBeatsWhat[playerSelection] === computerSelection) {
return "You win this game!"
}
// Undoubtedly, whatBeatsWhat[computerSelection] === playerSelection
return "The computer wins!"
}
const playerSelection = "scissors"
const computerSelection = computerPicks()
const result = playRound(playerSelection, computerSelection)
console.info(`${result} (${playerSelection} vs ${computerSelection})`)
Вы должны войти
computerSelection
вместо того, чтобы звонитьcomputerPicks()
во второй раз. Вы говорите ему выбрать дважды прямо сейчас, один раз, чтобы показать вам свой выбор, и еще раз с новым выбором, чтобы играть в игру.