代码必须先做一件事,然后等待几秒钟,然后继续

约翰·范德梅尔

我正在制作一个记忆游戏,我想要,当点击 2 张卡片时,他们再次转身并背对着自己。正如您在我的代码中看到的,我正在计算点击次数,当“NumberOfCLicks”达到 2 时,将调用“resetCards”方法。它做它应该做的事情,转动两张牌,但在再次转动它们之前不会先显示第二张牌的正面。

我的代码:

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

如果我在没有构建和运行示例应用程序的情况下正确理解案例,则序列是:

点击第一张卡片 - 一切都很好

点击第二张卡片:

  • 它显示前面 ( 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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使jButton在第一次单击时做一件事,然后在第二次单击时做另一件事?

来自分类Dev

制作只做一件事的函数

来自分类Dev

如何打开一件事然后又打开另一件事

来自分类Dev

从一行中获取一件事,然后将其与另一行中的一件事连接起来

来自分类Dev

快速排序算法-做同一件事的方法有很多?

来自分类Dev

让课堂专注于做一件事-实际上

来自分类Dev

Outlook等待几秒钟然后执行

来自分类Dev

尝试在我的JavaScript代码中理解“ this”(一件事有效,另一件事无效)

来自分类Dev

HTML5 视频 - 暂停几秒钟然后继续播放

来自分类Dev

Windows用户只是一件事

来自分类Dev

用来检查URL内容并仅保留一件事的Javascript代码

来自分类Dev

在iPad上显示一件事,在Apple TV上显示另一件事?

来自分类Dev

JLabel将文本从一件事更改为另一件事

来自分类Dev

如何选择一件事,如果条件为假,则选择另一件事

来自分类Dev

为什么javascript返回另一件事,而php又返回另一件事?

来自分类Dev

“哪个”报告一件事,实际命令是另一件事

来自分类Dev

Autohotkey-热键1做某事,按键序列11做另一件事

来自分类Dev

尝试让程序等待几秒钟,然后使用Unity在C#中继续

来自分类Dev

尝试让程序等待几秒钟,然后使用Unity在C#中继续

来自分类Dev

如何让循环在第一时间做一件事而在其他时间做另一件事

来自分类Dev

如何使用流对不在索引范围内的元素做一件事而对是在范围内的元素做另一件事?

来自分类Dev

当.stream()。parallel()做同一件事时,为什么存在Collection.parallelStream()?

来自分类Dev

1个对执行3件事的存储过程的异步调用与3个对做一件事情的存储过程的异步调用?

来自分类Dev

这两段代码代表同一件事吗?有性能差异吗?

来自分类Dev

CSS选择器允许一件事,但不允许另一件事?

来自分类Dev

使用joi进行条件验证:如果属性值大于4,则执行一件事,否则执行另一件事

来自分类Dev

显示器分辨率说一件事,但显示另一件事

来自分类Dev

在正则表达式中,捕获一件事,或另一件事,或两者兼而有之

来自分类Dev

使用 onClick 调用相同的函数适用于一件事而不是另一件事?

Related 相关文章

  1. 1

    如何使jButton在第一次单击时做一件事,然后在第二次单击时做另一件事?

  2. 2

    制作只做一件事的函数

  3. 3

    如何打开一件事然后又打开另一件事

  4. 4

    从一行中获取一件事,然后将其与另一行中的一件事连接起来

  5. 5

    快速排序算法-做同一件事的方法有很多?

  6. 6

    让课堂专注于做一件事-实际上

  7. 7

    Outlook等待几秒钟然后执行

  8. 8

    尝试在我的JavaScript代码中理解“ this”(一件事有效,另一件事无效)

  9. 9

    HTML5 视频 - 暂停几秒钟然后继续播放

  10. 10

    Windows用户只是一件事

  11. 11

    用来检查URL内容并仅保留一件事的Javascript代码

  12. 12

    在iPad上显示一件事,在Apple TV上显示另一件事?

  13. 13

    JLabel将文本从一件事更改为另一件事

  14. 14

    如何选择一件事,如果条件为假,则选择另一件事

  15. 15

    为什么javascript返回另一件事,而php又返回另一件事?

  16. 16

    “哪个”报告一件事,实际命令是另一件事

  17. 17

    Autohotkey-热键1做某事,按键序列11做另一件事

  18. 18

    尝试让程序等待几秒钟,然后使用Unity在C#中继续

  19. 19

    尝试让程序等待几秒钟,然后使用Unity在C#中继续

  20. 20

    如何让循环在第一时间做一件事而在其他时间做另一件事

  21. 21

    如何使用流对不在索引范围内的元素做一件事而对是在范围内的元素做另一件事?

  22. 22

    当.stream()。parallel()做同一件事时,为什么存在Collection.parallelStream()?

  23. 23

    1个对执行3件事的存储过程的异步调用与3个对做一件事情的存储过程的异步调用?

  24. 24

    这两段代码代表同一件事吗?有性能差异吗?

  25. 25

    CSS选择器允许一件事,但不允许另一件事?

  26. 26

    使用joi进行条件验证:如果属性值大于4,则执行一件事,否则执行另一件事

  27. 27

    显示器分辨率说一件事,但显示另一件事

  28. 28

    在正则表达式中,捕获一件事,或另一件事,或两者兼而有之

  29. 29

    使用 onClick 调用相同的函数适用于一件事而不是另一件事?

热门标签

归档