作成2013.02.24
- チュートリアル 4: 絵合わせゲームの完成ファイル
チュートリアル 4: 絵合わせゲームの作成の解説とおりに作業を実施すると、プロジェクトファイル群が完成します。
完成ファイルは以下からダウンロードできます。
ダウンロード後は解凍してから使用してください。
[チュートリアル 4: 絵合わせゲーム]をダウンロードする。
解凍すると「MatchingGame」フォルダーがあります。
注(1)「MatchingGame」フォルダーのMatchingGame.sln」ファイルをダブルクリックすると「Microsoft Visual Basic 2010 Express」が起動します。
注(2)メニューの「ウインド」_「ウインドレイアウトのリセット」で標準に戻ります。
注(3)「ソリューションエクスプローラ」ウインドウ内の「Form1.vb」をダブルクリックすると「デザイン」が表示されます。
注(4)メニューの「表示」_「コード」を選択するとコードが表示されます。
- MatchingGameの実行
(1)「Microsoft Visual Basic 2010 Express」のデバッグ機能を使用します。
(2)「デバッグ」_「デバッグ開始」を選択します。
(3)全面青の画面が表示されます。
(4)画面内をクリックすると絵が表示されます。
(5)続けて画面内の別の位置をクリックすると絵が表示されます。
(6)この2つの絵が一致すると絵は消えずに残りますが、一致しないと消えます。
(7)全ての絵が表示されれば完了です。
(8)クローズボックスでプログラムを終了します。
- 新規プロジェクトの作成
(1)新規プロジェクト
新規プロジェクトを作成すると「デザイナー」にはForm1が自動生成されます。MatchingGameでは(Name)=Form1、Size=550、550 、Text=MatchingGameとしています。
(2) Formコード
Public Class Form1
End Class
が自動生成されます。
- 各種パーツの設定
(1) パーツレイアウト
Form1にTableLayoutPanel、Label、Timerをツールボックスから設定します。(設定方法はチュートリアル 4: 絵合わせゲームの作成に詳しく説明があります。)
- 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
- 変数設定の解説
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で生成します。
・変数の定義だけでもかなり難解です。(まいった!!)
- Public Sub New()の解説
Public Sub New()
InitializeComponent()
AssignIconsToSquares()
End Sub
(1)Public Sub New()は、コンストラクターと呼ばれる特殊なメソッドです。 フォームの作成時に 1 回実行されます。
(2)InitializeComponent()はPublic Sub New()を記述すると自動的に作成されます。このメソッドによって、フォームにすべてのコントロールとコンポーネントが追加され、それらのプロパティが設定されます。
(3)AssignIconsToSquares()はAssignIconsToSquares()ルーチンを実行します。
- 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の範囲となります。乱数でラベルのテキストを設定したあと、ループ処理項目から外されます。ループが繰り返されるたびに処理対称のラベルは減少して最後はゼロとなって各ラベルへの文字の割り当てが完了します。
・非常に難易度の高い記述内容となっています。(かなり難しい!!)
- 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をスタートします。
- 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とします。
- 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関数もやさしく思えるから不思議です。