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


Руководство. Отображение сообщения в приложении WinForms для соответствующей игры

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

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

В этом руководстве описано, как:

  • Сохраняйте видимые пары.
  • Проверьте, выиграл ли игрок.
  • Попробуйте использовать другие функции.

Необходимые условия

Это руководство основывается на следующих предыдущих руководствах:

  1. Создание соответствующего игрового приложения
  2. Добавить значки в соответствующую игру
  3. Добавить таймер в соответствующую игру

Держите пары видимыми

Когда игрок находит пару, игра должна сброситься, чтобы больше не отслеживать любые метки, использующие ссылочные переменные firstClicked и secondClicked. Он не должен сбрасывать настройки цветов для двух ярлыков, которые были сопоставлены. Эти метки продолжают отображаться.

  1. Добавьте следующую инструкцию if в метод обработчика событий label_Click(). Поместите его в конец кода чуть выше инструкции, в которой начинается таймер.
        // 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 clicked two matching icons, keep them 
        // black and reset firstClicked and secondClicked 
        // so the player can click another icon
        if (firstClicked.Text == secondClicked.Text)
        {
            firstClicked = null;
            secondClicked = null;
            return;
        }

        // 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();
    }
}

Оператор if проверяет, совпадает ли значок в первой метке, которую выбирает игрок, с значком во второй метке. Если значки одинаковы, программа выполняет три инструкции. Первые два оператора сбрасывают референсные переменные firstClicked и secondClicked. Они больше совсем не следят за никакими метками. Третья инструкция — это оператор return, который пропускает остальные инструкции в методе без их выполнения.

  1. Запустите программу, а затем начните выбирать квадраты в форме.

снимок экрана: игра сопоставления, созданная в этом руководстве.

Если вы выбираете пару, которая не соответствует, срабатывает событие Tick таймера. Оба значка исчезают.

Если выбрать соответствующую пару, запускается новая инструкция if. Оператор return заставляет метод пропустить код, запускающий таймер. Значки остаются видимыми.

Проверка того, выиграл ли игрок

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

  1. Добавьте метод CheckForWinner() в нижней части кода под обработчиком событий timer1_Tick().
/// <summary>
/// Check every icon to see if it is matched, by 
/// comparing its foreground color to its background color. 
/// If all of the icons are matched, the player wins
/// </summary>
private void CheckForWinner()
{
    // Go through all of the labels in the TableLayoutPanel, 
    // checking each one to see if its icon is matched
    foreach (Control control in tableLayoutPanel1.Controls)
    {
        Label iconLabel = control as Label;

        if (iconLabel != null) 
        {
            if (iconLabel.ForeColor == iconLabel.BackColor)
                return;
        }
    }

    // If the loop didn’t return, it didn't find
    // any unmatched icons
    // That means the user won. Show a message and close the form
    MessageBox.Show("You matched all the icons!", "Congratulations");
    Close();
}

Метод использует другой цикл foreach в C# или цикл For Each в Visual Basic для прохождения каждой метки в TableLayoutPanel. Он проверяет цвет значка каждой метки, чтобы проверить, соответствует ли он фону. Если цвета совпадают, значок остается невидимым, и игрок не сопоставил все оставшиеся значки.

В этом случае программа использует оператор return для пропуска остальной части метода. Если цикл проходит через все метки без выполнения инструкции return, это означает, что все значки в форме были сопоставлены. Программа показывает MessageBox, чтобы поздравить игрока с победой, а затем вызывает метод Close(), чтобы завершить игру.

  1. Сделайте так, чтобы обработчик событий метки Click вызывал новый метод CheckForWinner().
// 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;

// Check to see if the player won
CheckForWinner();

// If the player clicked two matching icons, keep them 
// black and reset firstClicked and secondClicked 
// so the player can click another icon
if (firstClicked.Text == secondClicked.Text)
{
    firstClicked = null;
    secondClicked = null;
    return;
}

Убедитесь, что программа проверяет победителя сразу после того, как она отображает второй значок, который выбирает игрок. Найдите строку, в которой задается цвет второго выбранного значка, а затем вызовите метод CheckForWinner() сразу после этой строки.

  1. Сохраните и запустите программу. Играйте в игру и сопоставляйте все значки. При победе программа отображает поздравительное сообщение.

    снимок экрана: игра сопоставления с MessageBox.

    После нажатия кнопки ОК, игра сопоставления закрывается.

Попробуйте другие функции

Ваша игра на сопоставление завершена. Вы можете добавить дополнительные функции, чтобы сделать эту игру более сложной и интересной. Ниже приведены некоторые варианты.

  • Замените значки и цвета на выбранные вами.

    Попробуйте взглянуть на свойство ForeColor метки.

  • Добавьте таймер игры, который отслеживает, сколько времени занимает игрок, чтобы выиграть.

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

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

    Для воспроизведения звуков можно использовать пространство имен System.Media. Дополнительные сведения см. в статье Воспроизведение звуков в приложении Windows Forms (C#) или Воспроизведение звука в Visual Basic.

  • Сделать игру сложнее, сделав доску больше.

    Вам потребуется сделать больше, чем просто добавить строки и столбцы в TableLayoutPanel. Кроме того, необходимо учитывать количество создаваемых значков.

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

Дальнейшие действия

Поздравляю! Вы завершили эту серию уроков. Вы выполнили эти задачи программирования и проектирования в интегрированной среде разработки Visual Studio:

  • Сохраненные объекты, такие как значки, в списке
  • Использование цикла в C# или Visual Basic для итерации по списку
  • Отслеживание состояния с помощью ссылочных переменных
  • Создан обработчик событий для реагирования на события для нескольких объектов
  • Добавлен таймер, который подсчитывает и запускает событие

Перейдите к этой статье для глубокого погружения в конструктор Windows Forms.