需要帮助修复贪吃蛇游戏中的一个错误。

3
所以我成功地创建了一个贪吃蛇游戏,除了一个小问题,我不知道如何解决。让我试着解释一下。
游戏是基于定时器运作的,每个定时器的滴答声意味着将蛇的每个块移动到指定的方向。如果你向右移动,就不能向左移动(因为头部会与身体相交,你会输掉)。所有其他可能的方向也是如此。有一个方向变量指定蛇的当前方向。所以问题在于,当你按下左键时,它会检查方向是否设置为右,并且如果是,则什么都不会发生。但是,如果你在同一时间间隔内先按下下键,然后再按下左键,那么蛇就会向左移动,你就会输掉。以下是处理窗体的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;
        }
    }

这里有一个游戏下载链接,如果你想第一手体验这个漏洞,请使用。感谢您的任何帮助!

你可能想要查看关于如何处理游戏中的时间的帖子,因为它与普通的Windows Forms编程非常不同。使用传统的计时器会给你带来很多问题。 - nvoigt
@nvoigt 那篇帖子很有趣,也非常有帮助,我从来没有想到游戏可以这样运作! - Minato
2个回答

3
你遇到的问题实际上是一个“特性”。你想要向下再向左移动,但是你在计时器滴答声内执行此操作,导致了“bug”。
这意味着你需要“等待”改变方向。你的代码应该如下所示:
if (direction != Direction.Right)
   intendedDirection = Direction.Left;

...

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

现在,你可以按下任意多的键(有效的键)最后一个将在计时器滴答声时生效,这样就会允许下一次按键(向左)正确工作。

啊,经典的“特性而非缺陷”。 - tnw
@tnw 嗯,代码没问题,只是时机不对。这个功能在这里实际上是正确的。我可能会把它留下来,这样任何试图按键太快导致失败的白痴都会输掉游戏 :) 那么它真的就成为了一个功能。 - BradleyDotNET
@BradleyDotNET 是的,我尝试过几乎与此相同的方法,也尝试了你的想法,虽然它确实有效,但它会降低游戏的流畅性。我的意思是有时候你会很快地同时按下和向左移动,然后它就会在下一行继续向下移动而不是向左移动。我认为我应该保持原样,这是游戏的一部分,对吧? - Minato
1
@Minato 你不能两全其美。要么你在计时器滴答声上改变方向(并且是安全的),要么你瞬间改变方向(并且会有你所说的“bug”)。只有你知道你想要哪种方式,但你不能既要安全又要避免“bug”。我会考虑保留它,但这只是我的个人意见。 - BradleyDotNET
@BradleyDotNET 谢谢,其实我是这个网站的新手!我不知道这就是它的工作方式,所以感谢您告诉我! - Minato
@Minato 请考虑浏览一下 Stack Overflow 的导览 (http://stackoverflow.com/tour) 以获取更多信息。欢迎来到 Stack Overflow! - BradleyDotNET

0

我不知道你是如何存储蛇的位置的,但我建议验证每次按下箭头键时,该方向上的位置与蛇的“头部”位置是否不同,否则可以忽略那个按键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接