Trata-se de um programa simples, executando em modo console, mas já utilizando algumas técnicas interessantes que aprendi lendo o Tutorial da Oracle. Meus meninos gostaram muito, pois os ajudou a estudar matemática. A versão abaixo é a Tabuada de Multiplicação, onde o computador escolhe numeros de 1 a 10 e você deve informar o resultado da multiplicação. Para encerrar, informe 99. No fim, algumas estatísticas são apresentadas, para você avaliar o desempenho do aluno.
Ainda existe espaço para melhorias, o que pretendo fazer em breve, envolvendo executa-lo num browser, por exemplo, para rodar no Tablet do meu filho.
Sâo 2 códigos fontes: TabuadaMultiplica.java e Timer.java, que auxilia na marcação do tempo. Os créditos do Timer.java estão no corpo do código fonte.
import java.io.Console;
import java.util.Arrays;
import java.io.IOException;
// TabuadaMultiplica.java
public class TabuadaMultiplica {
public static final int TOTAL_CONTADORES = 4; // quantidade total de contadores que serão controlados no vetor
public static final int CONTA_TESTES = 0; // indice do contador de quantidade de testes realizados
public static final int CONTA_ERROS = 1; // indice do contador de quantidade de respostas erradas
public static final int CONTA_ACERTOS_BONS = 2; // indice do contador de quantidade de acertos dentro do tempo limite estipulado
public static final int CONTA_ACERTOS_DIRETO = 3; // indice do contador de quantidade de acertos na primeira tentativa
public static final int TOTAL_ELEMENTOS = 10; // numero total de elementos que serão usados para montar as operações
public static final int LIMITE_RESPOSTA = 5; // tempo em segundos considerado limite maximo estipulado
public static void main(String[] args) {
int[] anElementos; // declara o vetor de elementos
int[] anContador; // declara o vetor de contadores
int i; // controle para o indice e loops
int a,b; // indices para os multiplicadores
int nresposta,nacertos,nerros,ntestes,nacertos2;
int nacertosBons; // acertos dentro da faixa de 5 segundos
boolean lsorteia; // controla se deve ocorrer o sorteio de novos elementos ou não
boolean lprimeira; // controla se a resposta dada é a primeira tentativa ou não
Timer tempoTeste = new Timer(); // objeto para marcar o tempo inicial de cada teste
Timer tempoTotal = new Timer(); // objeto para marcar o tempo inicial dos testes
long tempoResposta; // conterá tempo, em segundos, levado para dar a resposta.
anElementos = new int[TOTAL_ELEMENTOS]; // inicializa o vetor de elementos
anContador = new int[TOTAL_CONTADORES]; // inicializa o vetor de contadores
// preenche o vetor
for (i=0; i<TOTAL_ELEMENTOS; i++) {
anElementos[i] = i+1;
}
// teste da console
Console c = System.console();
if (c == null) {
System.err.println("Não há console.");
System.exit(1);
}
nresposta = 0;
anContador[CONTA_TESTES] = 0;
anContador[CONTA_ERROS] = 0;
anContador[CONTA_ACERTOS_BONS] = 0;
anContador[CONTA_ACERTOS_DIRETO] = 0;
// nacertos = 0;
// nacertosBons = 0;
nacertos2 = 0;
// nerros = 0;
// ntestes = 0;
lsorteia = true;
lprimeira = false;
a = 0;
b = 0;
tempoTotal.start(); // inicia a marcação do tempo total do teste
// loop para apresentar as questões
teste:
do {
System.out.println("-------------------------------------------------------------------------:)");
if (lsorteia) {
tempoTeste.start(); // inicia a marcação do tempo da pergunta
a = (int)(Math.random()*TOTAL_ELEMENTOS);
b = (int)(Math.random()*TOTAL_ELEMENTOS);
System.out.println("");
anContador[CONTA_TESTES]++;
lprimeira = true;
}
System.out.println(anContador[CONTA_TESTES] + ") Responda: quanto é " + anElementos[a] + " * " + anElementos[b] + " (99 se quiser parar)?");
try {
String sresposta = c.readLine("? "); // leitura em tipo String
nresposta = (Integer.valueOf(sresposta)).intValue();
} catch (NumberFormatException e) {
System.out.println("Voce não digitou número valido ou não digitou nada... Erro. " );
System.out.println("tente novamente...");
lsorteia = false;
continue teste;
}
switch (nresposta) {
case 99: anContador[CONTA_TESTES]--; // o ultimo teste não foi utilizado e não entrará na conta.
break;
default: if ((anElementos[a] * anElementos[b]) == nresposta) {
if (lprimeira) { anContador[CONTA_ACERTOS_DIRETO]++;
}
nacertos2++;
tempoTeste.end();
tempoResposta = tempoTeste.getTotalTime();
switch (nacertos2) {
case 1: case 5: case 9: System.out.println("Correto!");
break;
case 2: case 6: case 10: System.out.println("Muito Bem!");
break;
case 3: case 7: case 11: System.out.println("Excelente!");
break;
case 4: case 8: case 12: System.out.println("Perfeito!");
break;
case 13: case 14: case 15: case 16: case 17: case 18: case 19: System.out.println("Incrivel! Bruxaria!");
break;
default: System.out.println("Acertou!");
}
} else {
anContador[CONTA_ERROS]++;
System.out.println("Errou... você já tem " + anContador[CONTA_ERROS] + ".");
nacertos2 = 0;
lsorteia = false;
lprimeira = false;
continue teste;
}
lsorteia = true;
if (tempoResposta <=LIMITE_RESPOSTA) {
System.out.println("você respondeu dentro do prazo de " + LIMITE_RESPOSTA + " segundos! Muito Bom!");
anContador[CONTA_ACERTOS_BONS]++;
}
System.out.println("tempo utilizado " + tempoResposta + " segundos.");
}
} while (nresposta != 99);
tempoTotal.end();
System.out.println("-------------------------------------------------------------------------:)");
System.out.println("Estatisticas:");
System.out.println("Total de Testes : " + anContador[CONTA_TESTES]);
try { System.out.println("Acertos na Primeira Tentativa: " + anContador[CONTA_ACERTOS_DIRETO] + " ou " + ((anContador[CONTA_ACERTOS_DIRETO]*100)/anContador[CONTA_TESTES]) + "%" );
System.out.println("Acertos Bons (em ate " + LIMITE_RESPOSTA + " segundos): " + anContador[CONTA_ACERTOS_BONS] + " ou " + ((anContador[CONTA_ACERTOS_BONS]*100)/anContador[CONTA_TESTES]) + "%" );
System.out.println("Total de Erros : " + anContador[CONTA_ERROS] );
System.out.println("Tempo Total dos testes: " + (tempoTotal.getTotalTime()) + " segundos.");
System.out.println("Tempo Medio para responder: " + (tempoTotal.getTotalTime()/anContador[CONTA_TESTES]) + " segundos.");
} catch (ArithmeticException e) {
System.out.println("não há dados estatísticos." + e.getMessage());
}
}
}
//Timer.java
/*
http://tutorials.jenkov.com/java-date-time/time-measurement.html
permite registrar 2 momentos e encontrar e diferença entre eles, em milissegundos
*/
/* exemplo de uso
Timer timer = new Timer();
timer.start(); // registra o tempo inicial
// trecho de codigo que terá seu tempo de operação medido
timer.end(); // registra o fim do tempo
long totalTime = timer.getTotalTime(); // retorna o tempo total em segundos
*/
// package meupacote;
public class Timer {
private long startTime = 0;
private long endTime = 0;
public void start(){
this.startTime = System.currentTimeMillis();
}
public void end() {
this.endTime = System.currentTimeMillis();
}
public long getStartTime() {
return this.startTime;
}
public long getEndTime() {
return this.endTime;
}
public long getTotalTime() {
// retorna o tempo total, convertido em segundos
return (this.endTime - this.startTime)/1000;
}
}