C#表单,尝试使用计时器将随机图片框更改为随机图像

时间:2018-05-18 16:17:19

标签: c# forms

我想做的是:

我希望我在表格中获得的4张图片框可以获得卡片的面孔 - 我将其翻过来。将选择4中的随机牌,翻过来并显示被选中的牌的脸也随机。

一旦卡被翻转,它就无法在下一个计时器间隔内再次出现,并且一旦所有卡被翻转,就会出现一个消息框,一旦用户按下确定,它就会重新启动。

问题是:由于标志正值,messageBox一直反复出现。我不知道应该使用哪个变量来防止这种情况发生。

相关代码:

//This function is the timer's function, it starts every time interval:
    private void cardsChangingTimer_Tick(object sender, EventArgs e)
    {
        int chosenImage = rnd.Next(1, 17);
        int chosenCard = rnd.Next(0, 4);
        if (bucketArr[chosenCard] == 0)
        {
            bucketArr[chosenCard]++;
            switch (chosenCard)
            {
                case 0:
                    card1Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 1:
                    card2Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 2:
                    card3Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;
                case 3:
                    card4Pic.Image = Image.FromFile("cards\\" + chosenImage + ".png");
                    break;

            }
        }
        gameEnded = true;
        for (int i = 0; i < bucketArr.Length; i++) 
        {
            if (bucketArr[i] == 0)
            {
                gameEnded = false;
                break;
            }
        }
        if (gameEnded)
        {
            DialogResult dialog = MessageBox.Show("All 4 cards were turned over...");
            if (dialog == DialogResult.OK)
            {
                card1Pic.Image = Image.FromFile("..\\..\\17.png");
                card2Pic.Image = Image.FromFile("..\\..\\17.png");
                card3Pic.Image = Image.FromFile("..\\..\\17.png");
                card4Pic.Image = Image.FromFile("..\\..\\17.png");
            }
            gameEnded = false;
            for(int i = 0; i < bucketArr.Length; i++)
                bucketArr[i] = 0;
        }
    }

非常感谢您的帮助...

1 个答案:

答案 0 :(得分:0)

您遇到的问题是在显示对话框时计时器继续运行。只需在显示MessageBox之前停止计时器,然后在框返回后重新启动计时器。

private void cardsChangingTimer_Tick(object sender, EventArgs e)
{
    int chosenImage = rnd.Next(1, 17);
    int chosenCard = rnd.Next(0, 4);

    /// ... Rest of the code goes here

            break;
        }
    }
    if (gameEnded)
    {
        //Get a reference to the timer and stop it.
        var timer = (Timer)sender;
        timer.Stop();

        DialogResult dialog = MessageBox.Show("All 4 cards were turned over...");
        if (dialog == DialogResult.OK)
        {
            card1Pic.Image = Image.FromFile("..\\..\\17.png");
            card2Pic.Image = Image.FromFile("..\\..\\17.png");
            card3Pic.Image = Image.FromFile("..\\..\\17.png");
            card4Pic.Image = Image.FromFile("..\\..\\17.png");
        }
        gameEnded = false;
        for(int i = 0; i < bucketArr.Length; i++)
            bucketArr[i] = 0;

        //start the timer here after everything has been re-initialized.
        timer.Start();
    }
}