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


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

Если значки оказываются в одной и той же ячейке каждую игру, игра становится слишком простой.Чтобы избежать этого, назначайте значки меткам случайным образом, используя для этого метод 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 в Visual 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 или 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 в метку с именем iconLabel.Следующая строка представляет собой оператор if, проверяющий и обеспечивающий успешное выполнение преобразования.Если преобразование выполняется, выполняются операторы в операторе if. (Как можно вспомнить из предыдущих занятий, оператор if используется для проверки заданного условия). Первая строка в операторе if создает переменную с именем randomNumber, содержащую случайное число, соответствующее одному из элементов списка значков.Для этого используется метод Next объекта Random, созданного ранее.Метод Next возвращает случайное число.Эта строка также использует свойство Count списка icons для определения диапазона, из которого выбирается случайное число.В следующей строке один из элементов списка значков присваивается свойству Text этой метки.Пояснения относительно строки с комментариям приводятся далее в этом разделе.Наконец, последняя строка в операторе if удаляет из списка значок, добавленный в форму.

    Помните, если вы не уверены, что делает какая-либо часть кода, можно навести указатель мыши на элемент кода и посмотреть отображаемую подсказку.Можно также выполнять каждую строку кода пошагово после запуска программы, воспользовавшись отладчиком Visual Studio.Дополнительные сведения см. в разделе Практические советы. Пошаговая работа с отладчиком в Visual Studio или Запуск, приостановка, шаг, последовательное выполнение и остановка отладки в Visual Studio.

  3. Чтобы быстро заполнить игровое поле значками, необходимо вызвать метод AssignIconsToSquares() сразу после запуска программы.При написании кода на языке Visual C# добавьте оператор после вызова метода InitializeComponent() в конструктореForm1. В этом случае форма будет вызывать новый метод для ее настройки перед отображением.Конструкторы вызываются при создании нового объекта, такого как класс или структура.Дополнительные сведения см. в разделах Конструкторы (руководство по программированию на C#) и Использование конструкторов и деструкторов в Visual Basic.

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

    В Visual Basic добавьте вызов метода AssignIconsToSquares() в метод Form1_Load, чтобы код выглядел следующим образом.

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AssignIconsToSquares()
    End Sub
    
  4. Сохраните и выполните программу.Должна отобразиться форма со случайными значками, которые назначены каждой метке.

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

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

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

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

    СоветСовет

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

  6. Чтобы скрыть значки, остановите программу и удалите метки комментариев с соответствующей строки кода в цикле For Each.

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

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