Delen via


Zelfstudie: Een timer toevoegen aan een WinForms-app voor wiskundequiz

In deze reeks van vier tutorials bouwt u een wiskundequiz. De toets bevat vier willekeurige wiskundige problemen die een toetsnemer probeert te beantwoorden binnen een opgegeven tijd.

De quiz gebruikt een Timer-besturingselement. De code achter dit besturingselement houdt de verstreken tijd bij en controleert de antwoorden van de toetsnemer.

In deze derde zelfstudie leert u het volgende:

  • Voeg een timer toe.
  • Voeg een gebeurtenis-handler toe voor de timer.
  • Schrijf code om de antwoorden van de gebruiker te controleren, berichten weer te geven en de juiste antwoorden in te vullen.

Voorwaarden

Deze zelfstudie is gebaseerd op eerdere zelfstudies, te beginnen met Een WinForms-app voor wiskundige toetsen maken. Als u deze zelfstudies nog niet hebt voltooid, doe deze dan eerst.

Een afteltimer toevoegen

Als u de tijd tijdens de toets wilt bijhouden, gebruikt u een timeronderdeel. U hebt ook een variabele nodig om de hoeveelheid tijd op te slaan die overblijft.

  1. Voeg een geheel getal variabele toe met de naam timeLeft op dezelfde manier als je variabelen in eerdere zelfstudies hebt gedeclareerd. Plaats de timeLeft verklaring direct na de andere declaraties. Uw code moet eruitzien als in het volgende voorbeeld.

    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. Verplaats in Windows Forms Designer-een Timer controle van de categorie Onderdelen van de Toolbox naar uw formulier. Het besturingselement wordt weergegeven in het grijze gebied onder aan het ontwerpvenster.

  2. Selecteer in het formulier het pictogram timer1 dat u zojuist hebt toegevoegd en stel de eigenschap Interval in op 1000. Omdat dit interval in milliseconden is, zorgt een waarde van 1000 ervoor dat de timer elke seconde een Tick gebeurtenis genereert.

Bekijk de antwoorden

Omdat de timer elke seconde een Tick-gebeurtenis genereert, is het zinvol om de verstreken tijd in een Tick-gebeurtenis-handler te controleren. Het is ook praktisch om de antwoorden in die gebeurtenishandler te controleren. Als de tijd op is, of als de antwoorden juist zijn, moet de toets eindigen.

Voordat u die gebeurtenis-handler schrijft, voegt u een methode toe met de naam CheckTheAnswer() om te bepalen of de antwoorden op de wiskundige problemen juist zijn. Deze methode moet in overeenstemming zijn met de andere methoden, zoals StartTheQuiz(). Uw code moet eruitzien als in het volgende voorbeeld.

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

Deze methode bepaalt de antwoorden op de wiskundige problemen en vergelijkt de resultaten met de waarden in de besturingselementen NumericUpDown. In deze code:

  • De Visual Basic-versie gebruikt het Function trefwoord in plaats van het gebruikelijke Sub trefwoord, omdat deze methode een waarde retourneert.

  • U kunt het vermenigvuldigingsteken (×) en het deelteken (÷) niet eenvoudig invoeren met behulp van het toetsenbord, zodat C# en Visual Basic een sterretje (*) accepteren voor vermenigvuldigen en een slashmarkering (/) voor delen.

  • In C# is && de operator logical and. In Visual Basic is de gelijkwaardige operator AndAlso. U gebruikt de operator logical and om te controleren of meer dan één voorwaarde waar is. Als de waarden allemaal juist zijn, retourneert de methode een waarde van true. Anders retourneert de methode een waarde van false.

  • De instructie if maakt gebruik van de eigenschap Value van een Besturingselement NumericUpDown voor toegang tot de huidige waarde van het besturingselement. In de volgende sectie gebruikt u dezelfde eigenschap om het juiste antwoord in elk besturingselement weer te geven.

Een gebeurtenis-handler toevoegen aan de timer

Nu u een manier hebt om de antwoorden te controleren, kunt u de code schrijven voor de Tick-gebeurtenis-handler. Deze code wordt elke seconde uitgevoerd nadat de timer een Tick-gebeurtenis heeft gegenereerd. Deze eventhandler controleert de antwoorden van de quizdeelnemer door CheckTheAnswer()aan te roepen. Ook wordt gecontroleerd hoeveel tijd er in de toets is verstreken.

  1. Dubbelklik op het formulier op het besturingselement Timer of selecteer het en kies vervolgens Enter. Met deze actie wordt een Tick-eventhandler toegevoegd. De code-editor verschijnt en toont de methode van de Tick-handler.

    Voor C# voegt het een regel toe in het Form1.Designer.cs codebestand waarmee de event handler wordt gekoppeld:

    timer1.Tick += new EventHandler(timer1_Tick);
    

    (Voor Visual Basic is die regel niet nodig, maar de gebeurtenis-handler bevat een handles Timer1.Tick die hetzelfde doet.)

  2. Voeg de volgende instructies toe aan de nieuwe event-handler methodefunctie.

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

Elke seconde van de toets wordt deze methode uitgevoerd. De code controleert eerst de waarde die CheckTheAnswer() retourneert.

  • Als alle antwoorden juist zijn, is die waarde trueen eindigt de toets:

    • De timer stopt.
    • Er verschijnt een felicitatiebericht.
    • De eigenschap Ingeschakeld van het besturingselement startButton is ingesteld op true, met de bedoeling dat de quizdeelnemer een andere quiz kan starten.
  • Als CheckTheAnswer()falseretourneert, controleert de code de waarde van timeLeft-:

    • Als deze variabele groter is dan 0, trekt de timer 1 af van timeLeft-. Ook wordt de eigenschap Text van het besturingselement timeLabel bijgewerkt om de deelnemer te tonen hoeveel seconden er nog over zijn.
    • Als er geen tijd overblijft, stopt de timer en wijzigt de timeLabel tekst in Tijd is op. Een berichtvak meldt dat de toets voorbij is en de antwoorden worden onthuld. De startknop wordt weer beschikbaar.

De timer starten

Als u de timer wilt starten wanneer de toets wordt gestart, voegt u drie regels toe aan het einde van de methode StartTheQuiz(), zoals in het volgende voorbeeld wordt weergegeven.

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

Wanneer de toets wordt gestart, stelt deze code de timeLeft variabele in op 30 en de eigenschap Text van het besturingselement timeLabel op 30 seconden. Vervolgens start de Start() methode van het besturingselement Timer het aftellen.

Uw app uitvoeren

  1. Sla uw programma op en voer het uit.

  2. Selecteer De toets starten. De timer begint af te tellen. Wanneer de tijd opraakt, eindigt de toets en worden de antwoorden weergegeven.

  3. Start een andere toets en geef de juiste antwoorden op de wiskundige problemen. Wanneer u het antwoord binnen de tijdslimiet correct beantwoordt, wordt er een berichtvak geopend, wordt de startknop beschikbaar en stopt de timer.

    Schermopname met een voltooide toets met 19 seconden resterend. De knop Toets starten is beschikbaar.

Volgende stappen

Ga naar de volgende tutorial om te leren hoe u uw wiskundetoets kunt aanpassen.