2012-06-27 32 views
1

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

这里是加扰按钮的代码。

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(); 
    } 
} 

按钮是在4×4网格,并通过随机数模4被访问时,作为x cooridate和随机数intDiv 4为y坐标。如果您想了解其他信息,请告诉我!再次感谢!

+2

你说buttonClick方法很慢....但你没有在你的文章中包含该代码。非常重要。你有没有执行任何数量的分析?什么阻止你运行一个分析器或使用简单的'StopWatch'来识别瓶颈?然后您可以回来问问如何根据需要进行优化。另外,要知道'Refresh'使得它被调用的整个控件失效,所以在这里重绘至少1000次。 –

回答

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

你甚至可以使用'EventArgs.Empty',尽管它并不重要。 –

0

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

也许你可以跟踪拼图中的空白区域,并使用​​来决定哪个相邻的棋子要移动(甚至可以将它改进为使用3或2,如果空间位于侧面或角落)

此外,我想如果refresh函数被用来“重新绘制”你的棋盘,那么它一定是因为你想看到拼图被拼凑。如果是这样,如果你只移动活动件而不是移动之间的延迟,它可能看起来更流畅,因为程序试图移动不可移动的件。否则,如果您不在意真正看到它移动,您可以在完成拼图完成后简单地“重新绘制”整个板子。