Поделиться через


Шаг 5. Добавление ссылок на метки

Программе необходимо отслеживать, какие элементы управления Label выбирает игрок.В настоящий момент программа отображает все метки, выбранные игроком.Однако мы изменим это.После выбора первой метки программа должна показывать ее значок.После выбора второй метки программа должна показать оба значка на короткое время, а затем снова скрыть их.Теперь программа будет отслеживать, какая метка выбрана первой, а какая — второй, с помощью с помощью ссылочных переменных.

Добавление ссылок на метки

  1. Добавьте ссылки на метки в свою форму, используя следующий код.

    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) в форму.Однако эти операторы не приводят к появлению в форме двух дополнительных меток, поскольку в них не используется ключевое слово new.Без ключевого слова new объект не создается.Именно поэтому firstClicked и secondClicked называются ссылочными переменными — они просто отслеживают (или ссылаются на) объекты Label.

    Когда переменная не отслеживает объект, ей задается специальное зарезервированное значение — null в Visual C# и Nothing в Visual Basic.Поэтому при запуске программы переменным firstClickedи secondClicked задается значение null или Nothing. Это означает, что переменные ничего не отслеживают.

  2. Измените свой обработчик событий Click для использования новой ссылочной переменной firstClicked.Удалите последний оператор (clickedLabel.ForeColor = Color.Black;) в методе обработчика событий label_Click() и замените его последующим оператором if. (Не забудьте включить комментарий и весь оператор if).

    ''' <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. Сохраните и выполните программу.Выберите одну из меток и появится ее значок.

  4. Выберите следующую метку и обратите внимание, что ничего не происходит.Программа уже отслеживает первую метку, которую выбрал игрок, поэтому firstClicked не равно null в Visual C# или Nothing в Visual Basic.Когда оператор if проверяет, имеет ли переменная firstClicked значение null или Nothing, он обнаруживает, что это не так, и не выполняет операторы в блоке if.Поэтому только первый выбранный значок становится черным, а другие значки остаются невидимыми, как показано на следующем рисунке.

    Игра "Подбери пару!", отображающая один значок

    Игра "Подбери пару!", отображающая один значок

    Это поведение будет исправлено в следующем шаге руководства путем добавления элемента управления Таймер.

Продолжить или повторить пройденный материал