手順 5: ラベルの参照の追加Step 5: Add Label References

プログラムでは、プレーヤーがどのラベル コントロールをクリックしたかを追跡する必要があります。The program needs to track which label controls the player chooses. 現在のところ、プレーヤーが選択したすべてのラベルが表示されます。Right now, the program shows all labels chosen by the player. しかし、次のように変更します。But we're going to change that. 1 つ目のラベルがクリックされると、プログラムではラベルのアイコンを表示します。After the first label is chosen, the program should show the label's icon. 2 つ目のラベルがクリックされると、一時的に両方のアイコンを表示した後に、再びアイコンを非表示にします。After the second label is chosen, the program should display both icons for a brief time, and then hide both icons again. 参照変数を使用して、1 回目および 2 回目にどのラベル コントロールがクリックされたかを追跡します。Your program will now keep track of which label control is chosen first and which is chosen second by using reference variables.

ラベルの参照を追加するにはTo add label references

  1. 次のコードを使用して、フォームにラベルの参照を追加します。Add label references to your form by using the following code.

    Public Class Form1
    
        ' firstClicked points to the first Label control 
        ' that the player clicks, but it will be Nothing 
        ' if the player hasn't clicked a label yet
        Private firstClicked As Label = Nothing
    
        ' secondClicked points to the second Label control 
        ' that the player clicks
        Private secondClicked As Label = Nothing
    
    public partial class Form1 : Form
    {
        // firstClicked points to the first Label control 
        // that the player clicks, but it will be null 
        // if the player hasn't clicked a label yet
        Label firstClicked = null;
    
        // secondClicked points to the second Label control 
        // that the player clicks
        Label secondClicked = null;
    

    これらの参照変数は、フォームにオブジェクト (Timer オブジェクト、List オブジェクト、Random オブジェクトなど) を追加するために前に使用したステートメントに似ているように見えます。These reference variables look similar to the statements you used earlier to add objects (like Timer objects, List objects, and Random objects) to your form. ただし、これらのステートメントでは、フォームに追加の 2 つのラベル コントロールは表示されません。これは、2 つのステートメントのいずれにも new を使用していないためです。However, these statements don't cause two extra label controls to appear on the form because there's no new keyword used in either of the two statements. new キーワードを使用しないと、オブジェクトは作成されません。Without the new keyword, no object is created. firstClicked および secondClicked が参照変数と呼ばれるのはこのためです。これらは、単に Label オブジェクトを追跡 (参照) するだけです。That's why firstClicked and secondClicked are called reference variables: They just keep track (or, refer to) Label objects.

    変数は、オブジェクトを追跡していない間は、特殊な予約値 null (Visual C# の場合) および Nothing (Visual Basic の場合) に設定されます。When a variable isn't keeping track of an object, it's set to a special reserved value: null in Visual C# and Nothing in Visual Basic. そのため、プログラムが起動されると、firstClicked および secondClicked の両方が null または Nothing に設定されます。これは、変数が何も追跡していないことを意味しています。So, when the program starts, both firstClicked and secondClicked are set to null or Nothing, which means that the variables aren't keeping track of anything.

  2. 新しい firstClicked 参照変数を使用するように Click イベント ハンドラーを変更します。Modify your Click event handler to use the new firstClicked reference variable. label_Click() イベント ハンドラー メソッドの最後のステートメント (clickedLabel.ForeColor = Color.Black;) を削除し、次に示す if ステートメントに置き換えます Remove the last statement in the label_Click() event handler method (clickedLabel.ForeColor = Color.Black;) and replace it with the if statement that follows. (必ずコメントと if ステートメント全体を含めてください)。(Be sure you include the comment, and the whole if statement.)

    ''' <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>
    ''' <remarks></remarks>
    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
    
        Dim clickedLabel = TryCast(sender, Label)
    
        If clickedLabel IsNot Nothing Then
    
            ' If the clicked label is black, the player clicked
            ' an icon that's already been revealed --
            ' ignore the click
            If clickedLabel.ForeColor = Color.Black Then Exit Sub
    
            ' If firstClicked is Nothing, this is the first icon 
            ' in the pair that the player clicked, 
            ' so set firstClicked to the label that the player
            ' clicked, change its color to black, and return
            If firstClicked Is Nothing Then
                firstClicked = clickedLabel
                firstClicked.ForeColor = Color.Black
                Exit Sub
            End If
        End If
    
    End Sub
    
    /// <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 label_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;
    
            // If firstClicked is null, this is the first icon 
            // in the pair that the player clicked,
            // so set firstClicked to the label that the player 
            // clicked, change its color to black, and return
            if (firstClicked == null)
            {
                firstClicked = clickedLabel;
                firstClicked.ForeColor = Color.Black;
    
                return;
            }
        }
    }
    
  3. プログラムを保存し、実行します。Save and run your program. いずれかのラベル コントロールをクリックすると、そのアイコンが表示されます。Choose one of the label controls, and its icon appears.

  4. 次のラベル コントロールをクリックすると、何も起こらないことに気付きます。Choose the next label control, and notice that nothing happens. プログラムでは、プレーヤーがクリックした 1 つ目のラベルが既に追跡されているため、firstClickednull (Visual C# の場合) または Nothing (Visual Basic の場合) ではありません。The program is already keeping track of the first label that the player chose, so firstClicked isn't equal to null in Visual C# or Nothing in Visual Basic. if ステートメントは、firstClickednull または Nothing かどうかをチェックし、そうでないことがわかった場合は、if ステートメント内のステートメントを実行しません。When your if statement checks firstClicked to determine if it's equal to null or Nothing, it finds that it isn't, and it doesn't execute the statements in the if statement. そのため、次の図に示すように、クリックされた 1 つ目のアイコンのみが黒になり、他のアイコンは非表示になります。So, only the first icon that's chosen turns black, and the other icons are invisible, as shown in the following picture.

    1 つのアイコンが表示された絵合わせゲームMatching game showing one icon
    1 つのアイコンが表示された絵合わせゲームMatching game showing one icon

    この状況は、チュートリアルの次のステップで Timer コントロールを追加することで修正します。You'll fix this situation in the next step of the tutorial by adding a Timer control.

続行または確認するにはTo continue or review