none
如何讓timer+imagelist隨機產生的六個圖不重複呢? RRS feed

  • 問題

  • http://imgur.com/2AakeZL

    上面是我執行的結果

    下面是程式碼

    private void timer1_Tick(object sender, EventArgs e)

    { intSpinCount++; if (intSpinCount<= 20)

    { // 轉動中; Random rnd = new Random();

    int intIndex = rnd.Next(imageList1.Images.Count); //0到imageList1.Images.Count隨機取一;

    2~6省略 pictureBox1.Image = imageList1.Images[intIndex]; 2~6省略

    }

    else { // 停止; //隨機取值;

    Random rnd = new Random();

    int myIndex= rnd.Next(imageList1.Images.Count); //0到imageList1.Images.Count隨機取一;

    2~6省略

    pictureBox1.Image = imageList1.Images[myIndex];

    timer1.Enabled = false;

    ifSpin = false;

    btnAnimateImage.Enabled = true;

    btnAnimateImage.Text = "動態切換圖片";

    打算加入下面這段來讓圖片彼此間不重複

     List<ImageList> list = new List<ImageList>();
                list.Add(imageList1);

                Random r = new Random();

                var shuffledList = list.OrderBy(a => r.Next());

                for (int i = 0; i < 6; i++)
                {
                    shuffledList.ElementAt(i).Images = imageList1.Images.Count(i);
                }

    shuffledList.ElementAt(i).Images = imageList1.Images.Count(i);可是這段我再怎麼修改都不會過...請求協助修改 謝謝


    2014年4月17日 上午 09:59

解答

  • 利用一個集合儲存 0~5 的值, 所以初始情形 值和 Index 是對應的

    然後做一個 0~5 的迴圈, 回圈內產生亂數

    假設 i=0 , 亂數值=3

    則把集合中的 Index 0 和 Index 3 中的元素調換

    i=1, 亂數值=3

    把集合中 Index  1 和 Index 3 中的元素調換

    i=2, 亂數值=0

    把集合中 Index=2 和 Index 0 中的元素調換..以此類推, 就不會重複


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已提議為解答 Alex_Lee 2014年4月18日 下午 02:27
    • 已標示為解答 songsongsong 2014年4月22日 上午 01:45
    2014年4月18日 上午 07:14
    版主

所有回覆

  • 可以參考以下程式碼:

               List<int> list = new List<int>();
                for (int i = 0; i < imageList1.Images.Count; i++)
                {
                    list.Add(i);
                }
                Random r = new Random();
                var shuffledList = list.OrderBy(a => r.Next());
    
                pictureBox1.Image = imageList1.Images[shuffledList.ElementAt(0)];
                pictureBox2.Image = imageList1.Images[shuffledList.ElementAt(1)];
                pictureBox3.Image = imageList1.Images[shuffledList.ElementAt(2)];
                pictureBox4.Image = imageList1.Images[shuffledList.ElementAt(3)];
                pictureBox5.Image = imageList1.Images[shuffledList.ElementAt(4)];
                pictureBox6.Image = imageList1.Images[shuffledList.ElementAt(5)];

    2014年4月17日 上午 11:18
  • 可否解釋 "怎麼修改都不會過" 的具體說明 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年4月17日 下午 03:49
    版主
  • 程式這樣寫, 1~6應該會得到相同的圖:

    private void timer1_Tick(object sender, EventArgs e)
    {
       intSpinCount++;
       if (intSpinCount<= 20)
       {
           // 轉動中;
          Random rnd = new Random();

          int intIndex = rnd.Next(imageList1.Images.Count); //0到imageList1.Images.Count隨機取一;
          2~6省略

          pictureBox1.Image = imageList1.Images[intIndex];
          2~6省略
       }
    }

    另外建立Random類別的變數時若未指定亂數種子, 建立變數後呼叫Next會得到相同的數值, 請參考:[C#]不同的Random物件給予不同的亂數種子

    • 已編輯 tihsMVP 2014年4月18日 上午 03:56
    2014年4月18日 上午 03:56
  • shuffledList.ElementAt(i).Images = imageList1.Images.Count(i);

    shuffledList跟imageList1 不論如何更改,一定有一邊是有錯誤的

    2014年4月18日 上午 06:43
  • shuffledList.ElementAt(i).Images = imageList1.Images.Count(i);

    shuffledList跟imageList1 不論如何更改,一定有一邊是有錯誤的


    甚麼樣的錯誤? 是資料對應不上, 還是 nullrefrence 還是其他甚麼 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2014年4月18日 上午 06:45
    版主
  • 謝謝提供,有指定亂數種子可圖片還是會重複
    2014年4月18日 上午 06:54
  • 您好,因為小弟是新手,對專有名詞不瞭解,這邊就把VISUAL STUDIO 2012顯示的錯原因貼上來

    shuffledList.ElementAt(i).Images = imageList1.Images.Count(i);

     .............................................................................  ^^^^^^^^^^^^^^^^這段錯誤

    錯誤 2 'System.Windows.Forms.ImageList.ImageCollection' 不包含 'Count' 的定義,也找不到擴充方法 'Count' 來接受型別 'System.Windows.Forms.ImageList.ImageCollection' 的第一個引數 (您是否遺漏 using 指示詞或組件參考?) C:\Users\iii\Documents\Visual Studio 2012\Projects\WindowsFormsApplication13\WindowsFormsApplication13\Form1.cs 75 52 WindowsFormsApplication13

    shuffledList.ElementAt(i).Images = imageList1.Images(i);

    ......................................................................................................^^^^^^

    把COUNT去掉後

    錯誤 2 非可叫用 (Non-invocable) 成員 'System.Windows.Forms.ImageList.Images' 不能做為方法使用。 C:\Users\iii\Documents\Visual Studio 2012\Projects\WindowsFormsApplication13\WindowsFormsApplication13\Form1.cs 75 63 WindowsFormsApplication13



    2014年4月18日 上午 07:09
  • 可以參考以下程式碼:

               List<int> list = new List<int>();
                for (int i = 0; i < imageList1.Images.Count; i++)
                {
                    list.Add(i);
                }
                Random r = new Random();
                var shuffledList = list.OrderBy(a => r.Next());
    
                pictureBox1.Image = imageList1.Images[shuffledList.ElementAt(0)];
                pictureBox2.Image = imageList1.Images[shuffledList.ElementAt(1)];
                pictureBox3.Image = imageList1.Images[shuffledList.ElementAt(2)];
                pictureBox4.Image = imageList1.Images[shuffledList.ElementAt(3)];
                pictureBox5.Image = imageList1.Images[shuffledList.ElementAt(4)];
                pictureBox6.Image = imageList1.Images[shuffledList.ElementAt(5)];

    你好,照您提供的版本修改後還是一樣會重複@@"
    2014年4月18日 上午 07:11
  • 利用一個集合儲存 0~5 的值, 所以初始情形 值和 Index 是對應的

    然後做一個 0~5 的迴圈, 回圈內產生亂數

    假設 i=0 , 亂數值=3

    則把集合中的 Index 0 和 Index 3 中的元素調換

    i=1, 亂數值=3

    把集合中 Index  1 和 Index 3 中的元素調換

    i=2, 亂數值=0

    把集合中 Index=2 和 Index 0 中的元素調換..以此類推, 就不會重複


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已提議為解答 Alex_Lee 2014年4月18日 下午 02:27
    • 已標示為解答 songsongsong 2014年4月22日 上午 01:45
    2014年4月18日 上午 07:14
    版主