Návod: Přidejte časovač do WinForms aplikace matematického kvízu
V této sérii čtyř kurzů vytvoříte matematický kvíz. Kvíz obsahuje čtyři náhodné matematické úlohy, na které se řešitel kvízu snaží odpovědět v zadaném čase.
Kvíz používá ovládací prvek Časovač. Kód tohoto ovládacího prvku sleduje uplynulý čas a kontroluje odpovědi kvízu.
V tomto třetím kurzu se naučíte:
- Přidejte ovládací prvek časovače.
- Přidejte obslužnou rutinu události pro časovač.
- Napište kód, který zkontroluje odpovědi uživatele, zobrazí zprávy a vyplní správné odpovědi.
Požadavky
Tento kurz vychází z předchozích kurzů počínaje Vytvoření matematické kvízové aplikace WinForms. Pokud jste tyto kurzy ještě nedokončili, projděte si je jako první.
Přidání časovače odpočítávání
Pokud chcete sledovat čas během kvízu, použijte komponentu časovače. Potřebujete také proměnnou, do které se uloží doba, kterou zbývá.
Přidejte celočíselnou proměnnou s názvem timeLeft stejným způsobem, jakým jste deklarovali proměnné v předchozích kurzech. Umístěte deklaraci timeLeft hned za ostatní deklarace. Váš kód by měl vypadat jako v následující ukázce.
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;
V nástroji Windows Forms Designerpřesuňte ovládací prvek Timer z kategorie Součástipanelu nástrojů do formuláře. Ovládací prvek se zobrazí v šedé oblasti v dolní části okna návrhu.
Ve formuláři vyberte ikonu časovač1, kterou jste právě přidali, a nastavte její vlastnost Interval na 1000. Vzhledem k tomu, že tento interval je v milisekundách, hodnota 1000 způsobí, že časovač vyvolá Tick událost každou sekundu.
Podívejte se na odpovědi.
Vzhledem k tomu, že časovač vyvolá událost Tick každou sekundu, dává smysl zkontrolovat uplynulý čas v obslužné rutině události Tick. Je také užitečné zkontrolovat odpovědi v obslužné rutině události. Pokud vypršel časový limit nebo pokud jsou odpovědi správné, měl by kvíz končit.
Než napíšete obslužnou rutinu události, přidejte metodu s názvem CheckTheAnswer()
, abyste zjistili, jestli jsou odpovědi na matematické problémy správné. Tato metoda by měla být v souladu s jinými metodami, například StartTheQuiz()
. Váš kód by měl vypadat jako v následující ukázce.
/// <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;
}
Tato metoda určuje odpovědi na matematické problémy a porovná výsledky s hodnotami v ovládacích prvcích NumericUpDown. V tomto kódu:
Verze jazyka Visual Basic používá místo obvyklého klíčového slova
Sub
klíčové slovoFunction
, protože tato metoda vrací hodnotu.Nemůžete snadno zadat symboly násobení (×) a dělení (÷) pomocí klávesnice, takže jazyky C# a Visual Basic přijímají symbol * pro násobení a symbol / pro dělení.
V jazyce C# je
&&
operátoremlogical and
. V jazyce Visual Basic je ekvivalentní operátorAndAlso
. Pomocí operátorulogical and
můžete zkontrolovat, jestli je splněno více podmínek. V tomto případě, pokud jsou všechny hodnoty správné, metoda vrátí hodnotutrue
. V opačném případě vrátí metoda hodnotufalse
.Příkaz
if
používá vlastnost Value ovládacího prvku NumericUpDown pro přístup k aktuální hodnotě ovládacího prvku. V další části použijete stejnou vlastnost k zobrazení správné odpovědi v každém ovládacím prvku.
Přidejte obslužnou rutinu události do časovače
Teď, když máte způsob, jak zkontrolovat odpovědi, můžete napsat kód pro obslužnou rutinu události Tick. Tento kód se začne spouštět každou sekundu poté, co časovač vyvolá událost Tick. Tato obslužná rutina události kontroluje odpovědi účastníka kvízu voláním CheckTheAnswer()
. Také kontroluje, kolik času uplynulo v kvízu.
Ve formuláři poklikejte na ovládací prvek Časovač nebo ho vyberte a pak vyberte Enter. Tyto akce přidávají obslužnou rutinu pro událost Tick. Editor kódu se zobrazí a ukáže metodu obslužné rutiny Tick.
V jazyce C# přidá řádek kódu do souboru kódu Form1.Designer.cs, který připojí obslužnou rutinu události:
timer1.Tick += new EventHandler(timer1_Tick);
(Pro Visual Basic není potřeba tento řádek, ale obslužná rutina události obsahuje
handles Timer1.Tick
, který dělá totéž.)Do nové metody obslužné rutiny události přidejte následující příkazy.
- jazyka C#
- VB
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ždá sekunda kvízu se spustí tato metoda. Kód nejprve zkontroluje hodnotu, která CheckTheAnswer()
vrátí.
Pokud jsou všechny odpovědi správné, tato hodnota je
true
a kvíz končí:- Časovač se zastaví.
- Zobrazí se zpráva s gratulací.
- Vlastnost Enabled ovládacího prvku startButton je nastavena na
true
, aby účastník kvízu mohl spustit další kvíz.
Pokud
CheckTheAnswer()
vrátífalse
, kód zkontroluje hodnotu timeLeft:- Pokud je tato proměnná větší než 0, časovač odečte hodnotu 1 od timeLeft. Aktualizuje také vlastnost Text ovládacího prvku timeLabel, aby se zobrazilo, kolik sekund zbývá.
- Pokud nezbývá žádný čas, časovač se zastaví a změní text na Čas vypršel. Zobrazí se okno se zprávou oznamující, že kvíz skončil, a odpovědi se zobrazí. Tlačítko Start bude znovu k dispozici.
Spuštění časovače
Pokud chcete spustit časovač při spuštění kvízu, přidejte na konec metody StartTheQuiz()
tři řádky, jak ukazuje následující ukázka.
/// <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();
}
Když se kvíz spustí, nastaví tento kód timeLeft proměnnou na 30 a vlastnost Text ovládacího prvku timeLabel na 30 sekund. Potom Start() metoda ovládacího prvku Časovač spustí odpočítávání.
Spuštění aplikace
Uložte program a spusťte ho.
Vyberte Zahájit kvíz. Časovač se začne odpočítávat. Když vyprší časový limit, kvíz skončí a zobrazí se odpovědi.
Spusťte další kvíz a poskytněte správné odpovědi na matematické problémy. Když správně odpovíte v rámci časového limitu, otevře se okno se zprávou, zobrazí se tlačítko Start a časovač se zastaví.
Další kroky
V dalším kurzu se dozvíte, jak přizpůsobit matematický kvíz.