因此,我成功创建了一个Snake游戏,除了一个我不知道如何解决的小事情之外,其他功能都很好.让我尝试解释一下.
因此,游戏在计时器上运行,计时器的每个滴答声都意味着沿指定方向移动蛇的每个块.它的工作原理是,如果您向右移动,就不能向左移动(因为头部会与身体相交而您会迷路).所有其他可能的方向也是如此.有一个direction变量,用于指定蛇的当前方向.因此,问题在于当您按向左键时,它将检查方向是否设置为正确,如果正确,则什么也不会发生.但是,如果您在相同的时间间隔内同时按下向下键和向左键,那么蛇将向左移动并且您会迷路.这是处理表单的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游戏.感谢您的任何帮助!
解决方法:
您拥有的实际上是一个“功能”.您希望能够先下降然后向左走,但是您正在计时器滴答声中执行此操作,从而导致“错误”.
这意味着您需要等待改变方向.您的代码变为:
if (direction != Direction.Right)
intendedDirection = Direction.Left;
...
OnTimerTick()
{
...
direction = intendedDirection;
}
现在,您可以按需要的任意数目的按键(有效),最后一个按键将在计时器刻度上生效,然后使下一个按键(左)正常工作.