2012-05-16 39 views
1

我正在用JavaScript做蛇游戏,所以如果按下箭头键,'蛇头'应该继续朝这个方向移动。JavaScript settimeout继续走得更快,更快?

我第一次按下按键就很好,但之后头部的移动速度越来越快。

所以我想要的是每100毫秒移动一次头部的东西。如果你真的不明白我的意思,那么看看这个页面:http://www.dbzweb.be/08/braetj08/snake.html

那么,有人能告诉我如何更改我的代码,以便它保持相同的速度运行?

function init_game() { 
    if ((event ? event.keyCode : down) == (event ? 40 : 1)) /*down*/ 
    { 
     if ((snakehead + z) < z * z) { 
      right = 0; 
      left = 0; 
      up = 0; 
      down = 1; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox"; 
      snakehead = snakehead + z; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake"; 
     } else { 
      document.write("<h1>game over!</h1> press this button to try again.<br><input  type='button' value='retry'  onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>"); 
     } 
    } 
    if ((event ? event.keyCode : up) == (event ? 38 : 1)) /*up*/ 
    { 
     if ((snakehead - z) > -1) { 
      right = 0; 
      left = 0; 
      up = 1; 
      down = 0; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox"; 
      snakehead = snakehead - z; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake"; 
     } else { 
      document.write("<h1>game over!</h1> press this button to try again.<br><input type='button' value='retry' onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>"); 
     } 
    } 
    if ((event ? event.keyCode : right) == (event ? 39 : 1)) /*right*/ 
    { 
     if ((snakehead + 1) % z !== 0) { 
      right = 1; 
      left = 0; 
      up = 0; 
      down = 0; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox"; 
      snakehead = snakehead + 1; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake"; 
     } else { 
      document.write("<h1>game over!</h1> press this button to try again.<br><input  type='button' value='retry' onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>"); 
     } 
    } 
    if ((event ? event.keyCode : left) == (event ? 37 : 1)) /*left*/ 
    { 
     if (snakehead % z !== 0) { 
      right = 0; 
      left = 1; 
      up = 0; 
      down = 0; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gamebox"; 
      snakehead = snakehead - 1; 
      document.getElementsByClassName(snakehead, "div", document)[0].id = "gameboxsnake"; 
     } else { 
      document.write("<h1>game over!</h1> press this button to try again.<br><input type='button' value='retry' onclick='window.open(\"http://www.dbzweb.be/08/braetj08/snake.html\",\"_self\")'>"); 
     } 
    } 
    t = 0; 
    t = setTimeout("init_game()", 100); 
} 
+0

我downvoting这一点,因为你贴的代码难以辨认的墙。请花一些时间回顾[常见问题],并**投入您的时间**写出一个好问题,否则我不值得花时间写出一个好的答案。 – zzzzBov

+0

[缩进样式](http://en.wikipedia.org/wiki/Indent_style) –

+0

请注意:不要将字符串传递给'setTimeout',它会使用'eval'。传递函数:'t = setTimeout(init_game,100);'。 –

回答

3
t = 0; 
t = setTimeout("init_game()", 100); 

这不会做你认为它。这将变量t设置为0(此不清除超时的),然后立即将其设置为setTimeout返回的timeoutID

蛇正在加速,因为每次按下一个键时init_game都会再次运行,因此会增加超时运行的次数,从而再次调用init_game

尝试将t = 0;更改为clearTimeout(t)。您需要在代码之前声明t,但(将var t;添加到顶部)。

此外,不要传递字符串到setTimeout,它使用eval。传递函数。

clearTimeout(t); 
t = setTimeout(init_game, 100); 

注意:您document.write("<h1>game over!</h1>后,你应该添加return;停止从循环init_game(!“游戏结束”,并打印无限的消息)。

DEMO:http://jsfiddle.net/T5kPg/1/

+0

即时对不起,但我不能投票给你:s。我没有15分,但非常感谢你。 –

+0

@JannesBraet:不客气。很高兴我能帮上忙 :-) –