在随机显示时,避免同一图像同时显示多个图标

本文关键字:显示 图标 图像 随机 | 更新日期: 2023-09-27 18:28:00

我使用此代码使用计时器一次在3个图片框中随机显示图像,现在我用文件夹中的5个图像进行测试,最初它在其中3个图片盒中正确显示不同的图像,但后来相同的图像出现在其中2个图片框,甚至其中3个显示相同的图像,如何避免在多个图片框中同时显示同一图像

public partial class Form2 : Form
    {
        Random random = new Random();
        List<String> filesToShow = new List<string>();
        List<PictureBox> pictureBoxes;
        string LoginName;
        public Form2(string userName)
        {
            InitializeComponent();
            this.LoginName = userName;
            label1.Text = "Welcome " + userName;
            timer2 = new Timer();
            pictureBoxes = new List<PictureBox> {
            pictureBox3,
            pictureBox4,
            pictureBox5
        };
            // Setup timer
            timer2.Interval = 5 * 1000; //1000ms = 1sec
            timer2.Tick += new EventHandler(timer2_Tick);
            timer2.Start();
            panelHide = panel4;
        }
        public static Panel panelHide = new Panel();
        private void ShowRandomImages()
        {
            foreach (var pictureBox in pictureBoxes)
            {
                if (filesToShow != null && !filesToShow.Any())
                {
                    filesToShow = GetFilesToShow();
                }
                if (filesToShow != null && filesToShow.Any()) // If any files then allow the code to delete the shown images
                {
                    int index = random.Next(0, filesToShow.Count);
                    string fileToShow = filesToShow[index];
                    pictureBox.ImageLocation = filesToShow[index];
                    filesToShow.RemoveAt(index);
                }
            }
        }
        private List<String> GetFilesToShow()
        {
            String str = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string path = str + "''Image''";
            return Directory.GetFiles(path, "*.jpg", SearchOption.TopDirectoryOnly).ToList();
        }
        private void timer2_Tick(object sender, EventArgs e)
        {
            if (sender == timer2)
            {
             ShowRandomImages();
            }
        }
}

提前感谢的任何帮助

在随机显示时,避免同一图像同时显示多个图标

一个非常简单的解决方案是创建一个包含所选图像的列表,并在显示新图像之前对其进行检查。

private void ShowRandomImages()
{
    List<int> selectedImages = new List<int>();
    foreach (var pictureBox in pictureBoxes)
    {
        if (filesToShow != null && !filesToShow.Any())
        {
            filesToShow = GetFilesToShow();
        }
        if (filesToShow != null && filesToShow.Any()) // If any files then allow the code to delete the shown images
        {
            int index = -1;
            if (filesToShow.Count >= pictureBoxes.Count)
            {
                bool bOk = false;
                while( !bOk )
                { 
                    index = random.Next(0, filesToShow.Count);
                    bOk = selectedImages.IndexOf(index) == -1;
                }
            }
            else
            {
                index = random.Next(0, filesToShow.Count);
            }
            selectedImages.Add(index);
            string fileToShow = filesToShow[index];
            pictureBox.ImageLocation = filesToShow[index];
            filesToShow.RemoveAt(index);
        }
    }
}

希望能有所帮助。

当然,当您在filesToShow列表中显示最后一个图像时,会发生错误,因此列表变为空,导致执行

if (filesToShow != null && !filesToShow.Any())
{
    filesToShow = GetFilesToShow();
}

之后,您的filesToShow已经删除了所有先前的图像,因此可以再次显示它们。