2

我正在使用图片框显示图像,并以一秒为间隔进行计时。我试图避免连续两次显示相同的图像,并使用数组列表来执行此操作以避免相同的随机图像紧随其后。

这就是我所做的。没有像我预期的那样工作得很好,最终得到了一个例外。我该如何改进以避免连续两次显示相同的图像?

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

2 回答 2

5

您可以进行随机播放而不是获取随机数。然后,您无需每次都检查图像是否已被使用。看这里,看看如何洗牌:http: //www.dotnetperls.com/shuffle。现在您可以遍历数组,它现在是随机的并且您不会得到重复。

我猜您使用 sleep 来避免每次都获得相同的随机值?你现在可以删除它。除此之外,它会阻止用户界面。

于 2013-01-04T07:50:18.147 回答
2

只需重新排序图像:

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

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

于 2013-01-04T08:04:50.683 回答