C# 尝试以随机顺序将图片读入flowlayoutpanel

C# 尝试以随机顺序将图片读入flowlayoutpanel,c#,C#,我正试图为自己制作一个类似于记忆卡游戏的程序,但出于教育目的,你要匹配这个词和这个词的定义。到目前为止,我成功地理解了以下几点: 我正在使用FlowLayoutPanel作为PictureBoxes,我有150多个单词和描述(300多张图片),因此滚动工作正常,它们彼此相邻 我可以用按钮1_单击图片面板1乘1删除,但我必须删除1个单词和1个描述,否则看起来很奇怪。只要它们成对移除,这就不是问题 我想做的和我一直坚持的是: 当我阅读图片时,我已经希望它们是随机顺序的,例如,我提供的图片只有2个单

我正试图为自己制作一个类似于记忆卡游戏的程序,但出于教育目的,你要匹配这个词和这个词的定义。到目前为止,我成功地理解了以下几点:

  • 我正在使用
    FlowLayoutPanel
    作为
    PictureBox
    es,我有150多个单词和描述(300多张图片),因此滚动工作正常,它们彼此相邻
  • 我可以用按钮1_单击图片面板1乘1删除,但我必须删除1个单词和1个描述,否则看起来很奇怪。只要它们成对移除,这就不是问题
  • 我想做的和我一直坚持的是:

    • 当我阅读图片时,我已经希望它们是随机顺序的,例如,我提供的图片只有2个单词+描述,我希望单词或描述(或两者)是随机顺序的,这样正确的一个就不必彼此相邻,但是因为它是随机的,可能发生的可能性很小(读取方式如下:pic1、pic1a、pic2、pic2a……picN、picNa)
    • 当我点击与描述相匹配的单词时(比如用名称引用它?点击pic1和pic1a),这2个
      PictureBox
      es将被删除,直到没有
      PictureBox
      es可删除为止
    它现在看起来如何,红色是我想要的颜色,例如2:

    public partial class Form1 : Form
    {
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
        }
    
    
        private void pbClick(object sender, EventArgs e)
        {
            var pictureBox = (PictureBox)sender;
            int index = flowLayoutPanel1.Controls.GetChildIndex(pictureBox);
            flowLayoutPanel1.Controls.Remove(pictureBox);
            //MessageBox.Show(index.ToString());
        }
    
        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog d = new OpenFileDialog();
    
            // allow multiple selection
            d.Multiselect = true;
    
            // filter the desired file types
            d.Filter = "JPG |*.jpg|PNG|*.png|BMP|*.bmp";
    
            // show the dialog and check if the selection was made
            if (d.ShowDialog() == DialogResult.OK)
            {
                foreach (string image in d.FileNames)
                {
                    // create a new control
                    PictureBox pb = new PictureBox();
    
                    // assign the image
                    pb.Image = new Bitmap(image);
    
                    // stretch the image
                    pb.SizeMode = PictureBoxSizeMode.StretchImage;
    
                    // set the size of the picture box
                    pb.Height = pb.Image.Height;
                    pb.Width = pb.Image.Width;
    
                    // add the control to the container
                    flowLayoutPanel1.Controls.Add(pb);
    
                    pb.Click += pbClick;
    
                }
            }
        }
    }
    


    下面的代码模拟字符串和图片将同一列表随机化两次。然后从两个随机列表中一次删除一对

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Item> items = new List<Item>() {
                    new Item() { name = "a",  number = 1 },
                    new Item() { name = "b",  number = 2 },
                    new Item() { name = "c",  number = 3 },
                    new Item() { name = "d",  number = 4 },
                    new Item() { name = "e",  number = 5 },
                    new Item() { name = "f",  number = 6 },
                    new Item() { name = "g",  number = 7 },
                    new Item() { name = "h",  number = 8 },
                    new Item() { name = "i",  number = 9 },
                    new Item() { name = "j",  number = 10 },
                };
    
                Random rand = new Random();
                List<Item> randLetters = items.Select((x, i) => new { x = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.x).ToList();
                List<Item> randNumbers = items.Select((x, i) => new { x = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.x).ToList();
    
                //delete random pairs
                for (int i = randLetters.Count - 1; i >= 0; i--)
                {
                    //find matching item in randNumbers and remove from list.
                    randNumbers = randNumbers.Where(x => x.name != randLetters[i].name).ToList();
                    randLetters.RemoveAt(i);
    
                }
            }
        }
        public class Item
        {
            public string name { get; set; }
            public int number { get; set; }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    命名空间控制台应用程序1
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    列表项=新列表(){
    新项(){name=“a”,number=1},
    新项(){name=“b”,number=2},
    新项(){name=“c”,number=3},
    新项(){name=“d”,编号=4},
    新项(){name=“e”,编号=5},
    新项(){name=“f”,number=6},
    新项(){name=“g”,number=7},
    新项(){name=“h”,number=8},
    新项(){name=“i”,number=9},
    新项(){name=“j”,number=10},
    };
    Random rand=新的Random();
    列出randLetters=items.Select((x,i)=>new{x=x,rand=rand.Next()}).OrderBy(x=>x.rand.Select(x=>x.x).ToList();
    列出randNumbers=items.Select((x,i)=>new{x=x,rand=rand.Next()}).OrderBy(x=>x.rand.Select(x=>x.x).ToList();
    //删除随机对
    对于(int i=randLetters.Count-1;i>=0;i--)
    {
    //在RandNumber中找到匹配项并从列表中删除。
    randNumbers=randNumbers.Where(x=>x.name!=randLetters[i].name.ToList();
    randLetters.RemoveAt(i);
    }
    }
    }
    公共类项目
    {
    公共字符串名称{get;set;}
    公共整数{get;set;}
    }
    }
    
    fixed and Sorry感谢您的帮助,并对您的更正进行了编辑。这样更好,我对您的帖子进行了更多的编辑。你能不能再进一步编辑一下,以便更容易理解你需要什么帮助?是的,我会尽力提供进一步的信息。感谢您的支持。我在您的代码中没有看到任何将单词图片与定义图片相关联的内容。你需要建立一种关系。