Почему моя переменная счета не показывает правильное значение? - PullRequest
0 голосов
/ 14 мая 2018

Я делаю основную игру «камень-ножницы-бумага». Пока что эта программа работает нормально, она определяет выбор между игроком и компьютером, но оценка не повышается должным образом. Я не могу получить счет выше 1, если игрок выигрывает несколько раз подряд, и если есть ничья, счет становится 0.

computerSelection определяется случайным числом, и playerSelection вводится при вызове функции ниже.

Если игрок выбирает рок , а компьютер выбирает paper , впервые консоль говорит: «Игрок выигрывает, и счет равен 1».
Если во втором раунде игрок выбирает ножницы , а компьютер выбирает paper , консоль говорит: «Игрок выигрывает, и счет равен 1 », когда я ожидал сказать "" Игрок выигрывает, и счет 2"

function computerPlay() {
    const random = Math.ceil(Math.random() * 3);
    if (random === 1) {
        return "rock";
    }
    else if (random === 2) {
        return "paper";
    }
    else {
        return "scissors";
    }
}

let score = 0;

function playRound(playerSelection, computerSelection) {

    // Computer wins
    if ((playerSelection === 'paper' && computerSelection === 'scissors') ||
        (playerSelection === 'scissors' && computerSelection === 'rock') ||
        (playerSelection === 'rock' && computerSelection === 'paper')) {
        score--;

        //Stop negative scores
        if (score < 0) {
            score = 0;
        }
        return "Computer wins and the score is " +score;
    }

    // Player wins
    else if ((playerSelection === 'paper' && computerSelection === 'rock')|| 
        (playerSelection === 'rock' && computerSelection === 'scissors') ||
        playerSelection === 'scissors' && computerSelection === 'paper') {
        score++;
        return "Player wins and the score is " +score;
    }

    // Same selection
    else {
        return "Tie and the score is " +score;
    }

}
console.log(playRound('paper', computerPlay()));

1 Ответ

0 голосов
/ 14 мая 2018

Хорошо, значит, ваша проблема в том, что у вас нет логики для продолжения игры. То есть (основываясь на том, что я вижу в вашем посте прямо сейчас) каждый игровой раунд эксклюзивен, и результаты не составляют каждый раунд. Чтобы решить эту проблему, вам нужно реализовать игровой цикл, чтобы контролировать ход игры и разрешить несколько раундов за сессию.

Сказав это, вот что я придумал и немного протестировал, чтобы помочь вам:

function computerPlay () {
  const options = [ 'rock', 'paper', 'scissors' ];
  return options[Math.floor(Math.random()*options.length)];
}


function computerWins ( playerSelection, computerSelection ) {
  return ( playerSelection === 'paper' && computerSelection === 'scissors' ) ||
      ( playerSelection === 'scissors' && computerSelection === 'rock' ) ||
      ( playerSelection === 'rock' && computerSelection === 'paper' );
}

function playerWins ( playerSelection, computerSelection ) {
  return ( playerSelection === 'paper' && computerSelection === 'rock' ) ||
      ( playerSelection === 'rock' && computerSelection === 'scissors' ) ||
      playerSelection === 'scissors' && computerSelection === 'paper';
}

function playRound ( score, playerSelection, computerSelection ) {
  let result = {};

  // Computer wins
  if ( computerWins( playerSelection, computerSelection ) ) {
    score--;

    //Stop negative scores
    if ( score < 0 ) {
      score = 0;
    }
    result = { message : 'Computer wins, and the score is: ', score };
  }

  // Player wins
  else if ( playerWins( playerSelection, computerSelection ) ) {
    score++;
    result = { message : 'Player wins and the score is: ', score };
  }

  // Same selection
  else {
    result = { message : 'Tie game and the score is: ', score };
  }
  return result;

}

function annouceWinner ( score, message ) {
  console.log( `${message} ${score}` );
}

function main () {
  let score = 0;

  while ( score < 5 ) {
    let roundResult = playRound( score, 'paper', computerPlay() );
    score           = roundResult.score;
    annouceWinner( score, roundResult.message );
  }
}

main();

Вы заметите, что я создал несколько служебных методов и немного их очистил.

  • Теперь существует метод computerWins для хранения логики, которая определяет, когда компьютер выигрывает. Это хорошо, потому что если по какой-то причине эта логика нуждается в рефакторинге, это нужно сделать только одним способом!
  • Теперь существует playerWins метод для хранения логики, которая определяет, когда игрок выигрывает.
  • Теперь существует метод announceWinner. В этом нет необходимости, но это позволяет легко отделить часть сообщений от функции основного цикла.
  • Теперь существует метод main. Это сердце, оно контролирует ход вашей программы и позволяет вам иметь несколько «раундов» за сеанс.

Пример вывода:

Computer wins, and the score is:  1
Tie game and the score is:  1
Player wins and the score is:  2
Player wins and the score is:  3
Computer wins, and the score is:  2
Tie game and the score is:  2
Player wins and the score is:  3
Player wins and the score is:  4
Player wins and the score is:  5
...