Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 temporizzatore. 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 quiz matematico WinForms. Se non hai completato quelle esercitazioni, inizia prima con esse.
Aggiungere un timer 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.
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;
In Progettazione Windows Form, sposta un controllo Timer dalla categoria Componenti della Casella degli strumenti al tuo modulo. Il controllo viene visualizzato nell'area grigia nella parte inferiore della finestra di progettazione.
Nel modulo, selezionare l'icona timer1 appena aggiunta e impostare la sua proprietà Interval su 1000. Poiché questo intervallo è espresso in millisecondi, un valore pari a 1000 fa sì che il timer generi un evento Tick 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 denominato 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 controlli NumericUpDown. In questo codice:
La versione di Visual Basic usa la parola chiave
Functionanziché la normale parola chiaveSubperché 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'operatorelogical and. In Visual Basic l'operatore equivalente èAndAlso. Si utilizza l'operatorelogical andper verificare se più di una condizione è vera. In questo caso, se i valori sono tutti corretti, il metodo restituisce un valore ditrue. In caso contrario, il metodo restituisce un valore difalse.L'istruzione
ifusa 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 dell'evento controlla le risposte del quiz chiamando CheckTheAnswer(). Controlla anche quanto tempo è trascorso nel quiz.
Nel modulo, fare doppio clic sul controllo Timer oppure selezionarlo e quindi selezionare la voce Invio. Queste azioni aggiungono un gestore eventi Tick. Compare l'editor di codice e viene visualizzato il metodo del gestore Tick.
Per C#, aggiunge una riga di codice nel file di codice Form1.Designer.cs che associa il gestore eventi:
timer1.Tick += new EventHandler(timer1_Tick);Per Visual Basic non è necessario usare tale riga, ma il gestore eventi contiene un
handles Timer1.Tickche esegue la stessa operazione.Aggiungere le istruzioni seguenti al nuovo metodo del 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 verifica innanzitutto il valore restituito da 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
truein modo che il candidato possa avviare un altro quiz.
Se
CheckTheAnswer()restituiscefalse, il codice controlla il valore di timeLeft:- Se questa variabile è maggiore di 0, il timer sottrae 1 da timeLeft. Aggiorna inoltre la proprietà testo del controllo timeLabel per mostrare a chi effettua il quiz quanti secondi rimangono.
- Se non rimane tempo, il timer si arresta e modifica il timeLabel testo 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 metodo StartTheQuiz(), 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.
Avvia la tua app
Salvare il programma ed eseguirlo.
Selezionare Avviare il quiz. Il timer inizia a scorrere verso il basso. Al termine del timeout, il quiz termina e vengono visualizzate le risposte.
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.
Passaggi successivi
Passare all'esercitazione successiva per imparare a personalizzare il quiz matematico.