Sdílet prostřednictvím


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á.

  1. 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.

Programming language control for Microsoft Learn

  1. 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.

  2. 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ého Sub 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átor logical and . V jazyce Visual Basic je AndAlsoekvivalentní operátor . Pomocí operátoru logical 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í hodnotu true. V opačném případě metoda vrátí hodnotu false.

  • 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.

  1. 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.

  2. 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 truea kvíz končí:

    • Časovač se zastaví.
    • Zobrazí se zpráva s gratulací.
    • Vlastnost Enabled ovládacího prvku startButton je nastavena taktrue, 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

  1. Uložte program a spusťte jej.

  2. Vyberte Spustit kvíz. Časovač se začne odpočítávat. Když vyprší časový limit, kvíz skončí a zobrazí se odpovědi.

  3. 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í.

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

Další kroky

V dalším kurzu se dozvíte, jak přizpůsobit matematický kvíz.