Esercitazione: Aggiungere un timer a un'app WinForms quiz matematico

In questa serie di quattro esercitazioni si creerà un quiz matematico. Il quiz contiene quattro problemi matematici casuali che un quiz taker tenta di rispondere entro un determinato periodo di tempo.

Il quiz usa un controllo Timer. Il codice dietro questo controllo tiene traccia del tempo trascorso e controlla le risposte del quiz taker.

In questa terza esercitazione si apprenderà come:

  • Aggiungere un controllo Timer.
  • Aggiungere un gestore eventi per il timer.
  • Scrivere codice per controllare le risposte dell'utente, visualizzare i messaggi e compilare le risposte corrette.

Prerequisiti

Questa esercitazione si basa sulle esercitazioni precedenti, a partire da Creare un'app WinForms per quiz matematici. Se queste esercitazioni non sono state completate, eseguire prima di tutto queste esercitazioni.

Aggiungere un timer per il conto alla rovescia

Per tenere traccia del tempo durante il quiz, usare un componente timer. È anche necessaria una variabile per archiviare la quantità di tempo rimanente.

  1. Aggiungere una variabile integer denominata timeLeft nello stesso modo in cui sono state dichiarate variabili nelle esercitazioni precedenti. Inserire la dichiarazione timeLeft subito dopo le altre dichiarazioni. Il codice dovrebbe essere simile all'esempio seguente.

    public partial class Form1 : Form
    {
        // Create a Random object called randomizer 
        // to generate random numbers.
        Random randomizer = new Random();
    
        // These integer variables store the numbers 
        // for the addition problem. 
        int addend1;
        int addend2;
    
        // These integer variables store the numbers 
        // for the subtraction problem. 
        int minuend;
        int subtrahend;
    
        // These integer variables store the numbers 
        // for the multiplication problem. 
        int multiplicand;
        int multiplier;
    
        // These integer variables store the numbers 
        // for the division problem. 
        int dividend;
        int divisor;
    
        // This integer variable keeps track of the 
        // remaining time.
        int timeLeft;
    

Importante

Usare il controllo del linguaggio di programmazione in alto a destra di questa pagina per visualizzare il frammento di codice C# o il frammento di codice Visual Basic.

Programming language control for Microsoft Learn

  1. In Windows Form Designer spostare un Timer controllo dalla categoria Componenti della casella degli strumenti al form. Il controllo viene visualizzato nell'area grigia nella parte inferiore della finestra di progettazione.

  2. Nel modulo selezionare l'icona timer1 appena aggiunta e impostarne la proprietà Interval su 1000. Poiché questo intervallo è espresso in millisecondi, un valore pari a 1000 fa sì che il timer generi un Tick evento ogni secondo.

Controllare le risposte

Poiché il timer genera un evento Tick ogni secondo, è opportuno controllare il tempo trascorso in un gestore eventi Tick. È anche pratico controllare le risposte in tale gestore eventi. Se il tempo è scaduto o se le risposte sono corrette, il quiz dovrebbe terminare.

Prima di scrivere il gestore eventi, aggiungere un metodo chiamato CheckTheAnswer() per determinare se le risposte ai problemi matematici sono corrette. Questo metodo deve essere in linea con gli altri metodi, ad esempio StartTheQuiz(). Il codice dovrebbe essere simile all'esempio seguente.

/// <summary>
/// Check the answers to see if the user got everything right.
/// </summary>
/// <returns>True if the answer's correct, false otherwise.</returns>
private bool CheckTheAnswer()
{
    if ((addend1 + addend2 == sum.Value)
        && (minuend - subtrahend == difference.Value)
        && (multiplicand * multiplier == product.Value)
        && (dividend / divisor == quotient.Value))
        return true;
    else
        return false;
}

Questo metodo determina le risposte ai problemi matematici e confronta i risultati con i valori nei NumericUpDown controlli. In questo codice:

  • La versione di Visual Basic usa la Function parola chiave anziché la parola chiave consueta Sub perché questo metodo restituisce un valore.

  • Non è possibile immettere facilmente il segno di moltiplicazione (×) e il segno di divisione (÷) usando la tastiera, quindi C# e Visual Basic accettano un asterisco (*) per la moltiplicazione e un segno di barra (/) per la divisione.

  • In C#, && è l'operatore logical and . In Visual Basic l'operatore equivalente è AndAlso. Usare l'operatore logical and per verificare se più di una condizione è true. In questo caso, se i valori sono tutti corretti, il metodo restituisce un valore di true. In caso contrario, il metodo restituisce il valore false.

  • L'istruzione if usa la proprietà Value di un controllo NumericUpDown per accedere al valore corrente del controllo. Nella sezione successiva si usa la stessa proprietà per visualizzare la risposta corretta in ogni controllo.

Aggiungere un gestore eventi al timer

Ora che hai un modo per controllare le risposte, puoi scrivere il codice per il gestore eventi Tick. Questo codice viene eseguito ogni secondo, dopo che il timer genera un evento Tick. Questo gestore eventi controlla le risposte del quiz chiamando CheckTheAnswer(). Controlla anche quanto tempo è trascorso nel quiz.

  1. Nel modulo fare doppio clic sul controllo Timer oppure selezionarlo e quindi premere INVIO. Queste azioni aggiungono un gestore eventi Tick al timer. Viene visualizzato l'editor di codice e viene visualizzato il metodo del gestore Tick.

  2. Aggiungere le istruzioni seguenti al metodo del nuovo gestore eventi.

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (CheckTheAnswer())
        {
            // If CheckTheAnswer() returns true, then the user 
            // got the answer right. Stop the timer  
            // and show a MessageBox.
            timer1.Stop();
            MessageBox.Show("You got all the answers right!",
                            "Congratulations!");
            startButton.Enabled = true;
        }
        else if (timeLeft > 0)
        {
            // If CheckTheAnswer() returns false, keep counting
            // down. Decrease the time left by one second and 
            // display the new time left by updating the 
            // Time Left label.
            timeLeft = timeLeft - 1;
            timeLabel.Text = timeLeft + " seconds";
        }
        else
        {
            // If the user ran out of time, stop the timer, show
            // a MessageBox, and fill in the answers.
            timer1.Stop();
            timeLabel.Text = "Time's up!";
            MessageBox.Show("You didn't finish in time.", "Sorry!");
            sum.Value = addend1 + addend2;
            difference.Value = minuend - subtrahend;
            product.Value = multiplicand * multiplier;
            quotient.Value = dividend / divisor;
            startButton.Enabled = true;
        }
    }
    

Ogni secondo del quiz, questo metodo viene eseguito. Il codice controlla innanzitutto il valore restituito CheckTheAnswer() .

  • Se tutte le risposte sono corrette, tale valore è truee il quiz termina:

    • Il timer si arresta.
    • Viene visualizzato un messaggio di congratulazioni.
    • La proprietà Enabled del controllo startButton è impostata su true in modo che il quiz taker possa avviare un altro quiz.
  • Se CheckTheAnswer() restituisce false, il codice controlla il valore di timeLeft:

    • Se questa variabile è maggiore di 0, il timer sottrae 1 da timeLeft. Aggiorna inoltre la proprietà Text del controllo timeLabel per mostrare al quiz il numero di secondi rimanenti.
    • Se non rimane tempo, il timer si arresta e modifica il testo timeLabel in Time's up! Una finestra di messaggio annuncia che il quiz è finito e le risposte vengono rivelate. Il pulsante start diventa nuovamente disponibile.

Avviare il timer

Per avviare il timer all'avvio del quiz, aggiungere tre righe alla fine del StartTheQuiz() metodo, come illustrato nell'esempio seguente.

/// <summary>
/// Start the quiz by filling in all of the problem 
/// values and starting the timer. 
/// </summary>
public void StartTheQuiz()
{
    // Fill in the addition problem.
    // Generate two random numbers to add.
    // Store the values in the variables 'addend1' and 'addend2'.
    addend1 = randomizer.Next(51);
    addend2 = randomizer.Next(51);

    // Convert the two randomly generated numbers
    // into strings so that they can be displayed
    // in the label controls.
    plusLeftLabel.Text = addend1.ToString();
    plusRightLabel.Text = addend2.ToString();

    // 'sum' is the name of the NumericUpDown control.
    // This step makes sure its value is zero before
    // adding any values to it.
    sum.Value = 0;

    // Fill in the subtraction problem.
    minuend = randomizer.Next(1, 101);
    subtrahend = randomizer.Next(1, minuend);
    minusLeftLabel.Text = minuend.ToString();
    minusRightLabel.Text = subtrahend.ToString();
    difference.Value = 0;

    // Fill in the multiplication problem.
    multiplicand = randomizer.Next(2, 11);
    multiplier = randomizer.Next(2, 11);
    timesLeftLabel.Text = multiplicand.ToString();
    timesRightLabel.Text = multiplier.ToString();
    product.Value = 0;

    // Fill in the division problem.
    divisor = randomizer.Next(2, 11);
    int temporaryQuotient = randomizer.Next(2, 11);
    dividend = divisor * temporaryQuotient;
    dividedLeftLabel.Text = dividend.ToString();
    dividedRightLabel.Text = divisor.ToString();
    quotient.Value = 0;

    // Start the timer.
    timeLeft = 30;
    timeLabel.Text = "30 seconds"; 
    timer1.Start();
}

All'avvio del quiz, questo codice imposta la variabile timeLeft su 30 e la proprietà Text del controllo timeLabel su 30 secondi. Il metodo Start() del controllo Timer avvia quindi il conto alla rovescia.

Eseguire l'app

  1. Salvare ed eseguire il programma.

  2. Selezionare Avvia il quiz. Il timer avvia il conto alla rovescia. Al termine del timeout, il quiz termina e vengono visualizzate le risposte.

  3. Avviare un altro quiz e fornire risposte corrette ai problemi matematici. Quando si risponde correttamente entro il limite di tempo, viene visualizzata una finestra di messaggio, il pulsante di avvio diventa disponibile e il timer si arresta.

    Screenshot that shows a completed quiz with 19 seconds remaining. The Start the quiz button is available.

Passaggi successivi

Passare all'esercitazione successiva per imparare a personalizzare il quiz matematico.