C# 代码必须先做一件事,然后等待几秒钟,然后继续
我正在做一个记忆游戏,我想,当两张卡片被点击时,它们会再次转身,并在背后晃来晃去。正如您在我的代码中看到的,我正在计算点击次数,当“NumberOfCLicks”点击2时,就会调用“resetCards”方法。它执行它应该执行的操作,转动两张牌,但在再次转动前不会先显示第二张牌的正面 我的代码:C# 代码必须先做一件事,然后等待几秒钟,然后继续,c#,wpf,C#,Wpf,我正在做一个记忆游戏,我想,当两张卡片被点击时,它们会再次转身,并在背后晃来晃去。正如您在我的代码中看到的,我正在计算点击次数,当“NumberOfCLicks”点击2时,就会调用“resetCards”方法。它执行它应该执行的操作,转动两张牌,但在再次转动前不会先显示第二张牌的正面 我的代码: public class MemoryGrid { private Grid grid; private int rows, cols; public MemoryGrid(G
public class MemoryGrid
{
private Grid grid;
private int rows, cols;
public MemoryGrid(Grid grid, int rows, int cols)
{
this.grid = grid;
this.rows = rows;
this.cols = cols;
InitializeGrid();
AddImages();
}
private void InitializeGrid()
{
for (int i = 0; i < rows; i++)
{
grid.RowDefinitions.Add(new RowDefinition());
}
for (int i = 0; i < cols; i++)
{
grid.ColumnDefinitions.Add(new ColumnDefinition());
}
}
private void AddImages()
{
List<ImageSource> images = GetImagesList();
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
Image back = new Image();
back.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
back.MouseDown += new System.Windows.Input.MouseButtonEventHandler(CardClick);
back.Tag = images.First();
images.RemoveAt(0);
Grid.SetColumn(back, col);
Grid.SetRow(back, row);
grid.Children.Add(back);
}
}
}
static int numberOfClicks = 0;
private Image card;
static int score;
private Image Image1;
private Image Image2;
private void CardClick(object sender, MouseButtonEventArgs e)
{
Image card = (Image)sender;
ImageSource front = (ImageSource)card.Tag;
card.Source = front;
numberOfClicks++;
checkCards(card);
}
private void checkCards(Image card)
{
this.card = card;
if (numberOfClicks < 2 || numberOfClicks == 2)
{
if (this.Image1 == null)
{
Image1 = card;
}
else if (this.Image2 == null)
{
Image2 = card;
}
}
if (numberOfClicks == 2)
{
checkPair();
numberOfClicks = 0;
Image1 = null;
Image2 = null;
}
}
public void checkPair()
{
resetCards(Image1, Image2);
// more code here to check if the 2 cards are a pair.
// First only a reset after 2 cards.
}
private void resetCards(Image card1, Image card2)
{
this.Image1 = card1;
this.Image2 = card2;
card1.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
card2.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
}
public List<ImageSource> GetImagesList()
{
List<ImageSource> images = new List<ImageSource>();
List<string> random = new List<string>();
for (int i = 0; i < 16; i++)
{
int imageNR = 0;
Random rnd = new Random();
imageNR = rnd.Next(1, 17);
if (random.Contains(Convert.ToString(imageNR)))
{
i--;
}
else
{
random.Add(Convert.ToString(imageNR));
ImageSource source = new BitmapImage(new Uri("images/" + imageNR + ".png", UriKind.Relative));
images.Add(source);
}
}
return images;
}
}
公共类MemoryGrid
{
私有电网;
私有int行,cols;
公共内存网格(网格、整数行、整数列)
{
this.grid=grid;
this.rows=行;
this.cols=cols;
InitializeGrid();
AddImages();
}
私有void InitializeGrid()
{
对于(int i=0;i
如果我在没有构建和运行示例应用程序的情况下正确理解了案例,那么顺序是:
单击第一张卡-一切正常
单击第二张卡片:
- 它显示前面(
)card.Source=front;
- 执行
checkCards
- 执行
,因为checkPair
numberOfClicks==2
- 执行
,卡会很快显示回图像。前面的图像没有被注意到resetCards
private bool hasDelay;
private async void resetCards(Image card1, Image card2)
{
this.Image1 = card1;
this.Image2 = card2;
hasDelay = true;
await Task.Delay(2000);
card1.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
card2.Source = new BitmapImage(new Uri("/images/back.png", UriKind.Relative));
hasDelay = false;
}
有延迟时不要处理点击
private void CardClick(object sender, MouseButtonEventArgs e)
{
if (hasDelay) return;
Image card = (Image)sender;
ImageSource front = (ImageSource)card.Tag;
card.Source = front;
numberOfClicks++;
checkCards(card);
}
如果代码在显示第二张卡时只需等待而不执行任何操作,则可以简单地使用
System.Threading.Thread.Sleep(1000)代码>命令。您看到的“1000”表示它将等待1秒。2000将是2秒,以此类推。这个命令只是防止下一步在给定的时间内发生。我希望这有帮助
祝你好运
编辑:我刚听说这不管用。对不起 最简单的方法是使用以下方法:
但我建议你和我一起工作。这将为您提供一个异步进程,并且接口不会冻结。然后你可以这样做:
public static async Task TaskMethod()
{
Debug.WriteLine("Start Waiting");
Task t = Task.Run(() => DoSomething() );
}
private static void DoSomething()
{
Thread.Sleep(3000);
Console.WriteLine("Wake up !");
}
@这是真的,但是如果在UI更新之后立即放置Thread.Sleep(),它不会工作吗?不,UI代码是事件驱动的,应该使用计时器而不是sleeping@Ash啊,我不知道。谢谢你给我指明了正确的方向。Task.Delay()不是这里发明的。另外,async
方法中没有await
是a)不是真正的异步,或者b)表示编程error@ASh没错。这只是一个例子,说明异步方法如何被用于这是一个例子,说明了如何避免像魔咒一样做事情!非常感谢你!
public static async Task TaskMethod()
{
Debug.WriteLine("Start Waiting");
Task t = Task.Run(() => DoSomething() );
}
private static void DoSomething()
{
Thread.Sleep(3000);
Console.WriteLine("Wake up !");
}