2014-09-24 267 views
3

所以我成功地創建了一個貪吃蛇遊戲,除了一件我不知道如何解決的小事情之外,它的功能正常。讓我試着解釋一下。需要幫助修復貪吃蛇遊戲中的一個Bug

因此,遊戲在定時器中工作,定時器的每個刻度表示在指定方向上移動蛇的每個塊。它的工作原理是,如果你向右移動,你不能左移(因爲那時頭部會與身體相交,你會失去)。其他所有可能的方向也是如此。有一個方向變量指定蛇的當前方向。所以問題是,當你按下左鍵時,它會檢查方向是否設置正確,如果是的話,什麼都不會發生。但是如果你在同樣的時間間隔內按下下鍵然後按左鍵,那麼蛇會向左移動,你會失去。這是處理表單的KeyDown事件的代碼。

private void frmMain_KeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.KeyData) 
     { 
      case Keys.Enter: 
       if (lblMenu.Visible) 
       { 
        lblMenu.Visible = false; 
        LoadSettings(); 
        gameLoop.Start(); 
       } 
       break; 
      case Keys.Space: 
       if (!lblMenu.Visible) 
        gameLoop.Enabled = (gameLoop.Enabled) ? false : true; 
       break; 
      case Keys.S: 
       using (frmSettings f = new frmSettings()) 
       { 
        f.ShowDialog(this); 
       } 
       break; 
      case Keys.Right: 
       if (direction != Direction.Left) 
        direction = Direction.Right; 
       break; 
      case Keys.Down: 
       if (direction != Direction.Up) 
        direction = Direction.Down; 
       break; 
      case Keys.Left: 
       if (direction != Direction.Right) 
        direction = Direction.Left; 
       break; 
      case Keys.Up: 
       if (direction != Direction.Down) 
        direction = Direction.Up; 
       break; 
     } 
    } 

這是遊戲的download,如果你想體驗錯誤的第一手。感謝您的任何幫助!

+0

你可能想看看[這篇文章如何處理遊戲中的時間](http://stackoverflow.com/questions/17440555/using-timer-and-game-loop/17440807#17440807),因爲它與普通的Windows窗體編程有很大不同。有一個傳統的計時器會導致很多問題。 – nvoigt 2014-09-24 18:20:27

+0

@nvoigt這篇文章很有趣也很有幫助,我不知道這就是遊戲的功能。 – Minato 2014-09-24 18:28:23

回答

3

你有什麼實際上是一個「功能」。你希望能夠繼續下去然後離開,但是你在一個計時器滴答聲中做了這個,導致了「錯誤」。

這意味着你需要等待改變方向。您的代碼變成:

if (direction != Direction.Right) 
    intendedDirection = Direction.Left; 

... 

OnTimerTick() 
{ 
    ... 
    direction = intendedDirection; 
} 

現在,只要你想(這是有效的),你可以按許多按鍵,最後將在計時器滴答,那麼這將使接下來的按鍵效果(左)工作正確。

+0

啊,經典的「功能,而不是bug」 – tnw 2014-09-24 18:10:03

+0

@tnw嗯,代碼是正確的,只是時機關閉。這裏的功能是有效的。我可能會把它放在這樣的地方,無論什麼白癡試圖快速按下按鍵失去了遊戲:)然後,它真的會是一個功能。 – BradleyDotNET 2014-09-24 18:12:38

+0

@BradleyDotNET是的,我已經嘗試了幾乎完全相同的東西,以及只是嘗試你的想法,而它確實工作,它使遊戲流動不佳。我的意思是,有時你會很快地按下並離開,它會繼續向下移動,而不會留在下一行。我認爲我應該保留它,這是比賽的一部分吧? – Minato 2014-09-24 18:14:00

0

我不知道你如何存儲蛇的位置,但我會驗證對於每個箭頭按下,該方向上的位置不同於蛇的頭部位置,否則你可以忽略該按鍵。