C# C语言中的西蒙游戏#

C# C语言中的西蒙游戏#,c#,label,flashing,C#,Label,Flashing,我一直在用C#在windows窗体中创建游戏Simon。我有一个问题,在标签闪烁显示模式。当一个标签需要闪烁两次时(因为它在模式中出现两次),它将只闪烁一次。此外,通常情况下,标签有时不会按照其预期的正确顺序闪烁(即模式中的第二个在第一个之前闪烁)。任何关于如何解决这个问题或如何改进我的代码的帮助都是非常好的。我在过去几周才开始使用C#,这是一个大学项目的一部分。 附上了windows窗体的代码和图片。 使用系统; 使用System.Collections.Generic; 使用系统组件模型;

我一直在用C#在windows窗体中创建游戏Simon。我有一个问题,在标签闪烁显示模式。当一个标签需要闪烁两次时(因为它在模式中出现两次),它将只闪烁一次。此外,通常情况下,标签有时不会按照其预期的正确顺序闪烁(即模式中的第二个在第一个之前闪烁)。任何关于如何解决这个问题或如何改进我的代码的帮助都是非常好的。我在过去几周才开始使用C#,这是一个大学项目的一部分。 附上了windows窗体的代码和图片。

使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
名称空间Simon2
{
公共部分类Form1:Form
{
列表顺序=新列表();
随机rnd=新随机();
整数=0;
公共表格1()
{
初始化组件();
sequence.Add(rnd.Next(0,4));
嘿();
}
空嘿()
{
foreach(按顺序使用int颜色)
{
开关(彩色)
{
案例0:{
timer1.Enabled=true;
打破
}
案例1:{
timer2.Enabled=true;
打破
}
案例2:{
timer3.Enabled=true;
打破
}
案例3:{
timer4.Enabled=true;
打破
}
}
}
}
空白图案(内部颜色)
{
if(序列[编号]==颜色)
{                   
label1.Text=(“分数:”+sequence.Count);
sequence.Add(rnd.Next(0,4));
数字=0;
嘿();
}
其他的
{
MessageBox.Show(“Fail!”);
Application.Exit();
}                 
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
if(Red1.BackColor==Color.Transparent)
{
Red1.BackColor=Color.Red;
计时器1。间隔=300;
}
其他的
{
Red1.BackColor=颜色。透明;
计时器1。间隔=300;
timer1.Stop();
}
}
私有无效计时器2_刻度(对象发送方,事件参数e)
{
if(Blue1.BackColor==Color.Transparent)
{
Blue1.BackColor=Color.Blue;
时间间隔=300;
}
其他的
{
蓝色1.BackColor=颜色。透明;
时间间隔=300;
timer2.Stop();
}
}
私有无效计时器3_刻度(对象发送方,事件参数e)
{
if(Yellow1.BackColor==Color.Transparent)
{
黄色1.背景色=颜色。黄色;
时间间隔=300;
}
其他的
{
黄色1.背景色=颜色。透明;
时间间隔=300;
timer3.Stop();
}
}
私有无效计时器4u刻度(对象发送方,事件参数e)
{
if(Green1.BackColor==Color.Transparent)
{
绿色1.底色=颜色。石灰;
定时器4.间隔=300;
}
其他的
{
绿色1.BackColor=颜色。透明;
定时器4.间隔=300;
timer4.Stop();
}
}
私有无效红色单击(对象发送者,事件参数e)
{
模式(0);
}
私有无效蓝色单击(对象发送者,事件参数e)
{
模式(1);
}
私有无效黄色\u单击(对象发送者,事件参数e)
{
模式(2);
}
私有无效绿色单击(对象发送者,事件参数e)
{
模式(3);
}
}
}

我对游戏本身并不熟悉,我的理解是一盏灯接一盏灯必须点亮。 我的建议是:直接在交换机中使用Thread.sleep(当它执行任务时,UI将不会响应),而不是计时器:

switch (colour){
            case 0: {
                Red1.BackColor = Color.Red;
                Thread.Sleep(500);
                Red1.BackColor = Color.Transparent;
                break;
            }
编辑:
更好的方法是使用while循环来检查是否经过了一定数量的ms,并将Application.DoEvents()放入其中;在那里

请提供所有代码。我们不知道win forms应用程序的初始状态,例如,
InitializeComponent()
方法中的内容。否则,要复制你的场景需要大量的工作。也可以考虑把问题分解成更小的部分。问题的解决方案应该有助于将来遇到同样的问题。“C#中的Simon Game”不是一个非常具体的问题,它的解决方案可以在将来多次重复使用。为什么建议使用锁定UI的方法?这是不必要的(而且会带来令人沮丧的用户体验),只需几毫秒。我是如何理解它的?一个不需要交互的序列显示出来了(用户会注意显示的内容,而不会弄乱UI)。我认为这个项目用不同的方式做有点太多了。当然,您可以自由地提出更好的解决方案。无需重复努力:这里的快速搜索将显示如何创建非阻塞异步计时器的其他问题和答案。UI线程中的阻塞睡眠是一种反模式,您正在教授t
switch (colour){
            case 0: {
                Red1.BackColor = Color.Red;
                Thread.Sleep(500);
                Red1.BackColor = Color.Transparent;
                break;
            }