【问题标题】:JS CLI RPS game issueJS CLI RPS 游戏问题
【发布时间】:2021-08-15 13:40:01
【问题描述】:

向 Stack Overflow 的爱心人士致以问候。 我最近才开始学习 JS,现在正在尝试制作 CLI 剪刀石头布游戏。是的,我知道我是第 100 个对此提出问题的人,但我无法通过其他人的代码找到“no-make-sense”代码。所以我只是向所有对帮助新手无动于衷的人寻求帮助!

情况是这样的:一个熟悉的游戏最常见的规则,但我无法让计数器工作,加上有时我输入的文字无法识别(我认为是输入比较功能的原因)。 另外,我确定我的 func 范围已损坏,但我无法弄清楚或追踪它的位置和原因。

function computerPlay() {
  let anyPick = Math.random();
  if (anyPick < 0.3) {
    return "Rock";
  }
  if (anyPick > 0.3 && anyPick < 0.6) {
    return "Paper";
  }
  if (anyPick > 0.6) {
    return "Scissors";
  }
}

let aiScore = 0;
let playerScore = 0;
function battleRound(playerSelection, computerSelection) {
  if (playerSelection === computerSelection) {
    return "None of you are win or lose, cuz it is an equal!";
  }
  if (playerSelection === "rock" && computerSelection === "Scissors") {
    playerScore += 1;
    return "You Win! Rock beats Scissors";
  }
  if (playerSelection === "rock" && computerSelection === "Paper") {
    aiScore += 1;
    return "You Loose! Paper beats Rock";
  }
  if (playerSelection === "paper" && computerSelection === "Scissors") {
    aiScore += 1;
    return "You Loose! Scissors cut Paper";
  }
  if (playerSelection === "paper" && computerSelection === "Rock") {
    playerScore += 1;
    return "You Win! Paper beats Rock";
  }
  if (playerSelection === "scissors" && computerSelection === "Paper") {
    playerScore += 1;
    return "You Win! Scissors cut Paper";
  }
  if (playerSelection === "scissors" && computerSelection === "Rock") {
    aiScore += 1;
    return "You Loose! Rock beats Scissors";
  } else return "U misspelled, try again";
}

function scores(aiScore, playerScore) {
  if (aiScore > playerScore) {
    return "CONGRAS, AI IS SMARTER THEN YOU!";
  }
  if (playerScore > aiScore) {
    return "CONGRAS, YOU ARE SMARTER THEN AI";
  }
}

for (let i = 0; i < 5; i++) {
  const playerSelection = prompt(
    "Choose: Rock, Paper or Scissors",
    " "
  ).toLowerCase();
  const computerSelection = computerPlay();
  console.log("AI choose: " + computerSelection);
  console.log(battleRound(playerSelection, computerSelection));
  console.log("AI score: " + aiScore, "Player score: " + playerScore);
}

请指出代码中的一个明显问题以及我需要替换的确切内容。 非常感谢任何提示!

【问题讨论】:

    标签: javascript loops scope logic command-line-interface


    【解决方案1】:

    您的代码有两个主要问题可能会导致此问题,

    • 您将默认提示值设置为空白。通过使用:
    prompt("Choose: Rock, Paper or Scissors", " ")
    

    默认提示值为空格,更容易打错。

    为了解决这个问题,我删除了默认值并添加了.trim() 方法来删​​除输入开头和结尾的空格。

    • 您正在进行不可能的比较。在您的代码中您进行了比较:
    if (playerSelection === computerSelection) {
         return ("None of you are win or lose, cuz it is an equal!");
    }
    

    此条件永远不会是true,因为playerSelection 总是转换为小写,例如"rock",但computerSelection 的第一个字母总是大写,例如"Rock"

    在比较之前,我将.toLowerCase() 方法添加到computerSelection 的末尾。

    完整代码:

    function computerPlay() {
      let anyPick = Math.random();
      if (anyPick < 0.3) {
        return "Rock";
      }
      if (anyPick > 0.3 && anyPick < 0.6) {
        return "Paper";
      }
      if (anyPick > 0.6) {
        return "Scissors";
      }
    }
    
    let aiScore = 0;
    let playerScore = 0;
    
    function battleRound(playerSelection, computerSelection) {
      if (playerSelection === computerSelection.toLowerCase()) {
        return "None of you are win or lose, cuz it is an equal!";
      }
      if (playerSelection === "rock" && computerSelection === "Scissors") {
        playerScore += 1;
        return "You Win! Rock beats Scissors";
      }
      if (playerSelection === "rock" && computerSelection === "Paper") {
        aiScore += 1;
        return "You Loose! Paper beats Rock";
      }
      if (playerSelection === "paper" && computerSelection === "Scissors") {
        aiScore += 1;
        return "You Loose! Scissors cut Paper";
      }
      if (playerSelection === "paper" && computerSelection === "Rock") {
        playerScore += 1;
        return "You Win! Paper beats Rock";
      }
      if (playerSelection === "scissors" && computerSelection === "Paper") {
        playerScore += 1;
        return "You Win! Scissors cut Paper";
      }
      if (playerSelection === "scissors" && computerSelection === "Rock") {
        aiScore += 1;
        return "You Loose! Rock beats Scissors";
      } else return "U misspelled, try again";
    }
    
    function finalScores() {
      if (aiScore > playerScore) {
        return "CONGRATS, AI IS SMARTER THEN YOU!";
      }
      if (playerScore > aiScore) {
        return "CONGRATS, YOU ARE SMARTER THEN AI";
      }
    }
    
    for (let i = 0; i < 5; i++) {
      const playerSelection = (prompt("Choose: Rock, Paper or Scissors") ?? "")
        .trim()
        .toLowerCase();
      const computerSelection = computerPlay();
      console.log("AI choose: " + computerSelection);
      console.log(battleRound(playerSelection, computerSelection));
      console.log("AI score: " + aiScore, "Player score: " + playerScore);
    }
    
    console.log(finalScores())

    【讨论】:

    • 感谢@lejlun 指出了我很长时间以来会看到的细微差别,但不知道问题的确切原因。但现在控制台中出现了错误:[Error] TypeError: null is not an object (evalating 'prompt("Choose: Rock, Paper or Scissors") .trim') Global Code (scrip.js:57) I don'不太明白为什么“null 不是对象”到 .trim ?
    • 抱歉,我的代码无法重现此问题,您是否添加或更改了任何可能导致此问题的内容?
    • 不,我没有更改您更新的 sn-p 的任何内容......也许它在浏览器中,我正在使用 Safari。实际上,这不是问题,除了最后的和平之外,一切都按我的意愿进行。
    • @PavelPopok 我已经对上面的帖子进行了更新,如果prompt 无论出于何种原因返回null,将改为返回一个空字符串。请看看这是否能解决您的错误
    • 哇,它有效!我并没有真正理解语法 "?? """ 但我一定会去 MDN 看看你是如何简洁地纠正它的。非常感谢@lejlun 的更正和澄清 - 你让我很开心!
    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 2018-09-29
    • 2021-09-23
    • 1970-01-01
    • 2020-08-14
    • 2011-04-12
    • 2020-11-22
    • 2011-05-08
    相关资源
    最近更新 更多