チュートリアル: 一致するゲーム WinForms アプリにアイコンを追加する
この4つのチュートリアルシリーズでは、プレイヤーが隠されたアイコンをペアにするマッチングゲームを作成します。
一致するゲームでは、プレイヤーが四角形を選択してアイコンを表示し、別の正方形を選択します。 アイコンが一致する場合は、表示された状態が維持されます。 そうでない場合、ゲームは両方のアイコンを非表示にします。 このチュートリアルでは、ラベルにアイコンをランダムに割り当てます。 非表示に設定し、選択すると表示されます。
この 2 番目のチュートリアルでは、次の方法を学習します。
- Random オブジェクトとアイコンの一覧を追加します。
- 各ラベルにランダム なアイコンを割り当てます。
- ラベルにアイコンを表示するイベント ハンドラーを追加します。
前提 条件
このチュートリアルは、前のチュートリアル「一致するゲーム アプリケーションを作成する」に基づいています。 そのチュートリアルを行っていない場合は、まずそのチュートリアルを実行してください。
Random オブジェクトおよびアイコンのリストの追加
このセクションでは、ゲームに一致するシンボルのセットを作成します。 各シンボルは、フォーム上の TableLayoutPanel の 2 つのランダム セルに追加されます。
new
ステートメントを使用して、2 つのオブジェクトを作成します。
1 つ目は、TableLayoutPanel 内のセルをランダムに選択する Random オブジェクトです。
2 番目のオブジェクトは List<T> オブジェクトです。
ランダムに選択されたシンボルが格納されます。
Visual Studio を開きます。 [最近開いた項目] の下に MatchingGame プロジェクトが表示されます。
C# を使用している場合は Form1.cs を選択し、Visual Basic を使用している場合は Form1.vb を選択します。 その後 [ビュー]>[コード] を選択します。 別の方法として、F7 キーを選択するか、Form1 ダブルクリックします。 Visual Studio IDE には、Form1 のコード モジュールが表示されます。
既存のコードで、次のコードを追加します。
public partial class Form1 : Form { // Use this Random object to choose random icons for the squares Random random = new Random(); // Each of these letters is an interesting icon // in the Webdings font, // and each icon appears twice in this list List<string> icons = new List<string>() { "!", "!", "N", "N", ",", ",", "k", "k", "b", "b", "v", "v", "w", "w", "z", "z" };
C# を使用している場合は、必ず開始中かっこの後の、クラス宣言 (public partial class Form1 : Form
) のすぐ後に、コードを配置してください。 Visual Basic を使用している場合は、クラス宣言 (Public Class Form1
) の直後にコードを配置します。
リスト オブジェクトを使用して、さまざまな種類のアイテムを追跡できます。 リストには、数値、true/false 値、テキスト、またはその他のオブジェクトを保持できます。 一致するゲームでは、リスト オブジェクトには 16 個の文字列があり、TableLayoutPanel パネルのセルごとに 1 つ含まれます。 各文字列は、ラベル内のアイコンに対応する 1 文字です。 Webdings フォントでは、これらの文字がバスや自転車などとして表示されます。
手記
リストは、必要に応じて縮小および拡張できます。これは、このプログラムで重要です。
リストの詳細については、List<T>を参照してください。 C# の例については、A の基本的なリストの例を参照してください。 Visual Basic の例については、「単純なコレクション の使用」を参照してください。
各ラベルにランダム なアイコンを割り当てる
プログラムを実行するたびに、AssignIconsToSquares()
メソッドを使用して、フォームの Label コントロールにアイコンがランダムに割り当てられます。
このコードでは、C# のキーワード foreach
または Visual Basic の For Each
を使用します。
AssignIconsToSquares()
メソッドをForm1.cs
またはForm1.vb
に追加します。/// <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); } } }
このコードは、前のセクションで追加したコードのすぐ下に入力できます。
手記
行の 1 つは、意図的にコメント アウトされます。 手順中にあとで追加します。
AssignIconsToSquares()
メソッドは、TableLayoutPanel の各ラベル コントロールを反復処理します。
各項目について同じ一連のステートメントが実行されます。
ステートメントは、リストからランダムなアイコンを取得します。
- 最初の行は、制御 変数をラベル の iconLabelに変換します。
- 2 行目は、変換が機能したことを確認する
if
ステートメントです。 変換が機能する場合は、if
ステートメント内のステートメントが実行されます。 if
ステートメントの最初の行は、randomNumber という名前の変数を作成します。この変数には、アイコン リストの項目のいずれかに対応する乱数が含まれています。 Random オブジェクトの Next() メソッドを使用します。Next
メソッドは乱数を返します。 また、この行では、アイコン リストの Count プロパティを使用して、乱数を選択する範囲を決定します。- 次の行は、リスト アイテム アイコンの 1 つをラベルの Text プロパティに割り当てます。
- 次の行はアイコンを非表示にします。 行はここにコメントアウトされているので、続行する前にコードの残りの部分を確認できます。
if
ステートメントの最後の行は、フォームに追加されたアイコンをリストから削除します。
Form1.cs
の Form1コンストラクター に、AssignIconsToSquares()
メソッドの呼び出しを追加します。 このメソッドは、ゲームボードにアイコンを配置します。 コンストラクターは、オブジェクトの作成時に呼び出されます。public Form1() { InitializeComponent(); AssignIconsToSquares(); }
Visual Basic の場合は、
Form1.vb
のForm1_Load
メソッドにAssignIconsToSquares()
メソッドの呼び出しを追加します。Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load AssignIconsToSquares() End Sub
詳細については、「 コンストラクター (C# プログラミング ガイド) または コンストラクターとデストラクター使用する」 を参照してください。
プログラムを保存して実行します。 各ラベルにランダムなアイコンが割り当てられたフォームが表示されます。
ヒント
Webdings アイコンがフォームに正しく表示されない場合は、フォームのラベルの UseCompatibleTextRendering プロパティを true に設定します。
プログラムを閉じてから、もう一度実行します。 各ラベルには、異なるアイコンが割り当てられます。
アイコンを非表示にしていないため、アイコンが表示されるようになりました。 プレーヤーから非表示にするには、各ラベルの ForeColor プロパティを、BackColor プロパティと同じ色に設定できます。
プログラムを停止します。
AssignIconsToSquares()
メソッド内のループ内のコメントされたコード行のコメント マークを削除します。
プログラムをもう一度実行すると、アイコンが消えたようです。 青い背景のみが表示されます。 アイコンはランダムに割り当てられ、まだそこにあります。
ラベルにイベント ハンドラーを追加する
この一致するゲームでは、プレイヤーが非表示のアイコンを表示し、次に 2 番目のアイコンを表示します。 アイコンが一致する場合は、表示された状態が維持されます。 それ以外の場合は、両方のアイコンが再び非表示になります。
この方法でゲームを動作させるには、選択したラベルの色を背景に合わせて変更する Click イベント ハンドラーを追加します。
Windows フォーム デザイナーでフォームを開きます。 [Form1.cs または Form1.vb] を選択し、[ビュー>デザイナー] を選択します。
最初のラベル コントロールを選択し、それをダブルクリックして、label1 _Click() という
Click
イベント ハンドラーをコードに追加します。次に、Ctrl キー キーを押しながら、他の各ラベルを選択します。 すべてのラベルが選択されていることを確認します。
プロパティ ウィンドウで、イベント ボタン(雷の形)を選択します。 [クリック] イベントに対して、ボックス内の [label1_Click] を選択します。
Enter キーを選択します。 IDE は、Form1.cs または Form1.vbのコード label1 _Click() と呼ばれる
Click
イベント ハンドラーを追加します。 すべてのラベルを選択したため、ハンドラーは各ラベルにフックされます。残りのコードを入力します。
/// <summary> /// Every label's Click event is handled by this event handler /// </summary> /// <param name="sender">The label that was clicked</param> /// <param name="e"></param> private void label1_Click(object sender, EventArgs e) { Label clickedLabel = sender as Label; if (clickedLabel != null) { // If the clicked label is black, the player clicked // an icon that's already been revealed -- // ignore the click if (clickedLabel.ForeColor == Color.Black) return; clickedLabel.ForeColor = Color.Black; } }
手記
コードを手動で入力するのではなく、label1_Click()
コード ブロックをコピーして貼り付ける場合は、必ず既存の label1_Click()
コードを置き換えてください。
そうしないと、コード ブロックが重複することになります。
デバッグ >デバッグの開始 を選択して、プログラムを実行してください。 青い背景の空のフォームが表示されます。 フォーム内の任意のセルを選択します。 アイコンの 1 つが表示されます。 フォーム内のさまざまな場所を選択し続けます。 アイコンを選択すると、アイコンが表示されます。
次の手順
タイマーを使用してラベルを変更する方法については、次のチュートリアルに進んでください。
マッチング ゲーム でタイマーを使用する