Partage via


Tutoriel : Ajouter un minuteur à une application WinForms de questionnaire mathématique

Dans cette série de quatre didacticiels, vous allez créer un questionnaire mathématique. Le questionnaire contient quatre problèmes de mathématiques aléatoires que le participant tente de résoudre dans un temps imparti.

Le questionnaire utilise un contrôle de minuteur. Le code derrière ce contrôle suit le temps écoulé et vérifie les réponses du questionnaire.

Dans ce troisième tutoriel, vous allez apprendre à :

  • Ajoutez un contrôle Minuteur à votre application Windows Forms.
  • Ajoutez un gestionnaire d’événements pour le minuteur.
  • Écrivez du code pour vérifier les réponses de l’utilisateur, afficher les messages et renseigner les réponses appropriées.

Conditions préalables

Ce tutoriel s’appuie sur les didacticiels précédents, en commençant par Créer un questionnaire mathématique winForms. Si vous n’avez pas terminé ces didacticiels, commencez par les suivre.

Ajouter un minuteur de compte à rebours

Pour effectuer le suivi du temps pendant le questionnaire, vous utilisez un composant Minuteur. Vous avez également besoin d’une variable pour stocker la durée restante.

  1. Ajoutez une variable entière nommée timeLeft de la même façon que les variables déclarées dans les didacticiels précédents. Placez la déclaration timeLeft juste après les autres déclarations. Votre code doit ressembler à l’exemple suivant.

    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;
    

  1. Dans le Concepteur Windows Forms, déplacez un Timer contrôle depuis la catégorie Composants de la Boîte à outils vers votre formulaire. Le contrôle apparaît dans la zone grise en bas de la fenêtre de conception.

  2. Dans le formulaire, sélectionnez l’icône minuteur que vous venez d’ajouter, puis définissez sa propriété Interval sur 1000. Étant donné que cet intervalle est en millisecondes, la valeur 1 000 entraîne l’augmentation d’un événement de Tick toutes les secondes.

Vérifier les réponses

Étant donné que le minuteur déclenche un événement Tick toutes les secondes, il est judicieux de vérifier le temps écoulé dans un gestionnaire d’événements Tick. Il est également pratique de vérifier les réponses dans ce gestionnaire d’événements. Si le temps s’est écoulé ou si les réponses sont correctes, le questionnaire doit se terminer.

Avant d’écrire ce gestionnaire d’événements, ajoutez une méthode appelée CheckTheAnswer() pour déterminer si les réponses aux problèmes mathématiques sont correctes. Cette méthode doit être conforme aux autres méthodes, telles que StartTheQuiz(). Votre code doit ressembler à l’exemple suivant.

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

Cette méthode détermine les réponses aux problèmes mathématiques et compare les résultats aux valeurs des contrôles NumericUpDown. Dans ce code :

  • La version de Visual Basic utilise le mot clé Function au lieu du mot clé Sub habituel, car cette méthode retourne une valeur.

  • Vous ne pouvez pas facilement entrer le signe de multiplication (×) ou le signe de division (÷) à l’aide du clavier. Par conséquent, C# et Visual Basic acceptent un astérisque (*) pour la multiplication et une barre oblique (/) pour la division.

  • En C#, && est l’opérateur logical and. En Visual Basic, l’opérateur équivalent est AndAlso. Vous utilisez l’opérateur logical and pour vérifier si plusieurs conditions sont vraies. Dans ce cas, si les valeurs sont toutes correctes, la méthode retourne une valeur de true. Sinon, la méthode retourne une valeur de false.

  • L’instruction if utilise la propriété Value d’un contrôle NumericUpDown pour accéder à la valeur actuelle du contrôle. Dans la section suivante, vous utilisez la même propriété pour afficher la réponse correcte dans chaque contrôle.

Ajouter un gestionnaire d’événements au minuteur

Maintenant que vous avez un moyen de vérifier les réponses, vous pouvez écrire le code du gestionnaire d’événements Tick. Ce code s’exécute chaque seconde, lorsque le minuteur déclenche un événement Tick. Ce gestionnaire d’événements vérifie les réponses du quiz taker en appelant CheckTheAnswer(). Il vérifie également combien de temps s’est écoulé dans le questionnaire.

  1. Dans le formulaire, double-cliquez sur le contrôle Minuteur ou choisissez-le, puis appuyez sur la touche Entrée. Ces actions ajoutent un gestionnaire d’événements Tick. L’éditeur de code apparaît et affiche la méthode du gestionnaire Tick.

    Pour C#, il ajoute une ligne de code dans le fichier de code Form1.Designer.cs qui connecte le gestionnaire d’événements :

    timer1.Tick += new EventHandler(timer1_Tick);
    

    Pour Visual Basic, il n’est pas nécessaire de cette ligne, mais le gestionnaire d’événements contient un handles Timer1.Tick qui fait la même chose.

  2. Ajoutez les instructions suivantes à la nouvelle méthode de gestionnaire d’événements.

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

Chaque seconde du questionnaire, cette méthode s’exécute. Le code vérifie d’abord la valeur retournée par CheckTheAnswer().

  • Si toutes les réponses sont correctes, cette valeur est trueet le questionnaire se termine :

    • Le minuteur s’arrête.
    • Un message de félicitations s’affiche.
    • La propriété Enabled du contrôle startButton a la valeur true afin que la personne interrogée puisse commencer un autre questionnaire.
  • Si CheckTheAnswer() retourne false, le code vérifie la valeur de timeLeft:

    • Si cette variable est supérieure à 0, le minuteur soustrait 1 de timeLeft. Il met également à jour la propriété Text du contrôle timeLabel pour montrer au participant du quiz combien de secondes il reste.
    • Si le temps est écoulé, la minuterie s'arrête et modifie le timeLabel en Temps écoulé ! Une boîte de message annonce que le quiz est terminé et que les réponses sont révélées. Le bouton Démarrer devient à nouveau disponible.

Démarrer le minuteur

Pour démarrer le minuteur au démarrage du questionnaire, ajoutez trois lignes à la fin de la méthode StartTheQuiz(), comme l’illustre l’exemple suivant.

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

Lorsque votre questionnaire démarre, ce code définit la variable timeLeft sur 30 et la propriété Text du contrôle timeLabel sur 30 secondes. Ensuite, la méthode Start() du contrôle Timer démarre le compte à rebours.

Exécuter votre application

  1. Enregistrez votre programme et exécutez-le.

  2. Sélectionnez Démarrer le questionnaire. Le minuteur commence à compter. Lorsque le temps expire, le questionnaire se termine et les réponses s’affichent.

  3. Démarrez un autre questionnaire et fournissez des réponses correctes aux problèmes mathématiques. Lorsque vous répondez correctement dans la limite de temps, une boîte de message s’ouvre, le bouton démarrer devient disponible et le minuteur s’arrête.

    Capture d’écran montrant un questionnaire terminé avec 19 secondes restantes. Le bouton Démarrer le questionnaire est disponible.

Étape suivante

Passez au tutoriel suivant pour apprendre à personnaliser votre questionnaire mathématique.