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.
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.
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.
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łegoSub
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 operatoremlogical and
. W języku Visual Basic równoważny operator toAndAlso
. Operator służy do sprawdzanialogical 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.
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.
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 zwracafalse
wartość , 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
Zapisz program i go uruchom.
Wybierz pozycję Rozpocznij test. Czasomierz zaczyna odliczać. Gdy zabraknie czasu, quiz się kończy, a pojawią się odpowiedzi.
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.
Następne kroki
Przejdź do następnego samouczka, aby dowiedzieć się, jak dostosować test matematyczny.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla