#javascript
#javascript
Вопрос:
Я изо всех сил пытался создать Javascript-игру rock, paper, scissors из проекта Odin. Я могу заставить базовую игру работать, но как только я пытаюсь вызвать исходную функцию в новой функции и выполнить цикл, я начинаю сталкиваться с проблемами. Моя текущая проблема в том, что я могу заставить свою функцию game () выдавать 5 результатов, но это один и тот же результат (5 побед или 5 поражений или 5 ничьих). Я не могу понять, что не так. Сначала я подумал, что это может быть потому, что я использовал return после каждого случая. После удаления return до конца playRound() Я все еще сталкиваюсь с той же проблемой. (В настоящее время у меня установлен параметр выбора проигрывателя rock, чтобы упростить отслеживание / избежать работы с всплывающим окном).
Я новичок, и у меня все еще много недостатков в знаниях, поэтому, если бы вы могли объяснить свои ответы так, как будто мне 5 лет, это было бы очень ценно.
/*variable declarations*/
var result = {win:0, tie:0, loss:0};
let playerChoice= "rock";
//let playerChoice = prompt("Rock, Paper, or Scissors");
const computerSelection = computerPlay();
const playerSelection = caseInsensitive();
let win = "You win";
let tie = "tie";
let loss = "You lose";
function computerPlay(){
let a = Math.floor(Math.random() * 11);
switch (a){
case 0:
case 1:
case 2:
case 3:
return "rock";
case 4:
case 5:
case 6:
case 7:
return "paper";
default:
return "scissors";
}
}
function caseInsensitive(){
return playerChoice.toLowerCase();
}
function playRound(playerSelection, computerSelection){
let round;
if(playerSelection==="rock"){
switch(computerSelection){
case "paper":
round= loss;
break;
case "rock":
round =tie;
break;
case "scissors":
round= win;
break;
}
}
if(playerSelection=="paper"){
switch(computerSelection){
case "scissors":
round= loss;
break;
case "paper":
round = tie;
break;
case "rock":
round = win;
break;
}
}
if(playerSelection=="scissors"){
switch(computerSelection){
case "rock":
round= loss;
break;
case "scissors":
round= tie;
break;
case "paper":
round= win;
break;
}
}
return round;
}
function game(){
for(i=0;i<5;i ){
console.log(playRound(playerSelection, computerSelection));
if(playRound()==win){
result.win ;
}else if(playRound()==tie){
result.tie ;
}else{
result.loss ;
}
}
console.log("Wins: " result.win);
console.log("Losses: " result.loss);
console.log("Ties: " result.tie);
}
game();
Комментарии:
1. Есть ли какая-то особая причина, по которой вы
random
вводите 12 результатов и присваиваете четырем из них один и тот же результат? Почему не простоrandom
3 результата?2. В любом случае, причина, по которой вы получаете один и тот же результат пять раз, заключается в том, что вы запрашиваете у компьютера только один ход — в самом начале — и затем используете этот ход пять раз. Поскольку игрок аналогично привязан к «rock», результатом всегда будет пять одинаковых результатов.
3. Я пытался получить равное количество результатов для камня, бумаги и ножниц, чтобы вероятность была равной для каждого. Мне даже не пришло в голову использовать 3. Спасибо, это поможет прояснить некоторый код.
4. Я думаю, я не понимаю, почему каждый цикл не перезапускает процесс запроса другого хода от игрока и компьютера. Если я выполняю цикл round() 5 раз, не следует ли каждый раз запускать процесс с самого начала?
5. находится ли процесс запроса другого хода внутри
playRound
? Нет — это снаружи. Поэтому вызовplayRound
в том виде, в каком он есть сейчас, не даст вам нового хода.
Ответ №1:
Ниже приведена рабочая версия вашего кода. Основные изменения, которые необходимо изменить, заключались в том, что выбор компьютера генерировался каждый раз (поэтому вызывается computerPlay()
в начале цикла) и сохранялся результат для раунда в цикле. playRound
без аргументов выполняет новое вычисление с аргументами null
и всегда возвращает потерю.
/*variable declarations*/
let result = {win: 0, tie: 0, loss: 0};
let playerChoice = "rock";
//let playerChoice = prompt("Rock, Paper, or Scissors");
let win = "You win";
let tie = "tie";
let loss = "You lose";
function computerPlay() {
let a = Math.floor(Math.random() * 11);
switch (a) {
case 0:
case 1:
case 2:
case 3:
return "rock";
case 4:
case 5:
case 6:
case 7:
return "paper";
default:
return "scissors";
}
}
function caseInsensitive() {
return playerChoice.toLowerCase();
}
function playRound(playerSelection, computerSelection) {
let round;
if (playerSelection === "rock") {
switch (computerSelection) {
case "paper":
round = loss;
break;
case "rock":
round = tie;
break;
case "scissors":
round = win;
break;
}
}
if (playerSelection === "paper") {
switch (computerSelection) {
case "scissors":
round = loss;
break;
case "paper":
round = tie;
break;
case "rock":
round = win;
break;
}
}
if (playerSelection === "scissors") {
switch (computerSelection) {
case "rock":
round = loss;
break;
case "scissors":
round = tie;
break;
case "paper":
round = win;
break;
}
}
return round;
}
function game() {
for (let i = 0; i < 5; i ) {
let playerSelection = caseInsensitive();
let computerSelection = computerPlay();
let roundResult = playRound(playerSelection, computerSelection);
console.log(roundResult);
if (roundResult === win) {
result.win ;
} else if (roundResult === tie) {
result.tie ;
} else {
result.loss ;
}
}
console.log("Wins: " result.win);
console.log("Losses: " result.loss);
console.log("Ties: " result.tie);
}
game();
Комментарии:
1. Большое вам спасибо! Ваше объяснение было очень полезным!