Schritt 5: Hinzufügen von Bezeichnungsverweisen

Das Programm muss nachverfolgen, welches Bezeichnungsfeld der Spieler wählt.Bisher zeigt das Programm alle Bezeichnungsfelder an, die der Spieler ausgewählt hat.Wir werden das ändern.Nachdem das erste Bezeichnungsfeld gewählt wurde, sollte das Programm das Symbol im Bezeichnungsfeld anzeigen.Nachdem das zweite Bezeichnungsfeld ausgewählt ist, sollte das Programm beide Symbole für eine kurze Zeit anzeigen und dann beide wieder ausblenden.Das Programm verfolgt nun mithilfe von Verweisvariablen, welches Bezeichnungsfeld zuerst und welches danach gewählt wird.

So fügen Sie Bezeichnungsverweise hinzu

  1. Fügen Sie dem Formular Bezeichnungsverweise hinzu, indem Sie den folgenden Code verwenden.

    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;
    

    Diese Verweisvariablen ähneln im Aussehen den Anweisungen, mit denen Sie zuvor dem Formular Objekte (wie Timer, List und Random) hinzugefügt haben.Diese Anweisungen bewirken jedoch nicht, dass im Formular zwei zusätzliche Bezeichnungsfelder angezeigt werden, da das Schlüsselwort new in keiner der beiden Anweisungen enthalten ist.Ohne das new-Schlüsselwort wird kein Objekt erstellt.firstClicked und secondClicked werden als Verweisvariablen bezeichnet, weil sie Verweise auf Label-Objekte speichern.

    Wenn eine Variable keinen Verweis auf ein Objekt enthält, wird sie auf einen besonderen Wert festgelegt: null in Visual C# und Nothing in Visual Basic.Beim Starten des Programms erhalten also sowohl firstClicked als auch secondClicked den Wert null bzw. Nothing. Dies bedeutet, dass die Variablen keine Objektverweise enthalten.

  2. Ändern Sie den Click-Ereignishandler so, dass er die neue firstClicked-Verweisvariable verwendet.Entfernen Sie die letzte Anweisung in der label_Click()-Ereignishandlermethode (clickedLabel.ForeColor = Color.Black;), und ersetzen Sie diese durch die if-Anweisung, die darauf folgt. (Achten Sie darauf, den Kommentar und die gesamte if-Anweisung einzufügen.)

    ''' <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. Speichern Sie das Programm, und führen Sie es aus.Wählen Sie eines der Bezeichnungsfelder. Das entsprechende Symbol wird angezeigt.

  4. Wählen Sie das nächste Bezeichnungsfeld. Sie werden bemerken, dass nichts passiert.Das Programm merkt sich bereits das erste Bezeichnungsfeld, auf das der Spieler geklickt hat, firstClicked entspricht also nicht null (in Visual C#) bzw. Nothing (in Visual Basic).Wenn die if-Anweisung firstClicked darauf überprüft, ob sie null oder Nothing entspricht, stellt sie fest, dass dies nicht der Fall ist. Die Anweisungen in der if-Anweisung werden also nicht ausgeführt.Deshalb wird nur die Farbe für das erste gewählte Symbol in Schwarz geändert. Die anderen Symbole bleiben ausgeblendet. Dies ist in der folgenden Abbildung dargestellt.

    Anzeige eines Symbols im Spiel

    Anzeige eines Symbols im Vergleichsspiel

    Sie beheben diese Situation im nächsten Lernprogrammschritt, indem Sie ein Zeitgeber-Steuerelement hinzufügen.

So fahren Sie fort oder überprüfen die Angaben