试图避免显示相同的图像两次

本文关键字:图像 两次 显示 | 更新日期: 2023-09-27 17:50:34

我正在使用图片框显示图像,并以一秒的间隔计时。我试图避免连续两次显示相同的图像,并使用数组列表来做到这一点,以避免相同的随机图像跟随在另一个。

这就是我所做的。工作不像我预期的那样好,最终得到一个异常。如何改进这一点,以避免连续两次显示相同的图像?

Random random = new Random();
        ArrayList imagesList = new ArrayList();
        Image[] images = { imageOne, imageTwo, imageThree, imageFour, imageFive, imageSix, imageSeven };
        do
        {
            try
            {
                for (int i = 0; i < images.Length; i++)
                {
                    imagesList.Add(images[random.Next(0, 7)]);
                    while (imagesList.Contains(images[i]))
                    {
                        imagesList.Clear();
                        imagesList.Add(images[random.Next(0, 7)]);     
                    }
                    picImage.Image = (Image)imagesList[0];
                }
                Thread.Sleep(1000);
            }
            catch (IndexOutOfRangeException ind)
            {
                MessageBox.Show(ind.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception exe)
            {
                MessageBox.Show(exe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        } while (true);
    }

试图避免显示相同的图像两次

您可以进行洗牌而不是获得随机数。这样,您就不需要每次检查图像是否已经被使用。看看这里如何洗牌一个数组:http://www.dotnetperls.com/shuffle。现在你可以循环遍历数组,它现在是随机化的,你不会得到重复项。

我猜你使用睡眠是为了避免每次都得到相同的随机值?你现在可以把它删掉。除此之外,它还会阻塞UI

重新排列图片:

Image[] randomOrder = images.OrderBy(i => Guid.NewGuid()).ToArray();

并遍历该数组

您还需要使用计时器来更改图像,因为您当前正在阻塞UI线程。System.Windows.Forms.Timer是合适的。计时器的Tick事件处理程序看起来像这样:

private int index = 0;
private void Timer_Tick(Object sender, EventArgs args) 
{
  picImage.Image = randomOrder[index % randomOrder.Length];
  index++;
}

这个Timer类的MSDN示例代码也很有帮助。请注意,框架中有几个可用的Timer类,这个可能是这里最好的。