Изо всех сил пытаюсь выполнить цикл по функции и вернуть правильные результаты для проекта Odin Камень, ножницы, бумага. Что не так с моим кодом?

#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. Большое вам спасибо! Ваше объяснение было очень полезным!