2

画像ボックスを使用して画像を表示しており、1 秒間隔でタイミングを合わせています。同じ画像を2回続けて表示することを避けようとしています.arraylistを使用してこれを行い、同じランダムな画像が他の画像に続くのを回避しています。

これが私がやったことです。期待どおりに機能せず、最終的に例外が発生します。これを改善して、同じ画像を 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

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 に答える