#javascript
#javascript
Вопрос:
Иногда, когда я ввожу «камень» в приглашении и нажимаю OK, консоль говорит «Пожалуйста, введите камень, бумагу или ножницы», даже если я действительно это сделал. Я считаю, что это связано с предложением else, я просто не уверен, что я сделал не так.
Кроме того, в других случаях, когда я ввожу «rock» в приглашении и нажимаю OK, в консоли ничего не происходит (оценка не добавляется). Ниже приведен снимок экрана
const playerSelection = ''
const computerSelection = computerPlay()
let computerScore = 0;
let playerScore = 0;
console.log(playRound(playerSelection, computerSelection))
function computerPlay(){
let values = ['rock', 'paper', 'scissors'],
valueToUse = values [Math.floor(Math.random()* values.length)];
return valueToUse;
};
function playRound(playerSelection, computerSelection) {
while(true){
playerSelection = prompt ('Pick your poison');
if (playerSelection.toLowerCase() === 'rock' amp;amp; computerPlay() === 'paper'){
computerScore = 1
console.log('Sorry! Paper beats Rock')
}
else if (playerSelection.toLowerCase() === 'rock'.toLowerCase() amp;amp; computerPlay() === 'scissors'){
playerScore = 1
console.log('Good job! Rock beats Scissors');
}
else
{
console.log('Please type Rock, Paper, or Scissors')
}
console.log (`User Selection: ${playerSelection.toUpperCase()} | Player Score: ${playerScore}
Computer Selection: ${computerSelection.toUpperCase()} | Computer Score: ${computerScore}`);
}
}
Комментарии:
1. вы не рассматривали случай, когда компьютер выбирает камень, а игрок выбирает камень, если это произойдет, сработает блок else
2. также вы можете удалить
'rock'.toLowerCase()
и сделать это просто'rock'
, так как строка'rock'
уже в нижнем регистре3. В чем смысл аргументов
playerSelection
иcomputerSelection
вplayRound
, когда вы повторно запрашиваете выбор пользователя и повторно запускаете выбор компьютера?4. Глядя на
playerSelection
объявление, кажется, что это константа, но внутри оператора while вы меняете ее значение! Должна быть переменная (var или let)!
Ответ №1:
Вы вызываете только computerSelection
один раз, в начале загрузки страницы:
const computerSelection = computerPlay()
Затем он продолжает использоваться только в журнале:
Computer Selection: ${computerSelection.toUpperCase()} |
Но ваши тесты вызываются computerPlay
снова, каждый раз создавая новые строки для компьютера:
if (playerSelection.toLowerCase() === 'rock' amp;amp; computerPlay() === 'paper'){
// function invocation ^^^^^^^^^^^^^^
computerScore = 1
console.log('Sorry! Paper beats Rock')
}
else if (playerSelection.toLowerCase() === 'rock'.toLowerCase() amp;amp; computerPlay() === 'scissors'){
// function invocation ^^^^^^^^^^^^^^
В дополнение к этому, вы не тестируете исчерпывающим образом каждую возможность для игры камень-ножницы-бумага (например, когда игрок выбирает что-то другое, кроме ‘rock’).
Для начала вызовите computerPlay
только один раз, затем используйте computerSelection
переменную:
if (playerSelection.toLowerCase() === 'rock' amp;amp; computerSelection === 'paper') {
computerScore = 1
console.log('Sorry! Paper beats Rock')
} else if (playerSelection.toLowerCase() === 'rock' amp;amp; computerSelection === 'scissors') {
Также обратите внимание, что нет особого смысла вызывать toLowerCase
то, что уже является строковым литералом в нижнем регистре — просто используйте обычную строку.
Ответ №2:
Вы можете обновить код следующим образом
- Удалите все ненужные объявления глобальных переменных.
- Удалите ненужные аргументы функции воспроизведения.
- Добавьте больше логики для других вариантов выбора игрока.
- Условие Nest для случаев выбора компьютера.
playRound();
function computerPlay(){
let values = ['rock', 'paper', 'scissors'],
valueToUse = values [Math.floor(Math.random()* values.length)];
return valueToUse;
};
function playRound() {
let playerSelection;
let computerSelection;
let playerScore = 0;
let computerScore = 0;
while(true){
playerSelection = prompt('Pick your poison').toLowerCase();
computerSelection = computerPlay();
if (playerSelection === 'rock') {
if (computerSelection === 'paper') {
computerScore = 1;
} else if (computerSelection === 'scissors') {
playerScore = 1;
}
} else if (playerSelection === 'paper') {
if (computerSelection === 'scissors') {
computerScore = 1;
} else if (computerSelection === 'rock') {
playerScore = 1;
}
} else if (playerSelection === 'scissors') {
if (computerSelection === 'rock') {
computerScore = 1;
} else if (computerSelection === 'paper') {
playerScore = 1;
}
} else {
console.log('Please type Rock, Paper, or Scissors');
continue;
}
console.log (`User Selection: ${playerSelection.toUpperCase()} | Player Score: ${playerScore}
Computer Selection: ${computerSelection.toUpperCase()} | Computer Score: ${computerScore}`);
}
}
Комментарии:
1. Спасибо. Из любопытства, что делает оператор continue?
2. Инструкция Hi @Parham Continue игнорирует остальные команды в блоке цикла и начинается снова с верхней части блока. В этом случае вам не нужно показывать компьютер / ваш счет, когда вы вводите неправильную строку.
Ответ №3:
Вот минималистская версия игры, полностью переписанная:
function game(){
var usr, u, c, g, score=[0,0],last="";
const words=["rock","paper","scissors"];
while(usr=prompt(last "nScore (you:computer): " score.join(":") "nYour choice:")) {
while((u=words.indexOf(usr.toLowerCase()))<0) usr=prompt("invalid choice, please enter again,none of: " words.join(", "));
c=Math.floor(Math.random()*3);
g=(3 u-c)%3; // who wins?
if(g) score[g-1] ;
last="you: " words[u] ", computer: " words[c] " --> "
["draw","you win!!!","you lost - sorry."][g];
}
}
game()