Paso 3: Asignar un icono aleatorio a cada etiqueta
Si el juego siempre oculta los mismos iconos en las mismas ubicaciones, no supone ningún reto.Debe asignar los iconos de forma aleatoria a los controles Label del formulario.Con este objetivo, se agrega un método AssignIconsToSquares().
Para asignar un icono aleatorio a cada etiqueta
Antes de agregar el siguiente código, considere cómo funciona el método.Hay una nueva palabra clave: foreach en Visual C# y For Each en Visual Basic.(Una de las líneas está comentada intencionadamente; se explica al final de este procedimiento).
''' <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 As Label = TryCast(control, Label) If iconLabel IsNot Nothing Then Dim randomNumber As Integer = random.Next(icons.Count) iconLabel.Text = icons.ElementAt(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); } } }
Agregue el método AssignIconsToSquares() tal como se indica en el paso anterior.Basta con que lo coloque debajo del código que agregó en Paso 2: Agregar un objeto aleatorio y una lista de iconos.
Hay una novedad en el método AssignIconsToSquares(): un bucle foreach en Visual C# y For Each en Visual Basic.Un bucle foreach se usa siempre que se desea realizar la misma acción una y otra vez.En este caso, desea ejecutar las mismas instrucciones para cada etiqueta de TableLayoutPanel, tal y como se observa en el siguiente código.
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 }
Nota
Se usan los nombres iconLabel y control porque son descriptivos.Sin embargo, podría reemplazarlos con cualquier nombre sin que ello repercutiese en el funcionamiento (siempre y cuando se cambiase el nombre en cada instrucción incluida entre llaves).
El método AssignIconsToSquares() recorre cada control Label de TableLayoutPanel y ejecuta las mismas instrucciones para cada uno de ellos.Esas instrucciones extraen un icono aleatorio de la lista que se agregó en Paso 2: Agregar un objeto aleatorio y una lista de iconos.(Por eso incluyó dos iconos de cada en la lista, para que hubiera un par de iconos asignado a los controles Label aleatorios.)
Necesita llamar al método AssignIconsToSquares() en cuanto se inicie el programa.Si escribe código de Visual C#, agregue una instrucción bajo la llamada al método InitializeComponent() en el constructor Form1, de modo que el formulario llame a su nuevo método para prepararse antes de mostrarse.
public Form1() { InitializeComponent(); AssignIconsToSquares(); }
Para Visual Basic, primero agregue el constructor y, a continuación, agregue al constructor la llamada al método.Antes del método AssignIconsToSquares() que acaba de crear, empiece escribiendo el código Public Sub New().Al presionar la tecla ENTRAR para pasar a la línea siguiente, IntelliSense debería hacer que apareciese el siguiente código para completar el constructor.
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call End Sub
Agregue la llamada al método AssignIconsToSquares() de modo que el constructor sea similar al siguiente.
Public Sub New() ' This call is required by Windows Form Designer InitializeComponent() ' Add any initialization after the InitializeComponent() call AssignIconsToSquares() End Sub
Guarde el programa y ejecútelo.Ahora, debería mostrar un formulario con iconos aleatorios asignados a cada etiqueta.
Cierre el programa y, a continuación, ejecútelo de nuevo.Ahora hay iconos diferentes asignados a cada etiqueta, como se muestra en la siguiente ilustración.
Juego de formar parejas con iconos aleatorios
Ahora detenga el programa y quite los comentarios de la línea de código dentro del bucle foreach.
iconLabel.ForeColor = iconLabel.BackColor
iconLabel.ForeColor = iconLabel.BackColor;
Haga clic en el botón Guardar todo de la barra de herramientas para guardar el programa y, a continuación, ejecútelo.Parece que los iconos han desaparecido (únicamente se muestra un fondo azul).Sin embargo, los iconos se asignan aleatoriamente y siguen ahí.Debido a que los iconos tienen el mismo color que el fondo, no se ven.
Para continuar o revisar
Para ir al siguiente paso del tutorial, vea Paso 4: Agregar un controlador de eventos Click a cada etiqueta.
Para volver al paso anterior del tutorial, vea Paso 2: Agregar un objeto aleatorio y una lista de iconos.