投稿者 よねKEN  (社会人) 投稿日時 2009/3/30 18:58:35
#上の方の2つの(削除)は私が削除したものです。質問のコードを読み間違えて
#見当はずれなことを書いていたので削除しましたm(_ _)m

> できれば同じ処理がある所はまとめるようなシンプルな書き方にしたいのですが。
こちらについてのみコメントします。

改善すべきポイントはいくつかありますが、一遍にやろうとすると大変ですから、
まずは似た機能を関数化するところから始めましょう。

メソッドの作り方の基本的なところは以下を参照してください。
「第11回 メソッドを作る」
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard11.htm

○オリジナルのソースから以下を抜粋して関数化の流れを書いて見ます。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Randomize()
        x = Int(11 * Rnd())
               Select Case x
            Case 0
                PictureBox1.Image = PictureBox4.Image
            Case 1
                PictureBox1.Image = PictureBox5.Image
                       ・
                 ・
                 ・ 
            Case 9
                PictureBox1.Image = PictureBox13.Image
        End Select
    End Sub

○ステップ1
似たような処理はとりあえず、引数、戻り値なしのメソッドとして切り出す。
以下のような感じになります。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        SetSlotImage()
    End Sub

Private Sub SetSlotImage()
        Randomize()
        x = Int(11 * Rnd())
               Select Case x
            Case 0
                PictureBox1.Image = PictureBox4.Image
            Case 1
                PictureBox1.Image = PictureBox5.Image
                       ・
                 ・
                 ・ 
            Case 9
                PictureBox1.Image = PictureBox13.Image
        End Select
End Sub

○ステップ2
この処理はTimer1、Timer2、Timer3での処理でほとんどが同じです。
違うのは、乱数用の変数とスロットの画像のセットする対象のピクチャーボックスが違うところです。
3つの乱数用の変数x,y,zはこのままでは扱いにくいので配列にします。
x,y,zは削除して代わりに以下の宣言を追加します。

private currentSlotImageIndex(2) As Integer

x →currentSlotImageIndex(0)、y →currentSlotImageIndex(1)、z →currentSlotImageIndex(2)が対応します。
そして、SetSlotImageメソッドを改造して、どのリール(あの回転している部分の名称。言葉が正しいかはあまり自信なし)の番号を0~2で指定できるようにします。
対象(=target)のピクチャーボックスを指定できるように修正します。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        SetSlotImage(0, PictureBox1)
    End Sub

Private Sub SetSlotImage(ByVal slotIndex As Integer, ByVal target As PictureBox)
        Randomize()
        currentSlotImageIndex(slotIndex) = Int(11 * Rnd())
               Select Case currentSlotImageIndex(slotIndex)
            Case 0
                target.Image = PictureBox4.Image
            Case 1
                target.Image = PictureBox5.Image
                       ・
                 ・
                 ・ 
            Case 9
                target.Image = PictureBox13.Image
        End Select
End Sub

○ステップ3
Timer2_Tick、Timer3_Tickの処理を同様に
SetSlotImage(1, PictureBox2)、SetSlotImage(2, PictureBox3)
と書き換えることで共通化ができます。

これである程度共通化されました。しかし、まだ中途半端感のある実装ですね。
続きは考えてみてください。

また他のの改善点として気になるのは、PictureBox4.Image~PictureBox13.Imageです。
これらはPictureBox1~3に表示するイメージが準備してあるのだと思いますが、
PictureBoxを使う必要はないのではないでしょうか。
拓さんのご指摘にあるImageListコントロールを使ってもよいでしょうし、
Imageクラスの配列やリスト(コレクション)に格納しておくのでもよいでしょう。

そのためにはまずは以下の講座を熟読してみるのがよいのではないでしょうか。

「第27回 配列」
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard27.htm
「第28回 コレクション」
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard28.htm