首页 > 解决方案 > javascript石头剪刀布游戏()函数中的循环功能和计数

问题描述

就像前言一样,我对编程很陌生,如果错误是我忽略的简单错误,我深表歉意。另外我提前知道游戏功能现在很乱,我在玩了几天后将它复制到现在的状态。

我一直在做 odin 项目的石头剪刀布项目,虽然我开发了一个运行良好的单轮功能,但我无法让总体游戏功能正常运行。我尝试过改变语法,我怀疑问题出在特定变量的范围内,但我还没有找到一种可行的方法。过去几天我也一直在做研究,试图弄清楚如何在简化单轮时做到这一点,但我无法找到与我的代码设置方式相关的查询。

我已将所有内容都放在同一个函数中,但是当我这样做时,我似乎无法让循环正常工作,并且我尝试将变量从本地范围拉到全局范围,但没有成功 - 正如我所提到的单轮函数可以正常工作,并且无论结果如何都会返回正确的字符串,所以我有一种预感,错误确实存在于可变比例的某个地方,我只是无法查明它。

我的游戏功能,大约是第五次或第六次无法运行的再现:

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()

标签: javascript

解决方案


就像 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.';
  }
}

像这样它只会在循环完成时返回结果。

(顺便说一句,您的 computerPlay() 函数中的 playerScore 和 computerScore 变量是无用的:p)


推荐阅读