我是C#的半新手,我决定尝试编写一个15拼图。这是我过去在Delphi(Paschal)中使用16个按钮,16个按钮点击事件和大量if语句所做的练习。这一次,我以编程方式创建了按钮,我使用了所有按钮使用的单个buttonClick方法,并且设置为检查相邻按钮并更改按钮的文本(如果空白的那个)。这个我没问题。但是,在尝试创建一个加扰器按钮时,我们在Delphi中执行它的方式是创建一个循环10,000次的外观。在循环内部,我们随机选取一个数字(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访问,作为y坐标的x cooridate和随机数intDiv 4。如果您需要任何其他信息,请告诉我们!再次感谢!
答案 0 :(得分: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.在评论中指出的那样,这是一个毫无意义的重新粉刷。
答案 1 :(得分:0)
我认为大多数“失去的时间”试图移动不可动摇的部分。
也许你可以跟踪拼图中的空白区域并使用rand.Next(4)
来决定要移动哪个相邻的棋子(如果空的空间位于一侧或者位于其中,则甚至将其细化为使用3或2一个角落)
另外,我想如果refresh
函数用于“重绘”你的棋盘,那一定是因为你想看到拼图被拼乱。如果是这样的话,如果你只移动可移动的部件而不是在移动之间有延迟,它可能看起来更流畅,因为程序试图移动不可移动的部分。另外,如果你不在乎真的看到它移动,你可以简单地“重新整理”整块板,一旦它完成了碎片。