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 tentará responder em 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.
Neste terceiro tutorial, você aprenderá a:
- Adicione um controle de Temporizador.
- Adicionar um manipulador de eventos para o temporizador.
- Escrever 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 para um teste de matemática. Você precisa concluir esses tutoriais antes, caso ainda não tenha feito isso.
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 o tempo restante.
Adicione uma variável de inteiro chamada timeLeft da mesma forma que você declarou variáveis nos tutoriais anteriores. Coloque a declaração timeLeft logo após as outras declarações. O código deve se parecer com o 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;
Importante
Use o controle da linguagem de programação no canto superior direito desta página para exibir os snippets de código C# ou do Visual Basic.
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 parte inferior da janela de design.
No formulário, selecione o ícone timer1 que você acabou de adicionar e defina sua propriedade Intervalo 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 alinhado com os outros métodos, como StartTheQuiz()
. O código deve se parecer com o 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 NumericUpDown. Neste código:
A versão do Visual Basic usa a palavra-chave
Function
em vez da palavra-chave comumSub
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, de modo que o C# e o Visual Basic aceitam um asterisco (*) para multiplicação e uma barra (/) para divisão.
No C#,
&&
é o operadorlogical and
. No Visual Basic, o operador equivalente éAndAlso
. Use o operadorlogical and
para verificar se mais de uma condição é verdadeira. Nesse caso, se todos os valores estiverem corretos, o método retornará um valor detrue
. Caso contrário, o método retorna um valor defalse
.A instrução
if
usa a propriedade Valor 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, pode escrever código para o manipulador de eventos Tick. Esse código é executado a cada segundo, depois que o temporizador gera um evento Tick. O manipulador de eventos verifica as respostas do participante do teste chamando CheckTheAnswer()
. Ele também verifica quanto tempo passou no teste.
No formulário, clique duas vezes no controle de Temporizador ou selecione-o e pressione Enter. Essas ações adicionam um manipulador de eventos Tick ao temporizador. O editor de código aparece e exibe o método do manipulador Tick.
Adicione as seguintes instruções ao novo método do 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. Primeiro, o código verifica o valor que CheckTheAnswer()
retorna.
Se todas as respostas estiverem corretas, esse valor será
true
e o teste terminará:- O temporizador para.
- Uma mensagem de felicitaçã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()
retornarfalse
, 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 atualizará a propriedade Texto do controle timeLabel para mostrar ao participante do teste quantos segundos restam.
- Se não restar mais tempo, o temporizador será interrompido e alterará o texto de timeLabel para O tempo acabou!. Uma caixa de mensagem anuncia que o teste 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 o teste for iniciado, o código definirá a variável timeLeft como 30 e a propriedade Texto do controle timeLabel será definida como 30 segundos. O método Start() de controle do Temporizador inicia a contagem regressiva.
Executar o aplicativo
Salve seu programa e o execute.
Selecione Iniciar o teste. O temporizador inicia a contagem regressiva. Quando o tempo se esgota, o teste termina e a resposta aparece.
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.
Próximas etapas
Prossiga para o próximo tutorial para saber como personalizar seu teste de matemática.