Compartir a través de


Paso 3: Asignar un icono aleatorio a cada etiqueta

Si los iconos aparecen en las mismas celdas en todas las partidas, el juego no presenta ningún reto.Para evitarlo, asigne los iconos aleatoriamente a los controles de etiqueta del formulario mediante 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.

    Como se ha mencionado previamente, hay una novedad en el método AssignIconsToSquares(): un bucle foreach en Visual C# y For Each en Visual Basic.Se puede usar un bucle For Each siempre que se desee realizar la misma acción una y otra vez.En este caso, conviene 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 un solo control cada vez mientras dicho control tiene las instrucciones del bucle que se ejecutan 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.Se pueden reemplazar por cualquier nombre sin que ello repercuta en el funcionamiento del código, siempre y cuando se cambie el nombre en cada instrucción del bucle.

    El método AssignIconsToSquares() recorre en iteración cada control de etiqueta 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 se incluyeron dos iconos de cada en la lista, para que hubiera un par de iconos asignados a controles de etiqueta aleatorios.)

    Examine más detenidamente el código que se ejecuta en el bucle foreach o 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 control en una etiqueta denominada iconLabel.La línea siguiente es una instrucción if que comprueba que la conversión ha funcionado.Si la conversión funciona, se ejecutan las instrucciones de la instrucción if. (Es posible que recuerde de los tutoriales anteriores que la instrucción if se utiliza para evaluar cualquier condición que se especifique.) La primera línea de la instrucción if crea una variable denominada randomNumber que contiene un número aleatorio que se corresponde con uno de los elementos de la lista de iconos.Para ello, utiliza el método Next del objeto de Random que creó anteriormente.El método Next devuelve el número aleatorio.Esta línea también utiliza la propiedad Count de la lista icons para determinar el intervalo en el que se elige el número aleatorio.La línea siguiente asigna uno de los elementos de la lista de iconos a la propiedad Text de la etiqueta.La línea comentada se explica más adelante en este tema.Finalmente, la última línea de la instrucción if quita de la lista el icono agregado al formulario.

    Recuerde que, si no está seguro de qué hace una parte del código, puede situar el puntero del mouse sobre un elemento y consultar la información sobre herramientas que aparece.También puede avanzar por cada línea de código mientras se ejecuta el programa con el depurador de Visual Studio.Vea el tema sobre cómo depurar paso a paso en Visual Studio o Iniciar, interrumpir, recorrer paso por paso y ejecutar procesos a través del código y detener la depuración en Visual Studio para obtener más información.

  3. Para rellenar el tablero de juego de iconos, debe llamar al método AssignIconsToSquares() en cuanto el programa se inicie.Si usa Visual C#, agregue una instrucción bajo la llamada al método InitializeComponent() en el constructorForm1, de modo que el formulario llame al nuevo método para que se establezca antes de mostrarse.A los constructores se les llama cuando se crea un nuevo objeto, como una clase o struct.Vea Constructores (Guía de programación para C#) o Utilizar constructores y destructores en Visual Basic para obtener más información.

    public Form1()
    {
        InitializeComponent();
    
        AssignIconsToSquares();
    }
    

    En Visual Basic, agregue la llamada al método AssignIconsToSquares() al método Form1_Load de forma que el código sea similar al siguiente.

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        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.Observe que 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

    Los iconos se muestran visibles ahora porque no los ha ocultado.Para ocultárselos al jugador, establezca la propiedad Forecolor de cada etiqueta en el mismo color que su propiedad BackColor.

    SugerenciaSugerencia

    Otra manera de ocultar controles como las etiquetas es estableciendo su propiedad Visible en False.

  6. Para ocultar los iconos, detenga el programa y quite las marcas de comentario de la línea de código comentada dentro del bucle For Each.

    iconLabel.ForeColor = iconLabel.BackColor
    
    iconLabel.ForeColor = iconLabel.BackColor;
    
  7. En la barra de menús, elija el botón Guardar todo 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í.Dado que los iconos son del mismo color que el fondo, quedan ocultos al jugador.Después de todo, no sería un juego muy desafiante si se vieran todos los iconos desde el comienzo.

Para continuar o revisar