Compartilhar via


Etapa 3: Atribuir um ícone aleatório a cada rótulo

Se os ícones aparecerem nas mesmas células a cada jogo, ele não será muito desafiador.Para evitar isso, atribua os ícones aleatoriamente aos controles de rótulo no seu formulário usando um método AssignIconsToSquares().

Para atribuir um ícone aleatório a cada rótulo

  1. Antes de adicionar o código a seguir, considere como o método funciona.Há uma nova palavra-chave: foreach no Visual C# e For Each no Visual Basic. (Uma das linhas é comentada intencionalmente, que é explicada no fim deste procedimento.)

    ''' <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. Adicione o método AssignIconsToSquares(), conforme mostrado na etapa anterior.Você pode colocá-lo logo abaixo do código adicionado em Etapa 2: Adicionar um objeto aleatório e uma lista de ícones.

    Conforme mencionado anteriormente, há algo novo no seu método AssignIconsToSquares(): um loop foreach no Visual C# e For Each no Visual Basic.Você pode usar um loop For Each no momento em que desejar realizar a mesma ação várias vezes.Nesse caso, você deseja executar as mesmas instruções para cada rótulo no seu TableLayoutPanel, conforme explicado pelo código a seguir.A primeira linha cria uma variável denominada control que armazena cada controle, um por vez, enquanto as instruções no loop são executadas nesse controle.

    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
    }
    
    ObservaçãoObservação

    Os nomes "iconLabel" e "control" são usados porque são descritivos.É possível substituir esses nomes por quaisquer nomes, e o código funcionará exatamente da mesma forma, desde que você altere o nome em cada instrução dentro do loop.

    O método AssignIconsToSquares() é iterado por meio de cada controle de rótulo no TableLayoutPanel e executa as mesmas instruções para cada um deles.Essas instruções extraem um ícone aleatório da lista que você adicionou em Etapa 2: Adicionar um objeto aleatório e uma lista de ícones. (Por esse motivo você incluiu dois de cada ícone na lista, de modo que haverá um par de ícones atribuídos aos controles de rótulo aleatórios.)

    Observe mais detalhadamente o código que é executado no loop foreach ou For Each.Esse código é reproduzido aqui.

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

    A primeira linha converte a variável control em um rótulo denominado iconLabel.A linha que vem a seguir está uma instrução if que verifica se a conversão funcionou.Se a conversão realmente funcionar, as instruções na instrução if serão executadas. (Como talvez você se lembre dos tutoriais anteriores, a instrução if é usada para avaliar qualquer condição especificada.) A primeira linha na instrução if cria uma variável denominada randomNumber que contém um número aleatório que corresponde a um dos itens na lista de ícones.Para fazer isso, ela usa o método Next do objeto Random que você criou anteriormente.O método Next retorna o número aleatório.Essa linha também usa a propriedade Count da lista icons para determinar o intervalo do qual escolher o número aleatório.A próxima linha atribui um dos itens da lista de ícones à propriedade Text do rótulo.A linha comentada é explicada mais adiante neste tópico.Por fim, a última linha na instrução if remove da lista o ícone que foi adicionado ao formulário.

    Lembre-se de que se você não tiver certeza da função de alguma parte do código, será possível posicionar o ponteiro do mouse sobre um elemento do código e analisar a dica de ferramenta resultante.Você também pode percorrer cada linha do código enquanto o programa estiver em execução usando o depurador do Visual Studio.Consulte Como uso o depurador do Visual Studio? ou Iniciar, interromper, avançar, executar código e parar depuração no Visual Studio para obter mais informações.

  3. Para preencher o tabuleiro do jogo com ícones, você precisa chamar o método AssignIconsToSquares() assim que programa for iniciado.Se estiver usando o Visual C#, adicione uma instrução logo abaixo da chamada de método InitializeComponent() no construtorForm1, de modo que o formulário chame o novo método para configurar a si mesmo antes de ser mostrado.Os construtores são chamados quando você cria um novo objeto, como uma classe ou um struct.Consulte Construtores (Guia de Programação do C#) ou Usando construtores e destruidores no Visual Basic para obter mais informações.

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

    Para o Visual Basic, adicione a chamada de método AssignIconsToSquares() ao método Form1_Load para que o código se pareça com o mostrado a seguir.

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AssignIconsToSquares()
    End Sub
    
  4. Salve seu programa e o execute.Ele deve mostrar um formulário com ícones aleatórios atribuídos a cada rótulo.

  5. Feche seu programa e, em seguida, execute-o novamente.Observe que diferentes ícones são atribuídos a cada rótulo, conforme mostrado na imagem a seguir.

    Jogo da memória com ícones aleatórios

    Jogo da memória com ícones aleatórios

    Os ícones estão visíveis agora porque você não os ocultou.Para ocultá-los do jogador, você pode definir a propriedade Forecolor de cada rótulo para a mesma cor de sua propriedade BackColor.

    DicaDica

    Outra maneira de ocultar controles, como rótulos, é definir a respectiva propriedade Visível como False.

  6. Para ocultar os ícones, interrompa o programa e remova as marcas de comentário da linha de código comentada dentro do loop For Each.

    iconLabel.ForeColor = iconLabel.BackColor
    
    iconLabel.ForeColor = iconLabel.BackColor;
    
  7. Na barra de menus, escolha o botão Salvar Tudo para salvar seu programa e execute-o.Os ícones parecem ter desaparecido; é exibido apenas um plano de fundo azul.No entanto, os ícones são atribuídos aleatoriamente e continuam lá.Como os ícones são da mesma cor do plano de fundo, eles ficam ocultos para o jogador.Até porque, ele não seria um jogo muito desafiador se o jogador pudesse ver todos os ícones imediatamente!

Para continuar ou revisar