C#-需要帮助修复Snake游戏中的错误

因此,我成功创建了一个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;
}

现在,您可以按需要的任意数目的按键(有效),最后一个按键将在计时器刻度上生效,然后使下一个按键(左)正常工作.

上一篇:c#-仅在焦点位于文本框上时显示按钮


下一篇:消除C#winforms中的继承“魔术”的最佳方法?