【问题标题】:Guess the number game: progressing the loop / alert + reset猜数字游戏:进行循环/警报+重置
【发布时间】:2024-01-22 19:44:01
【问题描述】:

我想创建一个“猜数字游戏”,您可以在一定次数内猜出一个随机数。

我在挣扎:

(必须有) 1. 警报后循环进行(显示您的猜测是否过高、过低或不是数字。

(很高兴拥有) 2.如果您成功猜到数字或尝试用完,请重置游戏。重置意味着恢复原始猜测数量并将您的尝试归零。也许只是一个刷新页面的命令。

我 - 在我第一次尝试后多年休息后 - 对编码不熟悉。

这里是我的项目的访问权限:https://glitch.com/~gravel-pyrite

我认为这是我搞砸的相关循环/条件引擎:

var rangeMin = 0; //set the min value 
var rangeMax = 10; //set the max value 
var randomNumber = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin;
var counter = 0;
var maxTries = 5;
var remainingTries = maxTries;
var guessedNumbers = [];


document.getElementById("submit").onclick = function() {

//Displaying min, max and remaining guesses in HTML

  document.getElementById('min').innerHTML = rangeMin;
  document.getElementById('max').innerHTML = rangeMax+"!";
  document.getElementById('feedback').innerHTML = "Remaining guesses: "+remainingTries;
  document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;

  var attempts = +document.getElementById("guessInput").value; // use `+` to make sure your input value is treated as a number and not a string
  guessedNumbers.push(" "+attempts+" ");
  counter++;
  remainingTries--;
  if (counter >= maxTries) { //If running outs of attempts, break out of loop (test for >= to)
    alert("You used up your maximum tries. A new game will start.");
    resetGame();
  } else if (isNaN(attempts)) { //If anything else than a number is entered
    alert(attempts + " is not a number");
  } else if (attempts == randomNumber) { //If guessed correctly
    alert("Awesome! You guessed the number right: " + randomNumber + ". You needed " + attempts + " attempts.");
    resetGame();
  } else if (attempts > randomNumber && counter < maxTries) {
    alert("Your guess " + attempts + " is too high. Guess lower.")
  } else if (attempts < randomNumber && counter < maxTries) {
    alert("Your guess " + attempts + " is too low. Guess higehr.")
  }
}
function resetGame() {
  location.reload(true);
}

我希望在警报之后,我可以输入一个新值,而不是陷入“警报循环”。

编辑:我现在更新了我的代码。成功用完所有尝试后重新加载页面效果很好。

打开一件事: document.getElementById('feedback').innerHTML = "剩余猜测:"+remainingTries; document.getElementById('guessedNumbers').innerHTML = "你目前的猜测:" + guessedNumbers;

不会仅在第一次提交按钮后显示。

这是 HTML:

<body>
    <h1>Guess what!</h1>
    <p>Guess a number between <span id="min"></span> & <span id="max"></span></p>
    <div>
      <label for="guessInput">Your guess</label>
      <input type="text" id="guessInput">
      <input type="submit" id="submit">
    </div>
    <p id="feedback"></p>
    <p id="guessedNumbers"></p>
    <button onclick="resetGame()">Reset Game</button>
  </body>

【问题讨论】:

  • 也许很高兴知道我使用这些变量var rangeMin = 0; //set the min value var rangeMax = 10; //set the max value var randomNumber = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin; var counter = 0; var maxTries = 5; var remainingTries = maxTries; var guessedNumbers =[];
  • 不完全是,counter++,remainingTries-- 和 push(attempts) 不能那样工作。他们保持不变

标签: javascript loops conditional-statements


【解决方案1】:

调整了您的代码 参见小提琴示例:https://jsfiddle.net/u0cmtg7j/1/

您不需要循环,只需在提交事件中执行所有操作。 还要在提交事件中移动 DOM 操作代码,因为您希望每次结果更改时都更新 HTML。

建议: 将您的 DOM/HTML 操作代码打包到一个函数中,这样既美观又可重用。

JS

var rangeMin = 0; //set the min value
var rangeMax = 10; //set the max value
var randomNumber = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin;
var counter = 0;
var maxTries = 5;
var remainingTries = maxTries;
var guessedNumbers = [];

//Prompt that asks user to guess a number between x / 10


//Check if number is correct
//If wrong, prompt them to guess again unti they run out of guesses
//If correct, tell them they won, the number of attempts and thank you

document.getElementById("submit").onclick = function() {

  var attempts = document.getElementById("guessInput").value;
  guessedNumbers.push(attempts);
  counter++;
  remainingTries--;
  if (counter > maxTries) { //If running outs of attempts, break out of loop
    alert("You used up your maximum tries.");
    resetGame();
  } else if (isNaN(attempts)) { //If anything else than a number is entered
    alert(attempts + " is not a number");
  } else if (attempts == randomNumber) { //If guessed correctly
    alert("Awesome! You guessed the number right: " + randomNumber + "You needed " + attempts + " attempts.");
    resetGame();
  } else if (attempts > randomNumber && counter < maxTries) {
    alert("Your guess " + attempts + " is too high. Guess lower.")
  } else if (attempts < randomNumber && counter < maxTries) {
    alert("Your guess " + attempts + " is too low. Guess higer.")
  }

  document.getElementById('min').innerHTML = rangeMin;
  document.getElementById('max').innerHTML = rangeMax + "!";
  document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingTries;
  document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
}

function resetGame() {

}

//Displaying min, max and remaining guesses in HTML
document.getElementById('min').innerHTML = rangeMin;
document.getElementById('max').innerHTML = rangeMax + "!";
document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingTries;
document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;

HTML

<h1>Guess what!</h1>
<p>Guess a number between <span id="min"></span> & <span id="max"></span></p>
<div>
  <label for="guessInput">Your guess</label>
  <input type="text" id="guessInput">
  <input type="submit" id="submit">
</div>
<p id="feedback"></p>
<p id="guessedNumbers"></p>
<button>Reset Game</button>

【讨论】:

    【解决方案2】:

    您无需在onclick 回调方法中循环。通过循环,您将继续检查guessInput 中的值,而不会让用户更改他们的猜测,因此相同的if 块将始终运行,直到玩家猜不透。相反,您需要 click 方法来控制函数中的代码运行的时间和次数,因为它允许用户更改他们的猜测:

    var rangeMin = 0; //set the min value 
    var rangeMax = 10; //set the max value 
    var randomNumber = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin;
    var counter = 0;
    var maxTries = 5;
    var remainingTries = maxTries;
    var guessedNumbers = [];
    console.log(randomNumber);
    document.getElementById("submit").onclick = function() {
      var attempts = +document.getElementById("guessInput").value; // use `+` to make sure your input value is treated as a number and not a string
      guessedNumbers.push(attempts);
      counter++;
      remainingTries--;
      if (counter >= maxTries) { //If running outs of attempts, break out of loop (test for >= to)
        alert("You used up your maximum tries.");
        // resetGame();
      } else if (isNaN(attempts)) { //If anything else than a number is entered
        alert(attempts + " is not a number");
      } else if (attempts == randomNumber) { //If guessed correctly
        alert("Awesome! You guessed the number right: " + randomNumber + "You needed " + attempts + " attempts.");
        //resetGame();
      } else if (attempts > randomNumber && counter < maxTries) {
        alert("Your guess " + attempts + " is too high. Guess lower.")
      } else if (attempts < randomNumber && counter < maxTries) {
        alert("Your guess " + attempts + " is too low. Guess higer.")
      }
    }
    <input id="guessInput" type="number" />
    <button id="submit">Guess</button>

    【讨论】:

    • 不完全是,counter++,remainingTries-- 和 push(attempts) 不是那样工作的。他们保持不变
    • @user2132380 它们不会保持不变,每次玩家做出新的猜测(即:单击按钮)时它们都会改变。您确实需要将 if (counter &gt; maxTries) 更改为 if (counter &gt;= maxTries),但我已经更新了我的 sn-p 以包含此更改
    • 它工作(几乎)。我没有提到的是我用这个 ``` //Displaying min, max and remaining guesses in HTML document.getElementById('min').innerHTML = rangeMin; 来操作 DOM document.getElementById('max').innerHTML = rangeMax+"!"; document.getElementById('feedback').innerHTML = "Remainig 猜测:"+remainingTries; document.getElementById('guessedNumbers').innerHTML = "你目前的猜测:" + guessedNumbers; ```在js文件的末尾。这就是我在评论中提到的。
    【解决方案3】:

    这是我的结果。我确信事情可以改进,但一切正常:

    var rangeMin = 0; //set the min value 
    var rangeMax = 10; //set the max value 
    var randomNumber = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin;
    var counter = 0;
    var maxTries = 5;
    var remainingTries = maxTries;
    var guessedNumbers = [];
    
    //Displaying min, max and remaining guesses in HTML
    document.getElementById('min').innerHTML = rangeMin;
    document.getElementById('max').innerHTML = rangeMax+"!";
    document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
    document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
    
    //The code
    document.getElementById("submit").onclick = function() {
    
    
      var attempts = +document.getElementById("guessInput").value; // use `+` to make sure your input value is treated as a number and not a string
      guessedNumbers.push(" "+attempts+" ");
      counter++;
      remainingTries--;
      if (counter >= maxTries) { //If running outs of attempts, break out of loop (test for >= to)
        document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
        document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;alert("You used up your maximum tries. A new game will start.");
        resetGame();
      } else if (isNaN(attempts)) { //If anything else than a number is entered
        document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
        document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
        alert(attempts + " is not a number");
      } else if (attempts == randomNumber) { //If guessed correctly
        document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
        document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
        alert("Awesome! You guessed the number right: " + randomNumber + ". You needed " + attempts + " attempts.");
        resetGame();
      } else if (attempts > randomNumber && counter < maxTries) {
        document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
        document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
        alert("Your guess " + attempts + " is too high. Guess lower.")
      } else if (attempts < randomNumber && counter < maxTries) {
        document.getElementById('feedback').innerHTML = "Remainig guesses: "+remainingTries;
        document.getElementById('guessedNumbers').innerHTML = "Your guesses so far: " + guessedNumbers;
        alert("Your guess " + attempts + " is too low. Guess higehr.")
      }
    }
    
    function resetGame() {
      location.reload(true);
    }
    

    【讨论】:

      【解决方案4】:

      我昨天看到你的问题,我为你准备了一个答案,但我发现你已经删除了你的问题:)。

      • 我使用 console.log(someVariable);在我的代码中使用它之前,以确保它存在而不是 null 或 undefined
      • 当我使用您的代码执行此操作时,我发现变量“随机”在我声明并分配它时存在,但在事件处理函数内部它变为“未定义”,因为该函数是异步的
      • 工作代码如下,逻辑简化

        var rangeMin = 0;
        var rangeMax = 10;
        var remainingGuesses = 4;
        document.getElementById('min').innerHTML = rangeMin;
        document.getElementById('max').innerHTML = rangeMax + "!";
        document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
        var random;
        var guessesMade = 0;//the user hasn't guessed anything yet os we'll declare and assign the variable as zero
        document.getElementById("submit").onclick = function guess() {
        //this is a new guess from the user, lets increase the counter of guesses made and decrease remaining guesses
        guessesMade++;
        remainingGuesses--;
        document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
        //lets assign the variable random a number
            random = Math.floor(Math.random() * (rangeMax - rangeMin + 1)) + rangeMin;
            //lets get what the user guessed
            var userGuess = document.getElementById("guessInput").value;
            if (random == userGuess) {
                alert("CONGRATULATIONS!!! GUESSES NEEDED: " + guessesMade);
                //Resetting:
                remainingGuesses = 4;
                document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
            }
            else {
                //So the user didn't guess it right, there two scenarios:
                //1- user already consumed his chances, we'll alert him about it and reset the game
                //2- user still has guesses to make, we will test and advise him
                if (remainingGuesses == 0) {
                    // scenario (1-)
                    alert("SORRY, YOUR RAN OUT OF GUESSES. LETS PLAY AGAIN!");
                    remainingGuesses = 4;
                    document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
                }
                else {
                    //scenario (2-)
                    //we will check the value of his guess and advise him
                    if (random > userGuess) {
                        alert("SORRY, YOUR GUESS " + userGuess + " IS SMALLER THEN THE NUMBER IN QUESTION." + "\n" + "CHOOSE A HIGHER NUMBER");
                        document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
                    }
                    else if (random < userGuess) {
                        alert("SORRY, YOUR GUESS " + userGuess + " IS HIGHER THEN THE NUMBER IN QUESTION." + "\n" + "CHOOSE A SMALLER NUMBER");
                        document.getElementById('feedback').innerHTML = "Remainig guesses: " + remainingGuesses;
                    }
                }
            }
        }
        

      【讨论】:

        最近更新 更多