2014-09-24 256 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

我不知道你如何存储蛇的位置,但我会验证对于每个箭头按下,该方向上的位置不同于蛇的头部位置,否则你可以忽略该按键。