Samouczek: dodawanie czasomierza do testu matematycznego aplikacji WinForms
W tej serii czterech samouczków utworzysz test matematyczny. Test zawiera cztery losowe zadania matematyczne, na które uczestnik próbuje odpowiedzieć w określonym czasie.
Test używa kontrolki Czasomierz. Kod wchodzący w skład tej kontrolki śledzi upływający czas i sprawdza odpowiedzi rozwiązującego quiz.
Z tego trzeciego samouczka dowiesz się, jak wykonywać następujące działania:
- Dodaj kontrolkę Czasomierz do aplikacji Windows Forms.
- Dodaj procedurę obsługi zdarzeń dla czasomierza.
- Napisz kod, aby sprawdzić odpowiedzi użytkownika, wyświetlić komunikaty i wypełnić poprawne odpowiedzi.
Warunki wstępne
Ten samouczek opiera się na poprzednich samouczkach, począwszy od Tworzenie testu matematycznego aplikacji WinForms. Jeśli nie ukończyłeś tych samouczków, najpierw zapoznaj się z nimi.
Dodawanie czasomierza odliczania
Aby śledzić czas podczas testu, należy użyć składnika czasomierza. Potrzebna jest również zmienna do przechowywania czasu, który pozostał.
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;
W narzędziu Windows Forms Designerprzeciągnij kontrolkę Timer z kategorii Komponenty w Przyborniku na formularz. Kontrolka jest wyświetlana w szarym obszarze w dolnej części okna projektowania.
W formularzu wybierz właśnie dodaną ikonę czasomierza i ustaw jej właściwość Interval na 1000. Ponieważ ten interwał jest wyrażony w milisekundach, wartość 1000 powoduje, że czasomierz zgłasza zdarzenie Tick co sekundę.
Sprawdź odpowiedzi
Ponieważ czasomierz zgłasza zdarzenie Tick co sekundę, warto sprawdzić czas, który upłynął w procedurze obsługi zdarzeń Tick. 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 słowa kluczowego
Function
zamiast zwykłego słowa kluczowegoSub
, ponieważ ta metoda zwraca wartość.Nie można łatwo wprowadzić znaku mnożenia (×) ani 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 jestAndAlso
. Operatorlogical and
służy do sprawdzania, 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 zdarzenia Tick. Ten kod jest uruchamiany co sekundę, po wywołaniu zdarzenia znacznika. Ten program obsługi zdarzeń sprawdza odpowiedzi uczestnika quizu, wywołując CheckTheAnswer()
. Sprawdza również, ile czasu upłynął w quizie.
W formularzu kliknij dwukrotnie kontrolkę czasomierza lub wybierz ją, a następnie wybierz Wprowadź. Te akcje dodają obsługę zdarzenia odmierzania czasu. Pojawia się edytor kodu i wyświetla metodę obsługi tick.
W języku C# dodaje wiersz kodu w pliku kodu Form1.Designer.cs, który podłącza procedurę obsługi zdarzeń:
timer1.Tick += new EventHandler(timer1_Tick);
W przypadku języka Visual Basic nie ma potrzeby tego wiersza, ale program obsługi zdarzeń zawiera
handles Timer1.Tick
, który wykonuje to samo.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; } }
Przy każdej sekundzie quizu ta metoda jest uruchamiana. Kod najpierw sprawdza wartość, która CheckTheAnswer()
zwraca.
Jeśli wszystkie odpowiedzi są poprawne, ta wartość jest
true
, a test kończy się:- Czasomierz zatrzymuje się.
- Zostanie wyświetlona gratulacyjna wiadomość.
- Właściwość Enabled kontrolki startButton jest ustawiona na
true
, aby uczestnik mógł rozpocząć kolejny test.
Jeśli
CheckTheAnswer()
zwraca wartośćfalse
, 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 nie pozostał czas, czasomierz zostanie zatrzymany i zmieni timeLabel tekst na Czas się skończył! Okno dialogowe informuje, że quiz 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 metody StartTheQuiz()
, 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 30 oraz właściwość Text kontroli timeLabel na 30 sekund. Następnie metoda Start() kontrolki Czasomierz uruchamia odliczanie.
Uruchamianie aplikacji
Zapisz program i uruchom go.
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ępny krok
Przejdź do następnego samouczka, aby dowiedzieć się, jak dostosować test matematyczny.