2014-02-18 16 views
0

我是编程新手,所以请和我一起裸照。JavaScript:如何停止重新生成随机数?

我创建在其中产生一个随机数(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> 

有什么建议吗?

+0

我想这是“1和50包含”? :-) – RobG

回答

1

移动

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

的功能。然后,该数字将仅在页面加载时生成,而不是在每次调用该函数时生成。

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

+0

试图猜测保持不变的数字有什么乐趣?我认为现在的游戏是*方式*更具挑战性:) –

+0

如果'50'在范围内,不应该是'Math.random()* 50 + 1'吗?由于'Math.random()* 50'总是小于50',所以'Math.random()'永远不会返回1. – RobG

+0

@RobG:不符合MDN:https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#示例:_Using_Math.random *编辑:*哦,也许这只是在不包括max的情况下。我猜你是对的! –

0

每次你调用函数时,它都会将数字重新定义为新的随机数。如果将声明移到函数之外,那么每次调用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)); 

这样做是它返回你的checkGuess函数的变量,但现在代码可以访问数字变量,因为它在closure之内。

+0

每个函数的JavaScript都是封闭的。如果你引用'(function(){...}(...))'作为闭包,那么你在技术上是正确的,但是这个函数不一定是闭包。这里重要的是*调用*函数创建一个新的范围。 –

+0

@ FelixKling-不同意每个函数都是闭包。关于功能和范围,ECMA-262没有定义“闭合”,因此定义变得没有实际意义。 [关闭](http://www.jibbering.com/faq/notes/closures/)通常需要在执行上下文完成执行后访问变量(例如模拟私有成员)。在仍在执行的外部执行上下文中访问变量只是解决库存范围链上的问题,闭包允许访问从前一个范围链持续存在的变量,而不仅仅是当前执行上下文链创建的变量。 – RobG

+0

@RobG:我认为有两种方法定义闭包。一个是你提到的,另一个是每个具有自由变量的函数都是闭包。我决定接受维基百科提供的解释:https://en.wikipedia.org/wiki/Closure_%28computer_programming%29。看看第一句,它完全适合JS的功能。我们可以同意不同意? :) –