手順 3: 各ラベルへのランダムなアイコンの割り当て
ゲームで、いつも同じ場所に同じアイコンが隠されていたのでは、やりがいがありません。フォームの Label コントロールに、アイコンをランダムに割り当てる必要があります。そのためには、AssignIconsToSquares() メソッドを追加します。
各ラベルにランダムなアイコンを割り当てるには
次のコードを追加する前に、メソッドのしくみについて検討します。新しいキーワード foreach (Visual C# の場合) および For Each (Visual Basic の場合) があります (1 つの行は意図的にコメント アウトされています。これについてはこの手順の最後に説明します)。
''' <summary> ''' Assign each icon from the list of icons to a random square ''' </summary> ''' <remarks></remarks> Private Sub AssignIconsToSquares() ' The TableLayoutPanel has 16 labels, ' and the icon list has 16 icons, ' so an icon is pulled at random from the list ' and added to each label For Each control In TableLayoutPanel1.Controls Dim iconLabel = TryCast(control, Label) If iconLabel IsNot Nothing Then Dim randomNumber = random.Next(icons.Count) iconLabel.Text = icons(randomNumber) ' iconLabel.ForeColor = iconLabel.BackColor icons.RemoveAt(randomNumber) End If Next End Sub
/// <summary> /// Assign each icon from the list of icons to a random square /// </summary> private void AssignIconsToSquares() { // The TableLayoutPanel has 16 labels, // and the icon list has 16 icons, // so an icon is pulled at random from the list // and added to each label foreach (Control control in tableLayoutPanel1.Controls) { Label iconLabel = control as Label; if (iconLabel != null) { int randomNumber = random.Next(icons.Count); iconLabel.Text = icons[randomNumber]; // iconLabel.ForeColor = iconLabel.BackColor; icons.RemoveAt(randomNumber); } } }
前の手順で示されているように、AssignIconsToSquares() メソッドを追加します。このメソッドを、「手順 2: Random オブジェクトおよびアイコンのリストの追加」で追加したコードのすぐ下に配置できます。
AssignIconsToSquares() メソッドに新しいものが含まれています。つまり、foreach ループ (Visual C# の場合) および For Each (Visual Basic の場合) です。For Each ループは、同じ処理を繰り返し実行する必要がある場合にいつでも使用できます。ここでは、次のコードで説明されているように、TableLayoutPanel のラベルごとに同じステートメントを実行する必要があります。最初の行はそのコントロールに実行するループ内のステートメントがあるときにcontrol という名前の各コントロールを一つずつ格納する変数を作成します。
For Each control In TableLayoutPanel1.Controls ' The statements you want to execute ' for each label go here ' The statements use iconLabel to access ' each label's properties and methods Next
foreach (Control control in tableLayoutPanel1.Controls) { // The statements you want to execute // for each label go here // The statements use iconLabel to access // each label's properties and methods }
[!メモ]
iconLabel および control という名前が使用されているのは、わかりやすくするためです。任意の名前とこれらの名前を置換できます。ループ内の各ステートメントの名前を変更した場合はとまったく同じように動作します。
AssignIconsToSquares() メソッドは、TableLayoutPanel の各 Label コントロールを処理し、それぞれに対し同じステートメントを実行します。これらのステートメントは、「手順 2: Random オブジェクトおよびアイコンのリストの追加」で追加したリストからランダムなアイコンを取得します (リストに各アイコンを 2 つずつ含め、ランダムな Label コントロールにアイコンのペアが割り当てられるようにしたのはこのためです)。
foreach または For Each のループ内の製品コードを注意して見てください。このコードはここに実行されます。
Dim iconLabel = TryCast(control, Label) If iconLabel IsNot Nothing Then Dim randomNumber = random.Next(icons.Count) iconLabel.Text = icons(randomNumber) ' iconLabel.ForeColor = iconLabel.BackColor icons.RemoveAt(randomNumber) End If
Label iconLabel = control as Label; if (iconLabel != null) { int randomNumber = random.Next(icons.Count); iconLabel.Text = icons[randomNumber]; // iconLabel.ForeColor = iconLabel.BackColor; icons.RemoveAt(randomNumber); }
最初の行は iconLabel という名前の Label に control の変数をに変換します。変換をチェックする if のステートメントを含む) は発表しました。変換が if の場合ステートメント内のステートメントが実行されます。if のステートメントの最初の行は randomNumber という名前のアイコンのリスト内の項目の 1 種類に対応する乱数を格納する変数を作成します。これを行うには前の手順で作成した Random のオブジェクトの Next のメソッドを使用します。Next のメソッドは乱数。この行は乱数を選択する範囲を決定するために icons の一覧に Count のプロパティを使用します。次の行はラベルのプロパティに Text のアイコンのリスト項目が 1 になります。コメント行はこのトピックの後半で説明します。最後に一覧から if ステートメントの最後の行の削除がフォームに追加されるアイコン。
コードの一部の処理についてよく覚えていない場合コード要素の上にマウス ポインターをの上に置きの情報を確認できます注意してください。
プログラムが起動したらすぐに AssignIconsToSquares() メソッドを呼び出す必要があります。Visual C# コードを記述している場合は、Form1 コンストラクターの InitializeComponent() メソッドの呼び出しのすぐ下にステートメントを追加し、フォームが新しいメソッドを呼び出してフォーム自体の設定後に表示されるようにします。
public Form1() { InitializeComponent(); AssignIconsToSquares(); }
Visual Basic の場合は、最初にコンストラクターを追加してから、コンストラクターにメソッド呼び出しを追加します。作成した AssignIconsToSquares() メソッドの前に、コード Public Sub New() を入力することから始めます。Enter キーを押して次の行に移動すると、IntelliSense により、次のコードが表示され、コンストラクターが完成します。
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call End Sub
コンストラクターが次のようになるように、AssignIconsToSquares() メソッドの呼び出しを追加します。
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call AssignIconsToSquares() End Sub
プログラムを保存し、実行します。各ラベルに割り当てられたランダムなアイコンを備えたフォームが表示されます。
いったんプログラムを終了して、再び実行します。次の図に示すように、各ラベルに別のアイコンが割り当てられます。
ランダムなアイコンが表示された絵合わせゲーム
プログラムを停止して、For Each ループ内のコード行をコメントから外します。
iconLabel.ForeColor = iconLabel.BackColor
iconLabel.ForeColor = iconLabel.BackColor;
ツール バーの [すべて保存] をクリックし、プログラムを保存したうえで実行します。アイコンが非表示になったように見えます。青い背景のみが表示されます。ただし、アイコンはランダムに割り当てられて、そこに存在しています。アイコンは、背景と同じ色であるため、見えなくなっています。
続行または確認するには
チュートリアルの次の手順に進むには、「手順 4: 各ラベルへの Click イベント ハンドラーの追加」を参照してください。
チュートリアルの前の手順に戻るには、「手順 2: Random オブジェクトおよびアイコンのリストの追加」を参照してください。