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

Dans cette série de quatre tutoriels, vous générez un questionnaire mathématique. Le questionnaire contient quatre problèmes mathématiques aléatoires auxquels le participant doit répondre dans un temps donné.

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 participant au questionnaire.

Dans ce troisième didacticiel, vous apprendrez à :

  • Ajouter un contrôle de minuteur.
  • Ajouter un gestionnaire d'événements pour le minuteur.
  • Écrire du code pour vérifier les réponses de l’utilisateur, afficher des messages et renseigner les réponses correctes.

Prérequis

Ce didacticiel s’appuie sur les didacticiels précédents, en commençant par Créer une application winForms de questionnaire mathématiques. Si vous n’avez pas terminé ces didacticiels, passez-les d’abord en revue.

Ajouter un temporisateur

Pour suivre le temps pendant le questionnaire, vous utilisez un composant minuteur. Vous avez également besoin d’une variable pour stocker la quantité de temps restant.

  1. Ajoutez une variable entière nommée timeLeft de la même manière que vous avez déclaré des variables dans les didacticiels précédents. Placez la déclaration timeLeft juste après les autres déclarations. Votre code doit ressembler à l’échantillon 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;
    

Important

Utilisez le contrôle de langage de programmation en haut à droite de cette page pour voir l’extrait de code C# ou l’extrait de code Visual Basic.

Programming language control for Microsoft Learn

  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 timer1 que vous venez d’ajouter et affectez à sa propriété Interval la valeur 1000. Étant donné que cet intervalle est en millisecondes, une valeur de 1 000 fait que le minuteur déclenche un événement 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 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’échantillon 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 Visual Basic utilise le mot clé Function à la place du mot clé Sub habituel, car cette méthode retourne une valeur.

  • Vous ne pouvez pas facilement entrer le signe de multiplication (×) et 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.

  • Dans 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 la valeur true. Dans le cas contraire, la méthode retourne la valeur 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 disposez d’un moyen de vérifier les réponses, vous pouvez écrire le code pour le gestionnaire d’événements Tick. Ce code s’exécute toutes les secondes, une fois que le minuteur déclenche un événement Tick. Ce gestionnaire d’événements vérifie les réponses du participant au quiz en appelant CheckTheAnswer(). Il vérifie également le temps é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 au minuteur. L’éditeur de code apparaît et affiche la méthode du gestionnaire Tick.

  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 que CheckTheAnswer() retourne.

  • Si toutes les réponses sont correctes, cette valeur est true, et 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. Elle met également à jour la propriété Text du contrôle timeLabel pour indiquer à la personne qui répond au questionnaire le nombre de secondes restantes.
    • S’il ne reste pas de temps, le minuteur s’arrête et remplace le texte timeLabel par Time’s up! Une boîte de message annonce que le questionnaire est terminé et les réponses sont révélées. Le bouton Démarrer redevient 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 le montre l’échantillon 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();
}

À présent, lorsque votre questionnaire démarre, ce code définit la variable timeLeft sur 30 et la propriété Text du contrôle timeLabel est définie sur 30 secondes. Il appelle ensuite la méthode Start() du contrôle Timer pour démarrer le compte à rebours.

Exécuter l’application

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

  2. Sélectionnez Démarrer le questionnaire. La minuterie commence le compte à rebours. Lorsque le temps est écoulé, le questionnaire se termine et la réponse s'affiche.

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

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

Étapes suivantes

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