Passaggio 3: assegnare un'icona casuale a ogni etichetta

Non sarebbe particolarmente impegnativo visualizzare le icone sempre nelle stesse celle a ogni gioco.Per evitare questa situazione, assegnare casualmente le icone a controlli etichetta nel form tramite un metodo AssignIconsToSquares().

Per assegnare un'icona casuale a ogni etichetta

  1. Prima di aggiungere il codice seguente, considerare come funziona il metodo.È presente una nuova parola chiave: foreach in Visual C# e For Each in Visual Basic. Una delle righe è appositamente impostata come commento; la spiegazione è riportata al fondo della procedura.

    ''' <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. Aggiungere il metodo AssignIconsToSquares() come illustrato nel passaggio precedente.È possibile inserirlo immediatamente dopo il codice aggiunto in Passaggio 2: aggiungere un oggetto casuale e un elenco di icone.

    Come enunciato in precedenza, nel metodo AssignIconsToSquares() è presente una novità: un ciclo foreach in Visual C# e For Each in Visual Basic.È possibile utilizzare un ciclo For Each ogni qualvolta si desidera eseguire la stessa azione ripetutamente.In questo caso, eseguire le stesse istruzioni per ogni etichetta in TableLayoutPanel, come spiegato tramite il codice seguente.Nella prima riga viene creata una variabile denominata control in cui viene archiviato ogni controllo, uno alla volta, mentre sul controllo vengono eseguite le istruzioni incluse nel ciclo.

    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]

    I nomi "iconLabel" e "control" vengono utilizzati in quanto nomi descrittivi.È possibile sostituirli con altri nomi senza che il codice ne risulti pregiudicato, a condizione che si modifichi il nome in ogni istruzione all'interno del ciclo.

    Il metodo AssignIconsToSquares() scorre ogni controllo etichetta in TableLayoutPanel ed esegue le stesse istruzioni per ognuno di essi.Tali istruzioni traggono un'icona casuale dall'elenco aggiunto in Passaggio 2: aggiungere un oggetto casuale e un elenco di icone. Nell'elenco sono state incluse coppie di icone, in modo tale da poter assegnare una coppia di icone ai controlli etichetta casuali.

    Analizzare attentamente il codice eseguito all'interno del ciclo For Each o foreach.Questo codice viene riprodotto di seguito.

    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);
    }
    

    Nella prima riga viene convertita la variabile control in un'etichetta denominata iconLabel.La riga successiva è un'istruzione if che verifica se la conversione è stata eseguita correttamente.In caso affermativo, vengono eseguite le istruzioni contenute nell'istruzione if. Come già illustrato nelle esercitazioni precedenti, l'istruzione if consente di valutare qualsiasi condizione specificata. Nella prima riga nell'istruzione if viene creata una variabile denominata randomNumber contenente un numero casuale che corrisponde a uno degli elementi nell'elenco di icone.A questo scopo, viene utilizzato il metodo Next dell'oggetto Random creato precedentemente.Il metodo Next restituisce il numero casuale.In questa riga viene inoltre utilizzata la proprietà Count dell'elenco icons per determinare l'intervallo da cui scegliere il numero casuale.Nella riga successiva viene assegnato uno degli elementi dell'elenco di icone alla proprietà Text dell'etichetta.La riga impostata come commento viene descritta più avanti in questo argomento.Infine, nell'ultima riga dell'istruzione if l'icona aggiunta al form viene rimossa dall'elenco.

    Tenere presente che, in caso di dubbi sulle operazioni eseguite in alcune parti del codice, è possibile posizionare il puntatore del mouse su un elemento di codice ed esaminare la descrizione comando visualizzata.È inoltre possibile scorrere ogni riga di codice mentre il programma è in esecuzione utilizzando il debugger di Visual Studio.Per ulteriori informazioni, vedere Procedura: utilizzo del debugger in Visual Studio o Avviare, interrompere, eseguire istruzioni, esplorare il codice e arrestare il debug in Visual Studio.

  3. Per riempire la tavola da gioco con icone, è necessario chiamare il metodo di AssignIconsToSquares() non appena il programma viene avviato.Se si utilizza Visual C#, aggiungere un'istruzione immediatamente dopo la chiamata al metodo InitializeComponent() nel Form1costruttore, in modo che il form chiami il nuovo metodo e venga configurato prima di essere visualizzato.I costruttori vengono chiamati quando si crea un nuovo oggetto, ad esempio una classe o uno struct.Per ulteriori informazioni, vedere Costruttori (Guida per programmatori C#) o Utilizzo di costruttori e distruttori in Visual Basic.

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

    Per Visual Basic, aggiungere la chiamata del metodo AssignIconsToSquares() al metodo Form1_Load in modo che il codice risulti analogo al seguente:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AssignIconsToSquares()
    End Sub
    
  4. Salvare ed eseguire il programma.Dovrebbe visualizzare un form con icone casuali assegnate a ogni etichetta.

  5. Chiudere il programma, quindi eseguirlo nuovamente.Icone diverse sono ora assegnate a ogni etichetta, come mostrato nell'immagine seguente.

    Gioco delle coppie con icone casuali

    Gioco di abbinamenti con icone casuali

    Le icone sono ora visibili, poiché non sono state nascoste.Per nasconderle, è possibile impostare la proprietà Forecolor di ciascuna etichetta sullo stesso colore della proprietà BackColor.

    SuggerimentoSuggerimento

    Un altro modo per nascondere controlli quali le etichette consiste nell'impostare la relativa proprietà Visible su False.

  6. Per nascondere le icone, arrestare il programma e rimuovere i contrassegni di commento per la riga di codice commentata nel ciclo For Each.

    iconLabel.ForeColor = iconLabel.BackColor
    
    iconLabel.ForeColor = iconLabel.BackColor;
    
  7. Nella barra dei menu fare clic sul pulsante Salva tutto per salvare il programma, quindi eseguirlo.Le icone sembrano essere scomparse, è presente soltanto uno sfondo blu.Le icone tuttavia sono assegnate casualmente e sono ancora al loro posto.Essendo dello stesso colore dello sfondo, le icone non vengono visualizzate dal giocatore.Dopo tutto, non sarebbe un gioco particolarmente impegnativo se il giocatore potesse visualizzare subito tutte le icone!

Per continuare o rivedere l'esercitazione