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
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.
Ä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; } } }
Speichern Sie das Programm, und führen Sie es aus.Wählen Sie eines der Bezeichnungsfelder. Das entsprechende Symbol wird angezeigt.
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
Sie beheben diese Situation im nächsten Lernprogrammschritt, indem Sie ein Zeitgeber-Steuerelement hinzufügen.
So fahren Sie fort oder überprüfen die Angaben
Um zum nächsten Schritt des Lernprogramms zu wechseln, klicken Sie auf Schritt 6: Hinzufügen eines Zeitgebers.
Um zum vorherigen Schritt des Lernprogramms zurückzukehren, klicken Sie auf Schritt 4: Hinzufügen eines Click-Ereignishandlers zu jeder Bezeichnung.