Kurz: Přidání časovače do aplikace WinForms matematického kvízu
V této sérii čtyř kurzů vytvoříte matematický kvíz. Kvíz obsahuje čtyři náhodné matematické problémy, na které se kvíz 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řidání ovládacího prvku Časovač
- 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 aplikací WinForms pro vytvoření matematického kvízu. 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;
Důležité
Pomocí ovládacího prvku programovacího jazyka v pravém horním rohu této stránky můžete zobrazit fragment kódu jazyka C# nebo fragment kódu jazyka Visual Basic.
V návrháři model Windows Forms přesuňte Timer ovládací prvek z kategorie Součásti panelu 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če1 , kterou jste právě přidali, a nastavte jeho vlastnost Interval na 1000. Vzhledem k tomu, že tento interval je v milisekundách, hodnota 1000 způsobí, že časovač vyvolá událost každou sekundu Tick .
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é praktické 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 tuto obslužnou rutinu události, přidejte volanou CheckTheAnswer()
metodu, která určí, 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 NumericUpDown prvcích. V tomto kódu:
Verze jazyka Visual Basic používá
Function
místo obvykléhoSub
klíčového slova klíčové slovo, protože tato metoda vrací hodnotu.Násobení (×) a znaménko dělení (÷) nemůžete snadno zadat pomocí klávesnice, takže jazyk C# a Visual Basic přijímají hvězdičku (*) pro násobení a lomítko (/) pro dělení.
V jazyce C#
&&
je operátorlogical and
. V jazyce Visual Basic jeAndAlso
ekvivalentní operátor . Pomocí operátorulogical and
můžete zkontrolovat, jestli je splněno více než jedna podmínka. V tomto případě, pokud jsou všechny hodnoty správné, metoda vrátí hodnotutrue
. V opačném případě metoda vrátí 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řidání obslužné rutiny 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 spustí každou sekundu po vyvolání události Tick. Tato obslužná rutina události kontroluje odpovědi příjemce 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 události Tick do časovače. Zobrazí se editor kódu a zobrazí metodu obslužné rutiny Tick.
Do nové metody obslužné rutiny události přidejte následující příkazy.
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()
se 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 tak
true
, aby kvíz mohl spustit jiný kvíz.
Pokud
CheckTheAnswer()
se vrátífalse
, kód zkontroluje hodnotu timeLeft:- Pokud je tato proměnná větší než 0, časovač odečte od timeLeft hodnotu 1. Aktualizuje také vlastnost Text ovládacího prvku timeLabel, aby zobrazila kvíz taker, kolik sekund zůstane.
- Pokud žádný čas nezůstane, časovač se zastaví a změní text timeLabel na Time's up. Okno se zprávou oznámí, že kvíz je překonaný a odpovědi se odhalí. 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 StartTheQuiz()
metody 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();
}
Při spuštění kvízu tento kód nastaví proměnnou timeLeft na hodnotu 30 a vlastnost Text ovládacího prvku timeLabel na 30 sekund. Pak metoda Start() ovládacího prvku Časovač spustí odpočítávání.
Spusťte aplikaci
Uložte program a spusťte jej.
Vyberte Spustit 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.