Javascript 如何阻止随机数重新生成?

Javascript 如何阻止随机数重新生成?,javascript,Javascript,我正在创建一个儿童数字猜测游戏,其中会生成一个随机数(介于1和50之间),您必须不断猜测数字,直到找到生成的数字。你会收到关于你的猜测是否过高或过低的反馈,以便更好地告知你的猜测。下面是我想出的代码,但问题是,我似乎无法确定随机数。似乎每次猜测都会重新生成该数字。我怎样才能使每次猜测都使用相同的数字,直到猜对为止 <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; ch

我正在创建一个儿童数字猜测游戏,其中会生成一个随机数(介于1和50之间),您必须不断猜测数字,直到找到生成的数字。你会收到关于你的猜测是否过高或过低的反馈,以便更好地告知你的猜测。下面是我想出的代码,但问题是,我似乎无法确定随机数。似乎每次猜测都会重新生成该数字。我怎样才能使每次猜测都使用相同的数字,直到猜对为止

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro' rel='stylesheet' type='text/css'>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>

<body>
    <form id ="game" action="javascript:void(checkGuess())">
        <p class="owlOne">I'm thinking of a number between 1 and 50.</p>
        <br class="clear" />
        <p class="owlTwo"><input id="guess" type="text"><input id="button" type="submit" value="Guess!"></p>
        <br class="clear" />
        <p class="owlOne"><span id="response">Can you guess what it is?</span></p>
    </form>

<script>
function checkGuess() {
    var guess = Number(document.getElementById('guess').value); // Assigns guessed number to variable.
    var number = Math.floor(Math.random() * 49 + 1); // Generates a random number between 1 and 50.

    // Guessed number is correct.
    if (guess == number) {
        document.getElementById("response").innerHTML= "Congratulations, you guessed correctly!";
    }

    // Guessed number is within 5 above.
    else if (guess > number && guess <= number+5) {
        document.getElementById("response").innerHTML= "You're so close! Just a little bit lower.";
    }

    // Guessed number is within 5 below.
    else if (guess < number && guess >= number-5) {
        document.getElementById("response").innerHTML= "You're so close! Just a little bit higher.";
    }

    // Guessed number is at least 1, but more than 5 below.
    else if (guess < number-5 && guess >= 1) {
        document.getElementById("response").innerHTML= "Too low! Guess again.";
    }

    // Guessed number is no more than 50, but less than 5 above.
    else if (guess > number+5 && guess <= 50) {
        document.getElementById("response").innerHTML= "Too high! Guess again.";
    }

    // Guessed number is not within the 1 - 50 range.
    else {
        document.getElementById("response").innerHTML= "Remember, the number I'm thinking of is between 1 and 50.";
    }
}
</script>

</body>
</html>

无标题文件

我想的是一个介于1和50之间的数字



你能猜出是什么吗

函数checkGuess(){ var guess=Number(document.getElementById('guess').value);//将猜测的数字分配给变量。 var number=Math.floor(Math.random()*49+1);//生成一个介于1和50之间的随机数。 //猜测的数字是正确的。 如果(猜测==数字){ document.getElementById(“response”).innerHTML=“恭喜,你猜对了!”; } //猜出的数字在5以内。 else if(猜测>数字和猜测=数字-5){ document.getElementById(“response”).innerHTML=“你们太接近了!只是稍微高一点。”; } //猜测的数字至少为1,但低于5。 否则如果(猜测=1){ document.getElementById(“response”).innerHTML=“太低了!请再猜一次。”; } //猜测的数字不超过50,但少于5以上。 否则,如果(猜测>数字+5&&guess移动

函数外部则仅在页面加载时生成号码,而不是每次调用函数时生成号码


number
将成为一个全局变量,也可以在函数内部访问。

每次调用函数时,它都将数字重新定义为一个新的随机数。如果将声明移到函数外部,则不会在每次调用checkGuess时重新定义它

您的代码应该类似于

 var number = Math.floor(Math.random() * 49 + 1); 

   function checkGuess() {
      // code
   }
var checkGuess = (function(number) {
   return function(){
      // code that was in checkGuess(){

   } 
})(Math.floor(Math.random() * 49 + 1));
但您应该注意,这将数字置于全局范围内,您还可以执行以下操作

 var number = Math.floor(Math.random() * 49 + 1); 

   function checkGuess() {
      // code
   }
var checkGuess = (function(number) {
   return function(){
      // code that was in checkGuess(){

   } 
})(Math.floor(Math.random() * 49 + 1));

它的作用是将checkGuess函数返回给变量,但现在代码可以访问数字变量,因为它在a中。

我猜这是“1和50”?:-)尝试猜测一个保持不变的数字有什么乐趣?我认为现在的游戏更具挑战性:)这不应该是
Math.random吗()*50+1
如果
50
在范围内?因为
Math.random()*50
将始终小于50'因为
Math.random()
永远不会返回1。@RobG:不符合MDN:edit:噢,可能这只是在不包括max的情况下。我想你是对的!我理解为“1到50”,否则包含1到49,但从OP中看不清楚。每个函数JavaScript都是一个闭包
作为闭包,那么您在技术上是正确的,但该函数不必是闭包才能起作用。这里重要的是调用该函数会创建一个新的作用域。@FelixKling不同意每个函数都是闭包。“闭包”ECMA-262中没有定义函数和作用域,因此定义变得没有意义。通常需要在执行上下文完成后访问变量(例如,模拟私有成员)。访问仍在执行的外部执行上下文中的变量只是对库存范围链的解析,闭包允许访问从以前的范围链持续存在的变量,而不仅仅是当前执行上下文链创建的变量。@RobG:我认为有两种方法定义闭包。一种是您提到的方法,另一种是另一个是每个有自由变量的函数都是一个闭包。我决定接受维基百科提供的解释:。看看第一句话,它非常适合JS函数。我们可以同意不同意吗?:)@FelixKling是的,你是对的,重要的部分是在函数调用之前运行number。我要说的是,创建闭包可以防止污染全局范围,这通常是一种最佳做法。一个通用变量名,如number,很容易被覆盖并导致所有类型的问题。