Passaggio 3: aggiungere un timer per il conto alla rovescia

Nella terza parte di questa esercitazione si aggiungerà un timer per il conto alla rovescia per tenere traccia del numero di secondi che rimangono all'esecutore del quiz per completare l'operazione.

[!NOTA]

Questo argomento fa parte di una serie di esercitazioni sui concetti di codifica di base.Per una panoramica dell'esercitazione, vedere Esercitazione 2: creare un quiz matematico a tempo

Per aggiungere un timer per il conto alla rovescia

  1. Aggiungere una variabile Integer denominata timeLeft, come nella procedura precedente.Il codice dovrebbe essere analogo al seguente.

    Public Class Form1
    
        ' Create a Random object called randomizer  
        ' to generate random numbers. 
        Private randomizer As New Random
    
        ' These integer variables store the numbers  
        ' for the addition problem.  
        Private addend1 As Integer 
        Private addend2 As Integer 
    
        ' This integer variable keeps track of the  
        ' remaining time. 
        Private timeLeft As Integer
    
    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;
    
        // This integer variable keeps track of the  
        // remaining time. 
        int timeLeft;
    

    A questo punto è necessario un metodo che conti effettivamente i secondi, ad esempio un timer, e generi un evento dopo il periodo di tempo specificato.

  2. Nella finestra di progettazione spostare un controllo Timer dalla categoria Componenti della casella degli strumenti nel form.

    Il controllo viene visualizzato nell'area grigia nella parte inferiore della finestra di progettazione.

  3. Nel form scegliere l'icona timer1 appena aggiunta e impostarne la proprietà Interval su 1000.

    Poiché il valore di intervallo è espresso in millisecondi, un valore pari a 1000 fa sì che l'evento Tick venga generato ogni secondo.

  4. Nel form fare doppio clic sul controllo Timer o sceglierlo e premere INVIO.

    Viene visualizzato l'editor di codice contenente il metodo per il gestore dell'evento Tick appena aggiunto.

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

    Private Sub Timer1_Tick() Handles Timer1.Tick
    
        If timeLeft > 0 Then 
            ' Display the new time left 
            ' by updating the Time Left label.
            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
            startButton.Enabled = True 
        End If 
    
    End Sub
    
    private void timer1_Tick(object sender, EventArgs e)
    {
        if (timeLeft > 0)
        {
            // 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;
            startButton.Enabled = true;
        }
    }
    

    In base all'elemento aggiunto, ogni secondo il timer controlla se il tempo è scaduto determinando se la variabile Integer timeLeft è maggiore di 0.In caso positivo, rimane ancora tempo.Il timer sottrae prima 1 da timeLeft, quindi aggiorna la proprietà Text del controllo timeLabel per mostrare all'esecutore del quiz quanti secondi rimangono.

    Se non rimane tempo, il timer si arresta e il testo del controllo timeLabel viene modificato in modo da visualizzare Tempo scaduto Una finestra di messaggio informa che il quiz è terminato e viene rivelata la risposta, in questo caso mediante l'aggiunta di addend1 e addend2.La proprietà Enabled del controllo startButton è impostata su true per consentire all'esecutore del quiz di avviare un altro quiz.

    Si è appena aggiunta un'istruzione if else, che rappresenta il modo in cui si comunica ai programmi di prendere decisioni.Di seguito è riportato un esempio di istruzione if else.

    [!NOTA]

    L'esempio seguente viene fornito a scopo illustrativo; non aggiungerlo al progetto.

    If (something that your program will check) Then
        ' One or more statements that will run
        ' if what the program checked is true. 
    Else
        ' One or more statements that will run
        ' if what the program checked is false.
    End If
    
    if (something that your program will check)
    {
        // One or more statements that will run
        // if what the program checked is true. 
    }
    else
    {
        // One or more statements that will run
        // if what the program checked is false.
    }
    

    Esaminare attentamente l'istruzione aggiunta al blocco else per visualizzare la risposta al problema di addizione.

    sum.Value = addend1 + addend2
    
    sum.Value = addend1 + addend2;
    

    L'istruzione addend1 + addend2 somma i valori delle due variabili.La prima parte (sum.Value) utilizza la proprietà Value del controllo NumericUpDown della somma per visualizzare la risposta corretta.La stessa proprietà verrà utilizzata successivamente per controllare le risposte al quiz.

    Un controllo NumericUpDown facilita l'immissione di numeri da parte degli esecutori del quiz ed è per questo motivo che si utilizza il controllo per le risposte ai problemi matematici.Tutte le risposte potenziali sono numeri interi compresi tra 0 e 100.Mantenendo i valori predefiniti per le proprietà Minimum, Maximum e DecimalPlaces, si evita che gli esecutori del quiz immettano numeri decimali, negativi o troppo alti. Se si desidera consentire agli esecutori del quiz di immettere 3,141 ma non 3,1415, è possibile impostare la proprietà DecimalPlaces su 3.

  6. Aggiungere tre righe alla fine del metodo StartTheQuiz(), in modo che il codice sia analogo al seguente.

    ''' <summary> 
    ''' Start the quiz by filling in all of the problem  
    ''' values and starting the timer.  
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub 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
    
        ' Start the timer.
        timeLeft = 30
        timeLabel.Text = "30 seconds"
        Timer1.Start()
    
    End Sub
    
    /// <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;
    
        // Start the timer.
        timeLeft = 30;
        timeLabel.Text = "30 seconds"; 
        timer1.Start();
    }
    

    A questo punto, all'avvio del quiz la variabile timeLeft è impostata su 30 e la proprietà Text del controllo timeLabel è impostata su 30 secondi.Il metodo Start() del controllo Timer avvia il conto alla rovescia. La risposta non viene ancora controllata. Ciò avverrà in seguito.

  7. Salvare il programma, eseguirlo e scegliere il pulsante Avvio del form.

    Il timer avvia il conto alla rovescia.Quando il tempo è scaduto, il quiz termina e viene visualizzata la risposta.Nella figura seguente viene illustrato il quiz in corso.

    Quiz matematico in corso

    Quiz matematico in corso

Per continuare o rivedere l'esercitazione