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


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

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

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

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

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

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

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

Добавление случайного объекта и списка значков

В этом разделе вы создадите набор совпадающих символов для игры. Каждый символ добавляется к двум случайным ячейкам в таблице TableLayoutPanel в форме.

Инструкции new используются для создания двух объектов. Первым является объект Random, который случайным образом выбирает ячейки в TableLayoutPanel. Второй объект является объектом List<T>. Он хранит случайные выбранные символы.

  1. Откройте Visual Studio. Проект MatchingGame отображается в разделе Открыть последние.

  2. Выберите Form1.cs, если вы используете C#, или Form1.vb, если вы используете Visual Basic. Затем выберите Просмотреть код>. В качестве альтернативы выберите клавишу F7 или дважды щелкните Form1. Интегрированная среда разработки Visual Studio отображает модуль кода для Form1.

  3. В существующем коде добавьте следующий код.

    public partial class Form1 : Form
    {
        // Use this Random object to choose random icons for the squares
        Random random = new Random();
    
        // Each of these letters is an interesting icon
        // in the Webdings font,
        // and each icon appears twice in this list
        List<string> icons = new List<string>() 
        { 
            "!", "!", "N", "N", ",", ",", "k", "k",
            "b", "b", "v", "v", "w", "w", "z", "z"
        };
    

Если вы используете C#, обязательно поместите код после открывающей фигурной скобки и сразу после объявления класса (public partial class Form1 : Form). Если вы используете Visual Basic, поместите код сразу после объявления класса (Public Class Form1).

Объекты списка можно использовать для отслеживания различных типов элементов. Список может содержать числа, значения true/false, текст или другие объекты. В соответствующей игре объект списка имеет 16 строк, по одному для каждой ячейки на панели TableLayoutPanel. Каждая строка — это одна буква, соответствующая значкам в метках. Эти символы отображаются в шрифте Webdings как автобус, велосипед и другие.

Заметка

Списки могут уменьшаться и расти по мере необходимости, что важно в этой программе.

Дополнительные сведения о списках см. в List<T>. Чтобы просмотреть пример в C#, см. базовый пример списка. Пример в Visual Basic см. в статье Использование простой коллекции.

Назначение случайного значка каждой метки

При каждом запуске программы он назначает значки случайным образом элементам управления Label в форме с помощью метода AssignIconsToSquares(). Этот код использует ключевое слово foreach в C# или For Each в Visual Basic.

  1. Добавьте метод AssignIconsToSquares() для Form1.cs или Form1.vb.

    /// <summary>
    /// Assign each icon from the list of icons to a random square
    /// </summary>
    private void AssignIconsToSquares()
    {
        // The TableLayoutPanel has 16 labels,
        // and the icon list has 16 icons,
        // so an icon is pulled at random from the list
        // and added to each label
        foreach (Control control in tableLayoutPanel1.Controls)
        {
            Label iconLabel = control as Label;
            if (iconLabel != null)
            {
                int randomNumber = random.Next(icons.Count);
                iconLabel.Text = icons[randomNumber];
                // iconLabel.ForeColor = iconLabel.BackColor;
                icons.RemoveAt(randomNumber);
            }
        }
    }
    

Этот код можно ввести непосредственно под кодом, добавленным в предыдущем разделе.

Заметка

Одна из строк закомментирована намеренно. Позже вы добавите его в процессе.

Метод AssignIconsToSquares() выполняет итерацию по каждому элементу управления метки в TableLayoutPanel. Он выполняет одни и те же инструкции для каждого из них. Утверждения извлекают случайный значок из списка.

  • Первая строка преобразует переменную элемента управления в метку с именем iconLabel.
  • Вторая строка — это оператор if, который проверяет, работает ли преобразование. Если преобразование работает, инструкции в инструкции if выполняются.
  • Первая строка в инструкции if создает переменную с именем randomNumber, содержащую случайное число, соответствующее одному из элементов в списке значков. Он использует метод Next() объекта Random. Метод Next возвращает случайное число. Эта строка также использует свойство Count значков для определения диапазона, от которого следует выбрать случайное число.
  • Следующая строка назначает один из значков элементов списка свойству Text метки.
  • Следующая строка скрывает значки. Строка закомментирована здесь, чтобы проверить остальную часть кода перед продолжением.
  • Последняя строка в инструкции if удаляет значок, добавленный в форму из списка.
  1. Добавьте вызов метода AssignIconsToSquares() в конструкторе Form1 в Form1.cs. Этот метод заполняет игровую доску иконками. Конструкторы вызываются при создании объекта.

    public Form1()
    {
        InitializeComponent();
    
        AssignIconsToSquares();
    }
    

    Для Visual Basic добавьте вызов метода AssignIconsToSquares() в метод Form1_Load в Form1.vb.

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AssignIconsToSquares()
    End Sub
    

    Для получения дополнительной информации см. Конструкторы (руководство по программированию на C#) или Использование конструкторов и деструкторов.

  2. Сохраните программу и запустите ее. Он должен отображать форму со случайными значками, назначенными каждой метки.

    Совет

    Если значки Webdings не отображаются правильно в форме, установите значение свойства UseCompatibleTextRendering меток этой формы на True.

  3. Закройте программу и снова запустите ее. Для каждой метки назначаются разные значки.

    снимок экрана: игра сопоставления, отображающая случайные значки.

    Теперь значки видны, так как они не скрыты. Чтобы скрыть их от проигрывателя, можно задать для каждого свойства ForeColor тот же цвет, что и свойство BackColor.

  4. Остановите программу. Удалите метки комментариев для закомментированной строки кода внутри цикла в методе AssignIconsToSquares().

    iconLabel.ForeColor = iconLabel.BackColor;
    

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

Добавьте обработчики событий к меткам

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

Чтобы игра работала, добавьте обработчик события Click, который изменяет цвет выбранной метки в соответствии с фоном.

  1. Откройте форму в конструкторе Windows Forms. Выберите Form1.cs или Form1.vb, а затем выберите View>Designer.

  2. Выберите первый элемент управления меткой, чтобы выбрать его и дважды щелкните его, чтобы добавить обработчик событий Click с именем label1 _Click() в код.

  3. Затем удерживайте клавишу CTRL при выборе каждой из других меток. Убедитесь, что выбрана каждая метка.

  4. В окне "Свойства " нажмите кнопку "События", обозначенную молнией. Для события Щелчок выберите в поле label1_Click.

    снимок экрана: окно

  5. Нажмите клавишу ВВОД. Интегрированная среда разработки автоматически добавляет обработчик событий Click с именем label1 _Click() в код в Form1.cs или Form1.vb. Так как вы выбрали все метки, обработчик подключается к каждой из меток.

  6. Заполните остальную часть кода.

    /// <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;
    
            clickedLabel.ForeColor = Color.Black;
        }
     }
    

Заметка

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

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

Скриншот показывает игру

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

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