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

  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 For Each.

    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