Samouczek: dodawanie czasomierza do testu matematycznego aplikacji WinForms

W tej serii czterech samouczków utworzysz test matematyczny. Test zawiera cztery losowe problemy matematyczne, na które test próbuje odpowiedzieć w określonym czasie.

Test używa kontrolki Czasomierz. Kod za tą kontrolką śledzi czas, który upłynął, i sprawdza odpowiedzi użytkownika testowego.

Z tego trzeciego samouczka dowiesz się, jak wykonywać następujące działania:

  • Dodaj kontrolkę Czasomierz.
  • Dodaj procedurę obsługi zdarzeń dla czasomierza.
  • Napisz kod, aby sprawdzić odpowiedzi użytkownika, wyświetlić komunikaty i wypełnić poprawne odpowiedzi.

Wymagania wstępne

Ten samouczek opiera się na poprzednich samouczkach, zaczynając od sekcji Tworzenie aplikacji WinForms do testu matematycznego. Jeśli te samouczki nie zostały ukończone, najpierw zapoznaj się z nimi.

Dodawanie czasomierza odliczającego w dół

Aby śledzić czas podczas testu, należy użyć składnika czasomierza. Potrzebna jest również zmienna do przechowywania czasu, przez który pozostało.

  1. Dodaj zmienną całkowitą o nazwie timeLeft w taki sam sposób, jak zadeklarowano zmienne w poprzednich samouczkach. Umieść deklarację timeLeft bezpośrednio po innych deklaracjach. Kod powinien wyglądać podobnie do poniższego przykładu.

    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;
    

Ważne

Użyj kontrolki języka programowania w prawym górnym rogu tej strony, aby wyświetlić fragment kodu języka C# lub fragment kodu języka Visual Basic.

Programming language control for Microsoft Learn

  1. W Projektant windows Forms przenieś kontrolkę Timer z kategorii Składniki przybornika do formularza. Kontrolka jest wyświetlana w szarym obszarze w dolnej części okna projektowania.

  2. W formularzu wybierz właśnie dodaną ikonę czasomierza1 i ustaw jej właściwość Interval na 1000. Ponieważ ten interwał jest wyrażony w milisekundach, wartość 1000 powoduje, że czasomierz zgłasza Tick zdarzenie co sekundę.

Sprawdź odpowiedzi

Ponieważ czasomierz zgłasza zdarzenie Znacznik co sekundę, warto sprawdzić czas, który upłynął w procedurze obsługi zdarzeń znaczników. Praktyczne jest również sprawdzenie odpowiedzi w tej procedurze obsługi zdarzeń. Jeśli zabraknie czasu lub odpowiedzi są poprawne, quiz powinien zakończyć się.

Przed napisaniem tego programu obsługi zdarzeń dodaj metodę o nazwie CheckTheAnswer() , aby określić, czy odpowiedzi na problemy matematyczne są poprawne. Ta metoda powinna być zgodna z innymi metodami, takimi jak StartTheQuiz(). Kod powinien wyglądać podobnie do poniższego przykładu.

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

Ta metoda określa odpowiedzi na problemy matematyczne i porównuje wyniki z wartościami w kontrolkach NumericUpDown . W tym kodzie:

  • Wersja języka Visual Basic używa Function słowa kluczowego zamiast zwykłego Sub słowa kluczowego, ponieważ ta metoda zwraca wartość.

  • Nie można łatwo wprowadzić znaku mnożenia (×) i znaku dzielenia (÷) przy użyciu klawiatury, dlatego język C# i Visual Basic akceptują gwiazdkę (*) dla mnożenia i znaku ukośnika (/) dla dzielenia.

  • W języku C# && jest operatorem logical and . W języku Visual Basic równoważny operator to AndAlso. Operator służy do sprawdzania logical and , czy więcej niż jeden warunek jest spełniony. W takim przypadku, jeśli wszystkie wartości są poprawne, metoda zwraca wartość true. W przeciwnym razie metoda zwraca wartość false.

  • Instrukcja if używa właściwości Value kontrolki NumericUpDown w celu uzyskania dostępu do bieżącej wartości kontrolki. W następnej sekcji użyjesz tej samej właściwości, aby wyświetlić poprawną odpowiedź w każdej kontrolce.

Dodawanie procedury obsługi zdarzeń do czasomierza

Teraz, gdy masz sposób sprawdzania odpowiedzi, możesz napisać kod obsługi zdarzeń Tick. Ten kod jest uruchamiany co sekundę, po wywołaniu zdarzenia znacznika. Ta procedura obsługi zdarzeń sprawdza odpowiedzi użytkownika quizu, wywołując polecenie CheckTheAnswer(). Sprawdza również, ile czasu upłynął w quizie.

  1. W formularzu kliknij dwukrotnie kontrolkę Czasomierz lub wybierz ją, a następnie wybierz klawisz Enter. Te akcje dodają program obsługi zdarzeń znaczników do czasomierza. Zostanie wyświetlony edytor kodu i zostanie wyświetlona metoda programu obsługi tick.

  2. Dodaj następujące instrukcje do nowej metody obsługi zdarzeń.

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

Każda sekunda testu, ta metoda jest uruchamiana. Kod najpierw sprawdza zwracaną wartość CheckTheAnswer() .

  • Jeśli wszystkie odpowiedzi są poprawne, ta wartość to true, a test kończy się:

    • Czasomierz zatrzymuje się.
    • Zostanie wyświetlona gratulacyjna wiadomość.
    • Właściwość Enabled kontrolki startButton jest ustawiona na true wartość , aby ten test mógł rozpocząć kolejny test.
  • Jeśli CheckTheAnswer() funkcja zwraca falsewartość , kod sprawdza wartość timeLeft:

    • Jeśli ta zmienna jest większa niż 0, czasomierz odejmuje wartość 1 z timeLeft. Aktualizuje również właściwość Text kontrolki timeLabel , aby pokazać, ile sekund pozostało.
    • Jeśli czas nie pozostanie, czasomierz zostanie zatrzymany i zmieni tekst timeLabel na Time's up! Pole komunikatu informuje, że test się skończył, a odpowiedzi są ujawniane. Przycisk startowy zostanie ponownie dostępny.

Uruchamianie czasomierza

Aby rozpocząć czasomierz po uruchomieniu testu, dodaj trzy wiersze na końcu StartTheQuiz() metody, jak pokazano w poniższym przykładzie.

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

Po rozpoczęciu testu ten kod ustawia zmienną timeLeft na wartość 30, a właściwość Text kontrolki timeLabel na 30 sekund. Start() Następnie metoda kontrolki Czasomierz uruchamia odliczanie.

Uruchamianie aplikacji

  1. Zapisz program i go uruchom.

  2. Wybierz pozycję Rozpocznij test. Czasomierz zaczyna odliczać. Gdy zabraknie czasu, quiz się kończy, a pojawią się odpowiedzi.

  3. Rozpocznij kolejny test i podaj poprawne odpowiedzi na problemy matematyczne. Po poprawnym udzieleniu odpowiedzi w limicie czasu zostanie otwarte okno komunikatu, przycisk uruchamiania stanie się dostępny, a czasomierz zostanie zatrzymany.

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

Następne kroki

Przejdź do następnego samouczka, aby dowiedzieć się, jak dostosować test matematyczny.