需要帮助修复蛇游戏中的错误

时间:2014-09-24 18:04:46

标签: c# winforms

所以我成功创造了一个功能很好的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游戏。谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

你拥有的实际上是一个“功能”。你希望能够向下然后离开,但是你在计时器滴答声中这样做,导致“错误”。

这意味着您需要等待来改变方向。您的代码变为:

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

...

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

现在,您可以按任意数量的键(有效),最后一个键将在计时器勾号上生效,这将允许下一次按键(左)正常工作。

答案 1 :(得分:0)

我不知道你如何储存蛇的位置,但我会核实每按一个箭头,那个方向的位置与蛇的头部位置不同,否则你可以忽略那个按键。