所以我成功创造了一个功能很好的Snake游戏,除了一件我不知道如何解决的小事。让我试着解释一下。
因此游戏适用于计时器,其中计时器的每个滴答都意味着沿指定方向移动蛇的每个块。它的工作原理是,如果你向右移动,你就不能向左移动(因为那时头部会与身体相交并且你会失去)。所有其他可能的方向也是如此。有一个方向变量,指定蛇的当前方向。所以问题是,当你按下左键时,它会检查方向是否设置为正确,如果是,则不会发生任何事情。但是如果你在相同的时间间隔内按下向下键然后按下左键,那么蛇将向左移动并且你将失去。这是处理表单的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;
}
}
如果你想直接体验这个bug,那么这里有一个download游戏。谢谢你的帮助!
答案 0 :(得分:3)
你拥有的实际上是一个“功能”。你希望能够向下然后离开,但是你在计时器滴答声中这样做,导致“错误”。
这意味着您需要等待来改变方向。您的代码变为:
if (direction != Direction.Right)
intendedDirection = Direction.Left;
...
OnTimerTick()
{
...
direction = intendedDirection;
}
现在,您可以按任意数量的键(有效),最后一个键将在计时器勾号上生效,这将允许下一次按键(左)正常工作。
答案 1 :(得分:0)
我不知道你如何储存蛇的位置,但我会核实每按一个箭头,那个方向的位置与蛇的头部位置不同,否则你可以忽略那个按键。