Compartir a través de


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

  1. 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);
            }
        }
    } 
    
  2. 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.)

  3. 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
    
  4. Guarde el programa y ejecútelo.Ahora, debería mostrar un formulario con iconos aleatorios asignados a cada etiqueta.

  5. 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

    Juego de formar parejas con iconos aleatorios

  6. 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;
    
  7. 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