#javascript
#javascript
Вопрос:
Просто в качестве предисловия, я очень новичок в программировании, поэтому прошу прощения, если ошибка — это что-то простое, что я просто упустил из виду. Также заранее я знаю, что функция game сейчас в беспорядке, я скопировал ее в том состоянии, в котором она находится сейчас, после того, как я повозился с ней пару дней.
Я работал над проектом odin project rock paper scissors project, и хотя я разработал единственную функцию раунда, которая работает хорошо, я не смог заставить всеобъемлющую игровую функцию работать должным образом. Я попытался изменить синтаксис и подозреваю, что проблема связана с областью действия определенных переменных, но я пока не смог найти способ, который работает. Я также проводил исследования в течение последних нескольких дней, пытаясь выяснить, как это сделать, пока я оптимизировал один раунд, но я не смог найти запрос, который работал с настройкой моего кода.
Я поместил все в одну и ту же функцию, но, похоже, не могу заставить цикл работать должным образом, когда я это делаю, и я попытался вывести переменные из локального в глобальный масштаб, но безуспешно — как я уже упоминал, функция для одного раунда работает без ошибок и возвращает правильную строкунезависимо от результата, поэтому у меня есть подозрение, что ошибка действительно лежит где-то в переменной шкале, и я просто не смог ее точно определить.
Моя игровая функция, которая примерно в пятом или шестом исполнении не работает:
function game() {
let playerScore = 0;
let computerScore = 0;
let roundResult = computerPlay();
for (let counter = 0; counter <= 5; counter) {
computerPlay();
if (roundResult === 'You win, rock beats scissors' || roundResult === 'You win, paper beats rock.' || roundResult === 'You win, scissors beats paper.') {
playerScore;
} else if (roundResult === 'You lose, paper beats rock.' || roundResult === 'You lose, scissors beats paper.' || roundResult === 'You lose, rock beats scissors.') {
computerScore
}
if (playerScore > computerScore) {
return ('You win ' playerScore ' to ' computerScore '.');
} else if (playerScore < computerScore) {
return ('You lose ' computerScore ' to ' playerScore '.');
} else {
return 'It was a tie, you both won the same number of rounds.';
}
}
}
// and the single round (computerPlay) function that works fine:
function computerPlay() {
let playerInput = prompt('Enter your selection of rock, paper, or scissors.');
let playerTrimmed = playerInput.trim();
let playerSelection = playerTrimmed.charAt(0).toUpperCase();
let playerScore = 0;
let computerScore = 0;
if (playerSelection === 'R' || playerSelection === 'P' || playerSelection === 'S') {
let myArray = ['R', 'P', 'S'];
let computerSelection = myArray[Math.floor(Math.random() * myArray.length)];
if (playerSelection === 'R') {
if (computerSelection === 'S') {
playerScore;
return 'You win, rock beats scissors.';
} else if (computerSelection === 'P') {
computerScore;
return 'You lose, paper beats rock.';
} else {
return 'Tie.';
}
} else if (playerSelection === 'P') {
if (computerSelection === 'R') {
playerScore;
return 'You win, paper beats rock.';
} else if (computerSelection === 'S') {
computerScore;
return 'You lose, scissors beats paper.';
} else {
return 'Tie.';
}
} else if (playerSelection === 'S') {
if (computerSelection === 'P') {
playerScore;
return 'You win, scissors beats paper.';
} else if (computerSelection === 'R') {
computerScore;
return 'You lose, rock beats scissors.';
} else {
return 'Tie.';
}
}
} else {
//makes sure player entered a string starting with a valid letter (r, p, or s)
alert('Please make sure you enter a valid selection.');
}
}
game()
Комментарии:
1.
return
Оператор завершит выполнение функции, даже если она находится внутри цикла, дальнейшие итерации цикла выполняться не будут. Такимgame()
образом, цикл функции будет выполняться только один раз, а затем возвращать строку. Возможно, вы захотите переместить этуplayerScore > computerScore
проверку из (и после) цикла.2. Вы можете избежать всех ужасов «если-то», определив выигрышные совпадения,
const winCombos = ["PR", "RS", "SP"]
а затем проверивwinCombos.indexOf(selection)!=-1
, совпадают ли оба выбора. Это должно охватывать все сценарии.3. См. jsfiddle.net/pfzq69yt
Ответ №1:
Как сказал DBS, оператор return остановит вашу функцию и ваш цикл вместе с ней, поэтому попробуйте сделать это так:
function game() {
let playerScore = 0;
let computerScore = 0;
let roundResult = computerPlay();
for (let counter = 0; counter <= 5; counter) {
computerPlay();
if (roundResult === 'You win, rock beats scissors' || roundResult === 'You win, paper beats rock.' || roundResult === 'You win, scissors beats paper.') {
playerScore;
} else if (roundResult === 'You lose, paper beats rock.' || roundResult === 'You lose, scissors beats paper.' || roundResult === 'You lose, rock beats scissors.') {
computerScore
}
}
if (playerScore > computerScore) {
return ('You win ' playerScore ' to ' computerScore '.');
} else if (playerScore < computerScore) {
return ('You lose ' computerScore ' to ' playerScore '.');
} else {
return 'It was a tie, you both won the same number of rounds.';
}
}
Таким образом, он вернет результат только после завершения цикла.
(И, кстати, переменные PlayerScore и computerScore в вашей функции computerPlay () бесполезны: p)