Compartilhar via


Tutorial: Adicionar um temporizador a um aplicativo WinForms de teste de matemática

Nesta série de quatro tutoriais, você criará um teste de matemática. O teste contém quatro problemas matemáticos aleatórios que um participante do teste tenta responder dentro de um tempo especificado.

O teste usa um controle de Temporizador. O código por trás desse controle controla o tempo decorrido e verifica as respostas do participante do teste.

Neste terceiro tutorial, você aprenderá a:

  • Adicione um controle Timer.
  • Adicione um manipulador de eventos para o temporizador.
  • Escreva o código para verificar as respostas do usuário, exibir mensagens e preencher as respostas corretas.

Pré-requisitos

Este tutorial se baseia em tutoriais anteriores, começando com Criar um aplicativo WinForms de teste de matemática. Se você ainda não concluiu esses tutoriais, passe por eles primeiro.

Adicionar um temporizador de contagem regressiva

Para acompanhar o tempo durante o teste, use um componente de temporizador. Você também precisa de uma variável para armazenar a quantidade de tempo restante.

  1. Adicione uma variável inteira chamada timeLeft da mesma forma que você declarou variáveis em tutoriais anteriores. Coloque a declaração timeLeft logo após as outras declarações. Seu código deve ser semelhante ao exemplo a seguir.

    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;
    

  1. No Designer de Formulários do Windows, mova um controle Timer da categoria Componentes da Caixa de Ferramentas para seu formulário. O controle aparece na área cinza na base da janela de projeto.

  2. No formulário, selecione o ícone timer1 que você acabou de adicionar e defina sua propriedade Interval como 1000. Como esse intervalo está em milissegundos, um valor de 1000 faz com que o temporizador gere um evento Tick a cada segundo.

Verificar as respostas

Como o temporizador gera um evento Tick a cada segundo, faz sentido verificar o tempo decorrido em um manipulador de eventos Tick. Também é prático verificar as respostas nesse manipulador de eventos. Se o tempo tiver se esgotado ou se as respostas estiverem corretas, o teste deverá terminar.

Antes de escrever esse manipulador de eventos, adicione um método chamado CheckTheAnswer() para determinar se as respostas para os problemas matemáticos estão corretas. Esse método deve estar em linha com os outros métodos, como StartTheQuiz(). Seu código deve ser semelhante ao exemplo a seguir.

/// <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;
}

Esse método determina as respostas para os problemas matemáticos e compara os resultados com os valores nos controles de NumericUpDown. Neste código:

  • A versão do Visual Basic usa a palavra-chave Function em vez da palavra-chave usual Sub porque esse método retorna um valor.

  • Não é possível inserir facilmente o sinal de multiplicação (×) e o sinal de divisão (÷) usando o teclado, para que C# e Visual Basic aceitem um asterisco (*) para multiplicação e uma marca de barra (/) para divisão.

  • No C#, && é o operador logical and. No Visual Basic, o operador equivalente é AndAlso. Use o operador logical and para verificar se mais de uma condição é verdadeira. Nesse caso, se os valores estiverem todos corretos, o método retornará um valor de true. Caso contrário, o método retornará um valor de false.

  • A instrução if usa a propriedade Value de um controle NumericUpDown para acessar o valor atual do controle. Na próxima seção, você usará a mesma propriedade para exibir a resposta correta em cada controle.

Adicionar um manipulador de eventos ao temporizador

Agora que você tem uma maneira de verificar as respostas, você pode escrever o código para o manipulador de eventos Tick. Esse código é executado a cada segundo, depois que o temporizador gera um evento Tick. Esse manipulador de eventos verifica as respostas do participante do teste chamando CheckTheAnswer(). Ele também verifica quanto tempo passou no teste.

  1. No formulário, clique duas vezes no controle Timer, ou selecione-o e depois selecione Enter. Essas ações adicionam um manipulador de eventos Tick. O editor de código aparece e exibe o método do manipulador Tick.

    Para C#, ele adiciona uma linha de código no arquivo de código Form1.Designer.cs que conecta o manipulador de eventos:

    timer1.Tick += new EventHandler(timer1_Tick);
    

    (Para o Visual Basic, não há necessidade dessa linha, mas o manipulador de eventos contém um handles Timer1.Tick que faz a mesma coisa.)

  2. Adicione as instruções a seguir ao novo método de manipulador de eventos.

    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;
        }
    }
    

A cada segundo do teste, esse método é executado. O código primeiro verifica o valor que CheckTheAnswer() retorna.

  • Se todas as respostas estiverem corretas, esse valor será truee o teste terminará:

    • O temporizador para.
    • Uma mensagem de parabenização é exibida.
    • A propriedade Habilitado do controle startButton está definida como true para que o participante do teste possa começar outro teste.
  • Se CheckTheAnswer() retornar false, o código verificará o valor de timeLeft:

    • Se essa variável for maior que 0, o temporizador subtrairá 1 de timeLeft. Ele também atualiza a propriedade Text do controle timeLabel para mostrar ao participante do quiz quantos segundos restam.
    • Se não restar tempo, o temporizador para e muda o texto do timeLabel para Time's up!. Uma caixa de mensagem anuncia que o quiz acabou e as respostas são reveladas. O botão iniciar fica disponível novamente.

Iniciar o temporizador

Para iniciar o temporizador quando o teste for iniciado, adicione três linhas ao final do método StartTheQuiz(), como mostra o exemplo a seguir.

/// <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();
}

Quando seu teste começa, esse código define a variável timeLeft como 30 e a propriedade Text do controle timeLabel como 30 segundos. Em seguida, o método Start() do controle Timer inicia a contagem regressiva.

Executar seu aplicativo

  1. Salve seu programa e execute-o.

  2. Selecione Iniciar o teste. O temporizador começa a contar para baixo. Quando o tempo se esgota, o teste termina e as respostas aparecem.

  3. Inicie outro teste e forneça respostas corretas para os problemas matemáticos. Quando você responde corretamente dentro do limite de tempo, uma caixa de mensagem é aberta, o botão iniciar fica disponível e o temporizador é interrompido.

    Captura de tela que mostra um teste concluído com 19 segundos restantes. O botão Iniciar o teste está disponível.

Próximas etapas

Avance para o próximo tutorial para saber como personalizar seu teste de matemática.