1

我是 C# 的半新手,我决定尝试编写一个 15 谜题。这是我过去在 Delphi (Paschal) 中使用 16 个按钮、16 个按钮单击事件和大量 if 语句完成的练习。这一次,我以编程方式创建了按钮,我使用了一个所有按钮都使用的 buttonClick 方法,它被设置为检查相邻按钮并在有空白按钮时更改按钮的文本。这个我没有问题。然而,当试图创建一个加扰器按钮时,我们在 Delphi 中的做法是创建一个循环 10,000 次的 for 外观。在循环中,我们随机选择一个数字 (0-15) 并为该按钮调用 Click 方法。显然,并非所有点击都会注册,但这样做 10,00 次足以打乱拼图。这在 Delphi 中大约需要 1 秒才能完成。在 C# 中,我很难让代码快速执行。Button.PerformClick 操作的运行速度似乎比我预期的要慢得多。有什么我做错了吗?我很感激任何帮助。谢谢!

这是争夺按钮的代码。

void scramble_Click(object sender, MouseEventArgs e)
{
    for (int i = 0; i < 1000; i++)
    {
        int temp = rand.Next(16);
        int div = temp % 4;
        int rem = temp / 4;
        buttonClick(puzzle[div, rem], new EventArgs());
        Refresh();
    }
}

这些按钮位于 4x4 网格中,并通过随机数 mod 4 访问,作为 x 坐标和随机数 intDiv 4 用于 y 坐标。如果您想了解其他信息,请告诉我!再次感谢!

4

2 回答 2

1

试试这个,可能会有所帮助:

void scramble_Click(object sender, MouseEventArgs e)
{
    EventArgs ea = new EventArgs();
    for (int i = 0; i < 1000; i++)
    {
        int temp = rand.Next(16);
        int div = temp % 4;
        int rem = temp / 4;
        buttonClick(puzzle[div, rem], ea);
    }
    Refresh();
}

您不需要为每次点击创建一个新的 EventArgs 对象,当然也不需要刷新 1000 次。正如 Ed S. 在评论中指出的那样,这是很多毫无意义的重绘。

于 2012-06-27T19:11:49.090 回答
0

我认为大部分“失去的时间”都是试图移动不可移动的部分。

也许您可以跟踪拼图中的空白空间,并使用rand.Next(4)它来决定要移动哪个相邻的块(如果空白空间位于一侧或角落,甚至可以将其细化为使用 3 或 2)

另外,我猜如果该refresh功能用于“重新绘制”您的电路板,那么一定是因为您希望看到拼图被打乱。如果是这样,如果您只移动可移动的部件而不是因为程序试图移动不可移动的部件而在移动之间有延迟,它可能看起来更流畅。否则,如果您不关心实际看到它在移动,您可以在完成拼块后简单地“重新绘制”整个电路板。

于 2012-06-27T19:14:45.940 回答