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


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

Если игра всегда скрывает одни и те же значки в тех же местах, то она становится неинтересной.Необходимо случайным образом назначать значки элементам управления Label в форме.Для этого добавьте метод AssignIconsToSquares().

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

  1. Перед добавлением следующего кода разберитесь в принципе его работы.В C# есть новое ключевое слово foreach, а в Visual Basic — For Each.(Одна из строк закомментирована по причине, описанной в конце этой процедуры.)

    ''' <summary>
    ''' Assign each icon from the list of icons to a random square
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub 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
        For Each control In TableLayoutPanel1.Controls
            Dim iconLabel = TryCast(control, Label)
            If iconLabel IsNot Nothing Then
                Dim randomNumber = random.Next(icons.Count)
                iconLabel.Text = icons(randomNumber)
                ' iconLabel.ForeColor = iconLabel.BackColor
                icons.RemoveAt(randomNumber)
            End If
        Next
    
    End Sub
    
    /// <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);
            }
        }
    } 
    
  2. Добавьте метод AssignIconsToSquares(), как показано в предыдущем шаге.Можно поместить его сразу же после кода, добавленного в разделе Шаг 2. Добавление случайного объекта и списка значков.

    В методе AssignIconsToSquares() имеется некоторое нововведение: цикл foreach в C# и For Each в Visual Basic.Цикл For Each можно использовать в любое время для неоднократного выполнения одно и того же действия.В данном случае требуется выполнять одни и те же операторы для каждой метки в TableLayoutPanel, как показано в следующем коде.Первая линия создается переменная control были хранит каждый элемент управления поочередно пока этот элемент управления имеет выписки в цикле выполненном с ней.

    For Each control In TableLayoutPanel1.Controls
        ' The statements you want to execute 
        ' for each label go here
        ' The statements use iconLabel to access 
        ' each label's properties and methods
    Next
    
    foreach (Control control in tableLayoutPanel1.Controls)
    {
        // The statements you want to execute 
        // for each label go here
        // The statements use iconLabel to access 
        // each label's properties and methods
    }
    
    ПримечаниеПримечание

    Используются имена iconLabel и control, поскольку они являются описательными.Можно заменить эти имена со всеми именами, и он работал бы полностью одинаковые, если изменилось имя в каждой выписке внутри цикла.

    Метод AssignIconsToSquares() проходит через каждый элемент управления Label в TableLayoutPanel и выполняет одни и те же операторы для каждого из них.Эти операторы запрашивают случайные значки из списка, добавленного в разделе Шаг 2. Добавление случайного объекта и списка значков.(Вот почему в список включено по два значка. Это позволяет назначить пару значков случайным элементам управления Label.)

    Просмотрите более точного на коде, который выполняется внутри foreach OR For Each цикл.Этот код воспроизведен здесь.

    Dim iconLabel = TryCast(control, Label)
    If iconLabel IsNot Nothing Then
        Dim randomNumber = random.Next(icons.Count)
        iconLabel.Text = icons(randomNumber)
        ' iconLabel.ForeColor = iconLabel.BackColor
        icons.RemoveAt(randomNumber)
    End If
    
    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);
    }
    

    Первая линия " control переменная к a Label имя iconLabel.After, линия if выписка, проверяется, чтобы убедиться, что преобразование работала.Если преобразование работает, выписки в if запуск выписки.Первая линия в if выписка создается переменная randomNumber содержит случайное число, которое соответствует одному из элементов списка значков.Для этого он использует Next метод Random объект, созданный ранее.Next метод возвращает случайное число.Эта линия также использует Count свойство icons перечисление, чтобы определить диапазон, из которого выбрать случайное число.Следующая линия присвоит один из элементов списка значков к Text свойство метки.Закомментированная линия объяснена далее в этом разделе.Наконец, являются последней линией в if оператор удаляет из списка значок, который был добавлен на форму.

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

  3. Сразу же после запуска программы необходимо вызвать метод AssignIconsToSquares().При написании кода на языке Visual C# добавьте оператор после вызова метода InitializeComponent() в конструкторе Form1. Таким образом форма будет вызывать ваш новый метод для его настройки перед отображением.

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

    Для Visual Basic сначала добавьте конструктор, а затем добавьте вызов метода в конструктор.Перед только что созданным методом AssignIconsToSquares() введите код Public Sub New().При нажатии клавиши ВВОД для перехода к следующей строке функция IntelliSense должна отобразить следующий код для завершения конструктора.

    Public Sub New()
        ' This call is required by Windows Form Designer
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call
    End Sub
    

    Добавьте вызов метода AssignIconsToSquares(), чтобы ваш конструктор выглядел следующим образом.

    Public Sub New()
        ' This call is required by Windows Form Designer
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call
        AssignIconsToSquares()
    End Sub
    
  4. Сохраните и выполните программу.Должна отобразиться форма со случайными значками, которые назначены каждой метке.

  5. Закройте программу, а затем снова запустите ее.Теперь другие значки назначены каждой метке, как показано на следующем рисунке.

    Игра "Подбери пару!" со случайными значками

    Игра "Подбери пару!" со случайными значками

  6. Теперь остановите программу и раскомментируйте следующую строку кода внутри цикла For Each.

    iconLabel.ForeColor = iconLabel.BackColor
    
    iconLabel.ForeColor = iconLabel.BackColor;
    
  7. Нажмите кнопку панели инструментов Сохранить все для сохранения программы и снова запустите ее.Похоже, что значки исчезли. Отображается только голубой фон.Однако значки назначены случайным образом и по-прежнему существуют.Поскольку значки того же цвета, что и фон, они невидимы.

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