首页 > 解决方案 > 在 C# 中意外创建了一个无限 while 循环

问题描述

所以我最近一直在为我正在创建游戏的 A-Level 编程项目学习 C#。我有一个可以在屏幕上移动的精灵,但我希望精灵在被迫停止移动之前只能移动 6 次。我认为我可以通过设置一个每次移动精灵时递减的变量(使用键盘)来做到这一点。但是,我以某种方式创建了一个我不想要的无限循环。我通过 Console.WriteLine(spaceMoved); 发现了这一点 这不会出现在我的最终代码中。我已经尝试了各种各样的事情,但我无法摆脱这个无限循环。顺便说一句,我正在 Windows 窗体应用程序中创建它。

private void Gameplay_KeyDown(object sender, KeyEventArgs e)
    {
        int spaceMoved = 6;

        do
        {
            int x = placeholder1.Location.X;
            int y = placeholder1.Location.Y;

            if (e.KeyCode == Keys.Right) x += 64;
            else if (e.KeyCode == Keys.Left) x -= 64;
            else if (e.KeyCode == Keys.Down) y += 64;
            else if (e.KeyCode == Keys.Up) y -= 64;

            placeholder1.Location = new Point(x, y);

            spaceMoved--;

            Console.WriteLine(spaceMoved);

        } while (spaceMoved > 0);

标签: c#visual-studio

解决方案


这不是一个无限循环。您的do while遗嘱执行 6 次。

但是,您似乎忽略了这样一个事实,即无论何时Gameplay_KeyDown调用它都会执行 6 次。每次,计数器都会“重置”(此处使用不精确的语言),因此它会再执行 6 次。

如果您希望在单个函数调用之外记住计数器,则必须在函数之外声明它。

这也意味着您不需要do while函数内部。每个函数都将执行一个移动(只要玩家有移动)。

这些方面的东西:

private int movesLeft = 6;

private void Gameplay_KeyDown(object sender, KeyEventArgs e)
{
    if(movesLeft > 0)
    {
        int x = placeholder1.Location.X;
        int y = placeholder1.Location.Y;

        if (e.KeyCode == Keys.Right) x += 64;
        else if (e.KeyCode == Keys.Left) x -= 64;
        else if (e.KeyCode == Keys.Down) y += 64;
        else if (e.KeyCode == Keys.Up) y -= 64;

        placeholder1.Location = new Point(x, y);

        movesLeft--;

        Console.WriteLine($"{movesLeft} moves left!");
    }
}

推荐阅读