【问题标题】:Syncing a random variable同步随机变量
【发布时间】:2019-12-04 19:51:10
【问题描述】:

我目前正在为我的石头剪刀布游戏制作简单的 UI。我为我的 getComputerChoice 函数使用了一个随机数,然后该函数用于显示图像并决定游戏的结果。我尝试将 getComputerChoice 的结果设置为一个变量,但后来我遇到了一个问题,即每次运行新游戏时计算机的选择都会保持不变。

const model = {
  wins: 0,
  losses: 0,
  draws: 0,

  getCompChoice: function() {
    var num = Math.floor(Math.random() * 3);
    var choices = ["rock", "paper", "scissors"];

    var choice = choices[num];
    return choice;
  },

  gameLogic: function(player, computer) {
    if (player === false) {
      return alert("Please enter a valid guess");
    } else if (player === computer) {
      this.draws++;
      return "draw";
    } else if (
      (player === "rock" && computer === "paper") ||
      (player === "paper" && computer === "scissors") ||
      (player === "scissors" && computer === "rock")
    ) {
      this.losses++;
      return "lose";
    } else {
      this.wins++;
      return "win";
    }
  }
};
const view = {
  updateScore: function() {
    document.getElementById("wins").textContent = "Wins:" + " " + model.wins;
    document.getElementById("losses").textContent =
      "Losses:" + " " + model.losses;
    document.getElementById("draws").textContent = "Draws:" + " " + model.draws;
    return;
  },
  displayRollComputer: function() {
    var computer = document.getElementById("computer");
    computer.classList.remove("rock", "paper", "scissors");
    computer.classList.add(controller.compChoice);
    console.log(controller.compChoice);
  },
  displayRollUser: function() {
    var user = document.getElementById("user");
    user.classList.remove("rock", "paper", "scissors");
    user.classList.add(processPlayer());
  }
};
const controller = {
  compChoice: model.getCompChoice(),

  play: function() {
    model.gameLogic(processPlayer(), this.compChoice);
    view.updateScore();
    view.displayRollComputer();
    view.displayRollUser();
  }
};

// Helper Functions
function processPlayer() {
  const player = document.getElementById("guess").value;

  if (player === "rock" || player === "paper" || player === "scissors") {
    return player;
  } else {
    return false;
  }
}

【问题讨论】:

  • 你只给getCompChoice打过一次电话吗?
  • 不,我在 displayRollComputer 函数和播放函数中调用它

标签: javascript random


【解决方案1】:

这是因为 controller.compChoice 不是在您每次调用 gameLogic() 时都计算出来的,而是在初始化期间只计算一次。改成:

const controller = {
  compChoice: model.getCompChoice(),

  play: function() {
    this.compChoice = model.getCompChoice(); <
    model.gameLogic(processPlayer(), this.compChoice);
    view.updateScore();
    view.displayRollComputer();
    view.displayRollUser();
  }
};

一切都应该按预期工作。

【讨论】:

  • 这不起作用,因为我在 displayRollComputer 函数中调用 compChoice 来显示计算机选择的图像。问题是用于图像的 compChoice 结果与用于游戏结果的 compChoice 结果不同
  • 是的,我忽略了这一点。我已经更新了我的答案以匹配这个问题,现在它变得不那么激烈了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多