2012-05-16 83 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:不客氣。很高興我能幫上忙 :-) –