Etapa 3: Atribuir a um ícone aleatório a cada etiqueta
Se o jogo sempre ocultar os ícones mesmos nos mesmos locais, ele não é um desafio.Você precisa atribuir os ícones aleatoriamente para o rótulo controles do formulário.Para isso, você adiciona um AssignIconsToSquares() método.
Para atribuir um ícone aleatório a cada etiqueta
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 em Visual Basic.(Uma das linhas é comentada com uma finalidade que é explicado no final 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); } } }
Adicionar o AssignIconsToSquares() método conforme mostrado na etapa anterior.Você pode colocá-lo logo abaixo o código que você adicionou na Etapa 2: Adicionar um objeto aleatório e uma lista de ícones.
Há algo de novo no seu AssignIconsToSquares() método: um foreach loop no Visual C# e For Each em Visual Basic.Você pode usar um For Each loop a qualquer momento que você deseja fazer a mesma ação repetidamente.Nesse caso, você deseja executar as mesmas instruções para cada etiqueta na sua TableLayoutPanel, conforme explicado pelo seguinte código.A primeira linha cria uma variável chamada control que armazena cada controle um por vez enquanto que o controle tem as instruções no loop executado nele.
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ção O controle e nomes iconLabel são usados porque eles são descritivos.Você poderia substituir esses nomes por todos os nomes e ele funcionaria exatamente da mesma desde que você alterou o nome em cada instrução dentro do loop.
O AssignIconsToSquares() método percorre cada rótulo de controle no TableLayoutPanel e executa as mesmas instruções para cada um deles.Essas instruções puxe um ícone aleatório da lista que você adicionou na Etapa 2: Adicionar um objeto aleatório e uma lista de ícones.(É por isso que incluídos dois de cada ícone na lista, para que houvesse um par de ícones atribuído aleatório para rótulo controles.)
Examinar mais detalhadamente o código que executa dentro do foreach ou For Each loop.Esse código está 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 o control variável para um Label chamado iconLabel.A linha depois que é um if trabalhou de instrução que verifica se a conversão.Se a conversão trabalha, as instruções na if instrução executada.A primeira linha de if instrução cria uma variável chamada randomNumber que contém um número aleatório que corresponde a um dos itens na lista de ícones.Para fazer isso, ele usa o Next método da Random o objeto que você criou anteriormente.O Next método retorna o número aleatório.Esta linha também usa o Count propriedade da icons a lista para determinar o intervalo de onde pode escolher o número aleatório.A linha seguinte atribui a um do ícone de itens da lista de Text a propriedade do rótulo.A linha comentadas é explicada posteriormente neste tópico.Finalmente, a última linha do if instrução remove da lista, o ícone que foi adicionado ao formulário.
Lembre-se, se você não tiver certeza sobre o que faz parte do código, você pode posicionar o ponteiro do mouse sobre um elemento de código e examine a dica de ferramenta resultante.
Você precisa chamar o AssignIconsToSquares() método assim que o programa é iniciado.Se escrever código do Visual C#, adicione uma instrução logo abaixo da chamada para o InitializeComponent() método na Form1 construtor, para que seu formulário chama o novo método para configurar-se antes que ele é mostrado.
public Form1() { InitializeComponent(); AssignIconsToSquares(); }
Para Visual Basic, primeiro adicione o construtor e em seguida, adicione a chamada do método do construtor.Antes do AssignIconsToSquares() método acabou criado, comece digitando o código Public Sub New().Quando você pressiona a tecla ENTER para ir para a próxima linha, o IntelliSense deve fazer o código a seguir são exibidos concluir o construtor.
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call End Sub
Adicionar o AssignIconsToSquares() chamada de método para seu construtor se pareça com o seguinte.
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call AssignIconsToSquares() End Sub
Salve o seu programa e executá-lo.Ele deve mostrar um formulário com ícones aleatórios atribuídos a cada etiqueta.
Feche o programa e, em seguida, executá-la novamente.Agora, os ícones diferentes são atribuídas a cada rótulo, como mostrado na figura a seguir.
Jogo da memória com ícones aleatórios
Agora, interrompa o programa e Descomente a linha de código dentro do For Each loop.
iconLabel.ForeColor = iconLabel.BackColor
iconLabel.ForeColor = iconLabel.BackColor;
Clique no Salvar tudo o botão de barra de ferramentas para salvar o seu programa e, em seguida, executá-lo.Parecem que os ícones desapareceram — apenas um plano de fundo azul aparece.No entanto, os ícones são atribuídos aleatoriamente e ainda estão lá.Como os ícones são a mesma cor do plano de fundo, eles estão invisíveis.
Para continuar ou revisar
Para ir para a próxima etapa do tutorial, consulte Etapa 4: Adicionar um manipulador de evento Click para cada etiqueta.
Para retornar para a etapa anterior do tutorial, consulte Etapa 2: Adicionar um objeto aleatório e uma lista de ícones.