5章:チュートリアル 4: 絵合わせゲームの作成

    作成2013.02.24

  1. チュートリアル 4: 絵合わせゲームの完成ファイル
     チュートリアル 4: 絵合わせゲームの作成の解説とおりに作業を実施すると、プロジェクトファイル群が完成します。
     完成ファイルは以下からダウンロードできます。
     ダウンロード後は解凍してから使用してください。
     
    [チュートリアル 4: 絵合わせゲーム]をダウンロードする。
     解凍すると「MatchingGame」フォルダーがあります。 注(1)「MatchingGame」フォルダーのMatchingGame.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
    注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
    注(3)「ソリューションエクスプローラ」ウインドウ内の「Form1.vb」をダブルクリックすると「デザイン」が表示されます。
    注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。


  2. MatchingGameの実行
    (1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
    (2)「デバッグ」_「デバッグ開始」を選択します。
    (3)全面青の画面が表示されます。
    (4)画面内をクリックすると絵が表示されます。
    (5)続けて画面内の別の位置をクリックすると絵が表示されます。
    (6)この2つの絵が一致すると絵は消えずに残りますが、一致しないと消えます。
    (7)全ての絵が表示されれば完了です。
    (8)クローズボックスでプログラムを終了します。


  3. 新規プロジェクトの作成
     (1)新規プロジェクト
     新規プロジェクトを作成すると「デザイナー」にはForm1が自動生成されます。MatchingGameでは(Name)=Form1、Size=550、550 、Text=MatchingGameとしています。

    (2) Formコード
    Public Class Form1
    End Class
    が自動生成されます。


  4. 各種パーツの設定
    (1) パーツレイアウト
     Form1にTableLayoutPanel、Label、Timerをツールボックスから設定します。(設定方法はチュートリアル 4: 絵合わせゲームの作成に詳しく説明があります。)


  5. Public Class Form1の全コード
    Public Class Form1
        Dim random As New Random
        Dim temporaryArray() As String = {"!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z"}
        Dim icons As List(Of String) = temporaryArray.ToList
        Dim firstClicked As Label = Nothing
        Dim secondClicked As Label = Nothing
    
        Private Sub AssignIconsToSquares()
            For Each control In TableLayoutPanel1.Controls
                Dim iconLabel As Label = TryCast(control, Label)
                If iconLabel IsNot Nothing Then
                    Dim randomNumber As Integer = random.Next(icons.Count)
                    iconLabel.Text = icons.ElementAt(randomNumber)
                    iconLabel.ForeColor = iconLabel.BackColor
                    icons.RemoveAt(randomNumber)
                End If
            Next
        End Sub
    
        Public Sub New()
            InitializeComponent()
            AssignIconsToSquares()
        End Sub
    
    
        Private Sub label_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label9.Click, Label8.Click, Label7.Click, Label6.Click, Label5.Click, Label4.Click, Label3.Click, Label2.Click, Label16.Click, Label15.Click, Label14.Click, Label13.Click, Label12.Click, Label11.Click, Label10.Click, Label1.Click
            If (Timer1.Enabled = True) Then
                Return
            End If
            Dim clickedLabel As Label = TryCast(sender, Label)
            If clickedLabel IsNot Nothing Then
                If (clickedLabel.ForeColor = Color.Black) Then
                    Return
                End If
                If (firstClicked Is Nothing) Then
                    firstClicked = clickedLabel
                    firstClicked.ForeColor = Color.Black
                    Return
                End If
                secondClicked = clickedLabel
                secondClicked.ForeColor = Color.Black
                CheckForWinner()
                If (firstClicked.Text = secondClicked.Text) Then
                    firstClicked = Nothing
                    secondClicked = Nothing
                    Return
                End If
                Timer1.Start()
            End If
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Stop()
            firstClicked.ForeColor = firstClicked.BackColor
            secondClicked.ForeColor = secondClicked.BackColor
            firstClicked = Nothing
            secondClicked = Nothing
        End Sub
    
        Private Sub CheckForWinner()
            For Each control In TableLayoutPanel1.Controls
                Dim iconLabel As Label = TryCast(control, Label)
                If iconLabel IsNot Nothing Then
                    If (iconLabel.ForeColor = iconLabel.BackColor) Then
                        Return
                    End If
                End If
            Next
            MessageBox.Show("You matched all the icons!", "Congratulations")
            Close()
        End Sub
    End Class
    
    
    


  6. 変数設定の解説
        Dim random As New Random
        Dim temporaryArray() As String = {"!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z"}
        Dim icons As List(Of String) = temporaryArray.ToList
        Dim firstClicked As Label = Nothing
        Dim secondClicked As Label = Nothing
    
    ((1)Dim random As New RandomはRandomクラスを生成します。
    (2) Dim temporaryArray() As String = {"!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z"}は1次元文字型配列を生成して初期値を代入します。
    (3) Dim temporaryArray As String() = {"!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z"}としても同じ結果となります。1次元配列をどちらで生成するかは好みによります。
    (4) Dim icons As List(Of String) = temporaryArray.ToListは iconsの名称で ListクラスをString型で生成します。初期入力値はtemporaryArray.ToList(=16)となります。
    (5)Dim firstClicked As Label = NothingはfirstClickedの名称で Labelクラスを初期値= Nothingで生成します。
    ・変数の定義だけでもかなり難解です。(まいった!!)


  7. Public Sub New()の解説
        Public Sub New()
            InitializeComponent()
            AssignIconsToSquares()
        End Sub
    
    (1)Public Sub New()は、コンストラクターと呼ばれる特殊なメソッドです。 フォームの作成時に 1 回実行されます。
    (2)InitializeComponent()はPublic Sub New()を記述すると自動的に作成されます。このメソッドによって、フォームにすべてのコントロールとコンポーネントが追加され、それらのプロパティが設定されます。
    (3)AssignIconsToSquares()はAssignIconsToSquares()ルーチンを実行します。


  8. Private Sub AssignIconsToSquares()の解説
        Private Sub AssignIconsToSquares()
            For Each control In TableLayoutPanel1.Controls
                Dim iconLabel As Label = TryCast(control, Label)
                If iconLabel IsNot Nothing Then
                    Dim randomNumber As Integer = random.Next(icons.Count)
                    iconLabel.Text = icons.ElementAt(randomNumber)
                    iconLabel.ForeColor = iconLabel.BackColor
                    icons.RemoveAt(randomNumber)
                End If
            Next
        End Sub
    
    (1) For Each control In TableLayoutPanel1.Controlsにおいて、controlオブジェクトについて繰り返します。TableLayoutPanel1.Controlsグループの範囲で繰り返されます。
    (2)Dim iconLabel As Label = TryCast(control, Label)は iconLabelの名称でLabelクラスを生成します。初期値はcontrolオブジェクトをLabelオブジェクトに変換した値が代入されます。
    (3)If iconLabel IsNot Nothing Thenは iconLabelがNothingでなかったなら、以下を実行します。
    (4) Dim randomNumber As Integer = random.Next(icons.Count)はrandomNumberの名称で Integer型を生成します。初期値は0からicons.Count(=16)未満の整数型乱数です。
    (5) iconLabel.Text = icons.ElementAt(randomNumber)は iconLabel.Textに iconsのrandomNumberに対応する文字を入力します。
    (6)iconLabel.ForeColor = iconLabel.BackColorとします。(文字が見えなくなります。)
    (7) icons.RemoveAt(randomNumber)は、指定したインデックスにある icons 項目を削除します。
    ・icons.Count=16ですが、最初の乱数は0〜15の範囲となります。乱数でラベルのテキストを設定したあと、ループ処理項目から外されます。ループが繰り返されるたびに処理対称のラベルは減少して最後はゼロとなって各ラベルへの文字の割り当てが完了します。
    ・非常に難易度の高い記述内容となっています。(かなり難しい!!)

  9. Private Sub label_Clickの解説
        Private Sub label_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label9.Click, Label8.Click, Label7.Click, Label6.Click, Label5.Click, Label4.Click, Label3.Click, Label2.Click, Label16.Click, Label15.Click, Label14.Click, Label13.Click, Label12.Click, Label11.Click, Label10.Click, Label1.Click
            If (Timer1.Enabled = True) Then
                Return
            End If
            Dim clickedLabel As Label = TryCast(sender, Label)
            If clickedLabel IsNot Nothing Then
                If (clickedLabel.ForeColor = Color.Black) Then
                    Return
                End If
                If (firstClicked Is Nothing) Then
                    firstClicked = clickedLabel
                    firstClicked.ForeColor = Color.Black
                    Return
                End If
                secondClicked = clickedLabel
                secondClicked.ForeColor = Color.Black
                CheckForWinner()
                If (firstClicked.Text = secondClicked.Text) Then
                    firstClicked = Nothing
                    secondClicked = Nothing
                    Return
                End If
                Timer1.Start()
            End If
        End Sub
    
    (1)Private Sub answer_Enterは Label.Clickイベントで呼び出されます。
    (2) If (Timer1.Enabled = True) ThenはTimer1.Enabled = Trueのとき無処理でルーチンを抜けます。
    (3)Timer1.Enabled = Trueでないとき、以下の処理を実行します。
    (4) Dim clickedLabel As Label = TryCast(sender, Label)は clickedLabelの名称でLabel クラスを生成します。初期値は実際にクリックされたラベルの値をコピーします。
    (5)If clickedLabel IsNot Nothing ThenはclickedLabelが Nothingでなかったら以下を実行します。
    (6) If (clickedLabel.ForeColor = Color.Black) ThenはForeColorが黒だったら無処理でルーチンを抜けます。
    (7)そうでなかったら If (firstClicked Is Nothing) ThenはfirstClickedがNothingだったら以下を実行します。
    (8) firstClicked = clickedLabelとします。
    (9)firstClicked.ForeColor = Color.BlackはForeColorを黒にします。そしてルーチンを抜けます。
    (10)firstClickedがNothingで無い場合、secondClicked = clickedLabelとします。
    (11)secondClicked.ForeColor = Color.BlackはForeColorを黒にします。
    (12) CheckForWinner()は終了確認処理を実行します。
    (13)If (firstClicked.Text = secondClicked.Text) ThenはfirstClicked.Text = secondClicked.Textのとき以下を実行します。
    (14) firstClicked = NothingとsecondClicked = Nothingを実行します。
    (15)Timer1.Start()はTimer1をスタートします。


  10. Private Sub Timer1_Tickの解説
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Timer1.Stop()
            firstClicked.ForeColor = firstClicked.BackColor
            secondClicked.ForeColor = secondClicked.BackColor
            firstClicked = Nothing
            secondClicked = Nothing
        End Sub
    
    (1)Private Sub Timer1_Tickはデザイナーから自動生成されます。
    (2)Timer1.Tickイベントで呼び出されます。(指定したタイマの間隔が経過し、タイマが有効である場合に発生します。 )
    (3)Timer1.Stop()はTimer1停止します。
    (4)secondClicked.ForeColor = secondClicked.BackColorは見えなくします。
    (5)secondClicked.ForeColor = secondClicked.BackColorも見えなくします。
    (6)firstClicked = Nothing、secondClicked = Nothingとします。


  11. Private Sub CheckForWinner()の解説
         Public Function CheckTheAnswer() As Boolean
            If ((addend1 + addend2 = sum.Value) AndAlso (minuend - subtrahend = difference.Value) AndAlso (multiplicand * multiplier = product.Value) AndAlso (dividend / divisor = quotient.Value)) Then
                Return True
            Else
                Return False
            End If
        End Function
    
    (1) For Each control In TableLayoutPanel1.Controlsにおいて、controlオブジェクトについて繰り返します。TableLayoutPanel1.Controlsグループの範囲で繰り返されます。
    (2)Dim iconLabel As Label = TryCast(control, Label)は iconLabelの名称でLabelクラスを生成します。初期値はcontrolオブジェクトをLabelオブジェクトに変換した値が代入されます。
    (3)If iconLabel IsNot Nothing Thenは iconLabel がNothingでなかったら以下を実行します。
    (4)If (iconLabel.ForeColor = iconLabel.BackColor) ThenはiconLabel.ForeColor = iconLabel.BackColorだったらルーチンから抜けます。
    (5) MessageBox.Show("You matched all the icons!", "Congratulations")は終了のメッセージボックスを表示します。
    (6)Close()でプログラムを終了します。

    感想:かなり難易度の高いコードを使用しています。最初に難解と思った TryCast関数もやさしく思えるから不思議です。







6章:チュートリアル 5:Visual Basicのクラス構造テストの作成に行く。

トップページに戻る。