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


Учебник. Добавление ссылочных переменных и элемента управления timer в приложение WinForms для игры "Подбери пару"

В этой серии из четырех учебников вы создадите игру "Подбери пару", в которой игрок должен подобрать пару скрытым значкам.

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

Ваша программа отслеживает, какую метку вы выбрали первой и второй, используя ссылочные переменные. Таймер скрывает значки и определяет, как долго нужно показывать значки.

  • Добавление ссылок на элементы управления Label.
  • Добавление таймера.

Необходимые компоненты

Этот учебник основан на предыдущих учебниках Создание приложения для игры "Подбери пару" и Добавление значков для игры "Подбери пару". Сначала выполните эти учебники.

Добавление ссылок на элементы управления Label

В этом разделе вы добавите в код две ссылочные переменные. Они будут отслеживать (или ссылаться на) объекты Label.

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

    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;
    

Важно!

Используйте элемент управления языка программирования в правом верхнем углу этой страницы, чтобы просмотреть фрагмент кода на C# или Visual Basic.

Programming language control for Microsoft Learn

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

  1. Измените свой обработчик событий Click для использования новой ссылочной переменной firstClicked. Удалите последнюю инструкцию в методе обработчика событий label1_Click() (clickedLabel.ForeColor = Color.Black;) и замените ее выражением 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>
    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;
    
            // 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;
            }
        }
    }
    

  1. Сохраните и выполните программу. Выберите одну из меток и появится ее значок. Выберите следующую метку и обратите внимание, что ничего не происходит.

    Screenshot shows the Matching Game showing one icon.

    Появится только первый значок, выбранный. Другие значки останутся невидимыми.

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

Добавление таймера

Приложение matching Game использует Timer элемент управления. Таймер ожидает, а затем вызывает событие, называемое тактом. Таймер может запускать действие или регулярно повторять действие.

При использовании в программе таймер позволяет игроку выбрать два значка. Если эти значки не совпадают, программа скроет их по истечении короткого периода времени.

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

    Screenshot shows the timer icon below the form.

  2. Щелкните значок Timer1, чтобы выбрать таймер. В окне Свойства выберите кнопку Свойства, чтобы просмотреть соответствующие параметры.

  3. Задайте для свойства Interval значение 750, то есть 750 миллисекунд.

    Свойство Interval задает время ожидания между тактами таймера во время активации события Tick. Ваша программа вызывает метод Start() для запуска таймера только после того, как игрок выберет вторую метку.

  4. Выберите значок элемента управления timer, а затем нажмите Ввод или дважды щелкните таймер. Затем интегрированная среда разработки добавит пустой обработчик событий Tick. Замените код следующим кодом.

    /// <summary>
    /// This timer is started when the player clicks 
    /// two icons that don't match,
    /// so it counts three quarters of a second 
    /// and then turns itself off and hides both icons
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void timer1_Tick(object sender, EventArgs e)
    {
        // Stop the timer
        timer1.Stop();
    
        // Hide both icons
        firstClicked.ForeColor = firstClicked.BackColor;
        secondClicked.ForeColor = secondClicked.BackColor;
    
        // Reset firstClicked and secondClicked 
        // so the next time a label is
        // clicked, the program knows it's the first click
        firstClicked = null;
        secondClicked = null;
    }
    

Обработчик события Tick выполняет три действия.

  • Останавливает таймер, вызывая метод Stop().
  • Использует две ссылочные переменные, firstClicked и secondClicked, чтобы снова сделать невидимыми значки двух меток, которые выбрал игрок.
  • Сбрасывает значения ссылочных переменных firstClicked и secondClicked на null в C# и Nothing в Visual Basic.
  1. Перейдите в редактор кода и добавьте в начало и конец метода обработчика событий label1_Click() следующий код. Этот код проверяет, включен ли таймер, задает ссылочную переменную secondClicked и запускает таймер. Метод обработчика событий label1_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)
    {
        // The timer is only on after two non-matching 
        // icons have been shown to the player, 
        // so ignore any clicks if the timer is running
        if (timer1.Enabled == true)
            return;
    
        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;
            }
    
            // If the player gets this far, the timer isn't
            // running and firstClicked isn't null,
            // so this must be the second icon the player clicked
            // Set its color to black
            secondClicked = clickedLabel;
            secondClicked.ForeColor = Color.Black;
    
            // If the player gets this far, the player 
            // clicked two different icons, so start the 
            // timer (which will wait three quarters of 
            // a second, and then hide the icons)
            timer1.Start();
        }
    }
    

  • Код в начале метода проверяет, запущен ли таймер, обращаясь к значению свойству Enabled. Если игрок выбирает первый и второй элемент управления Label и таймер запускается, выбор третьего элемента управления Label ни к чему не приведет.
  • Код в конце метода задает ссылочную переменную secondClicked для отслеживания второго элемента управления Label. И затем присваивает значку ярлыка черный цвет, чтобы сделать его видимым. Затем таймер запускается в однократном режиме, то есть ожидает 750 миллисекунд и после этого вызывает одно событие Tick. Обработчик события Tick таймера скрывает два значка и сбрасывает ссылочные переменные firstClicked и secondClicked. Теперь форма готова к тому, чтобы игрок выбрал другую пару значков.

Примечание.

При копировании и вставке блока кода label1_Click() вместо его ввода вручную проследите за тем, что заменить существующий код label1_Click(). В противном случае в коде появится дублирующий блок.

  1. Сохраните и выполните программу. Нажмите квадрат, и значок станет видимым. А теперь нажмите другой квадрат. Значок появиться на короткое время, а затем оба значка исчезнут.

Теперь ваша программа может отслеживать выбор первого и второго значков. А также использует таймер для приостановки перед исчезновением значков.

Следующие шаги

Перейдите к следующему учебнику, чтобы узнать, как завершить создание игры "Подбери пару".