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 = 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); } } }
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 For Each 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.La primera línea crea una variable denominada control que almacena cada control uno a la vez mientras ese control tiene las instrucciones del bucle ejecutado en él.
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.Puede sustituir estos nombres con cualquier nombre, y funcionaría exactamente igual cuando cambió el nombre en cada instrucción dentro del bucle.
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.)
Considere más detenidamente el código que se ejecuta dentro del bucle de foreach o de For Each .este código se reproduce aquí.
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); }
la primera línea convierte la variable de control a Label denominado iconLabel.La línea que es una instrucción de if que comprueba para asegurarse de que la conversión funcionó después.Si funciona la conversión, las instrucciones en la ejecución de la instrucción de if .La primera línea de la instrucción de if crea una variable denominada randomNumber que contenga un número aleatorio que corresponde a uno de los elementos de la lista de los iconos.Para ello, utiliza el método de Next del objeto de Random que creó anteriormente.el método de Next devuelve el número aleatorio.Esta línea también utiliza la propiedad de Count de la lista de icons para determinar el intervalo de que elegir el número aleatorio.la línea siguiente asigna uno de los elementos de la lista de iconos a la propiedad de Text de la etiqueta.La línea con comentarios se explica más adelante en este tema.Finalmente, la última línea de la instrucción de if quita de la lista el icono que se ha agregado al formulario.
Recuerde que, si no está seguro sobre lo que alguna parte del código, puede colocar el puntero del mouse sobre un elemento de código y revisar la información sobre herramientas resultante.
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 For Each.
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.