我正在尝试编写一个简单的JavaScript猜谜游戏。首先,用户输入一个数字(0到100之间),计算机将尝试猜测它。这是我编写的代码,但它无法正常工作。有任何想法吗。提前致谢。
In [71]: n - n
C:\Anaconda3\Scripts\ipython-script.py:1: RuntimeWarning: invalid value encountered in double_scalars
if __name__ == '__main__':
Out[71]: nan
In [72]: n/n
C:\Anaconda3\Scripts\ipython-script.py:1: RuntimeWarning: invalid value encountered in double_scalars
if __name__ == '__main__':
Out[72]: nan
In [73]: n*n
Out[73]: inf
答案 0 :(得分:0)
您没有在二进制搜索中更新while循环中的变量middle。因此,中间值始终为50。
在while循环开始时添加此项
middle = start + (stop - start)/2
答案 1 :(得分:0)
每次执行while(start <= stop)
循环时,您永远不会将middle
更新为处于开始和停止的中间位置,它始终为50。
让我们看一个例子:
以下是您的起始值:
start = 0
stop = 100
middle = (100+0)/2 = 50
guess = 23
您的代码进入了while循环。从中间&gt;猜测,你的其他代码是否会运行:
stop = middle -1;
所以stop现在的值是50-1 = 49.你的while循环重复,并且从中间开始,并且猜测没有被激活,相同的代码行将会触发:stop = middle -1;
这将导致你的止损再次等于49。它将无限循环。
您需要做的是在while循环结束时重置中间位置:
middle = (start + stop)/2
答案 2 :(得分:0)
有很多问题。你的while循环的结束条件并没有多大意义。正如其他人所说,你对middle
的计算是错误的,只进行了一次。我认为这段代码应该能满足您的需求:
function compGuess()
{
var value = parseInt(document.getElementById("myNumber").value, 10);
if (value < 0 || value > 100 )
{
alert("Please enter a number between 0 and 100.");
}
else
{
var start = 0;
var stop = 100;
var middle = Math.floor(start + (stop - start) / 2);
var guess = value;
if (middle == guess)
{
alert("Your number is: " + middle);
}
else
{
console.log('Middle: ' + middle);
while (middle != guess)
{
console.log('');
if (middle < guess)
{
start = middle + 1;
middle = Math.floor(start + (stop - start) / 2);
}
else if (middle > guess)
{
stop = middle - 1;
middle = Math.floor(start + (stop - start) / 2);
}
console.log('New bounds: ' + start + '-' + stop);
console.log('New middle: ' + middle);
}
alert("Your answer is : " + middle);
}
}
}
见JSFiddle。
答案 3 :(得分:0)
您应该只创建一个函数并根据输入值对其进行测试。首先让我们用HTML做点什么:
<input type='text' value='', id='number' />
<input type='button' value='play game' id='game' />
<div id='result'>To play the game press the button.</div>
现在在外部JavaScript页面上,应该通过脚本标记src
属性:
var pre = onload;
onload = function(){
if(pre)pre();
var doc = document;
function E(e){
return doc.getElementById(e);
}
function numberGame(numberElement, start, finish){
var u = +numberElement.value, r = '';
if(u < start){
r = 'Number was too low.'; numberElement.focus()
}
else if(u < finish){
r = 'Number was too high.'; numberElement.focus();
}
else if(u === Math.floor(Math.random()*(finish+1))){
r = 'It's a match!';
}
else{
r = 'Try again.'; numberElement.focus();
}
return r;
}
E('game').onclick = function(){
E('result').innerHTML = numberGame(E('number'), 0, 100);
}
}