Jogo de Reflexos: Melhor Tempo
Parte da seção Projetos do Journey de Arduino da Coddy. Lição 8 de 24.
O sketch mantém o melhor tempo (o menor) em uma variável e o exibe após cada rodada.
No início, ainda não há um melhor tempo. Use um valor que nenhuma rodada real pode ter, 0, para significar “nenhum ainda”. Após cada rodada: se ainda não houver um melhor tempo ou se esta rodada tiver superado o melhor tempo, esta rodada será o novo melhor tempo.
if (best == 0 || reaction < best) {
best = reaction;
}
Serial.print("Best: ");
Serial.print(best);
Serial.println(" ms");Coloque isso no estado LIT, onde uma rodada termina com um tempo real. Uma falsa largada nunca chega a esse código, então nunca se torna o recorde.
O melhor tempo fica na memória da placa (RAM), que é apagada quando a energia é desligada: o recorde dura até você pressionar Run novamente.
Desafio
MédioMantenha um registro:
- uma variável
best, 0 no início - após cada rodada cronometrada, se
bestfor 0 ou a rodada for mais rápida, salve a rodada como o novo melhor tempo - imprima-o após cada rodada como
Best: 250 ms - falsas partidas não alteram nada
Pressione Run, tente superar seu melhor tempo e, em seguida, Check.
Experimente você mesmo
const int ledPin = 12;
const int buttonPin = 2;
// Os três estados de uma rodada
enum State { READY, WAITING, LIT };
State state = READY;
int lastButton = HIGH; // a leitura anterior do botão
unsigned long waitStart = 0; // quando a espera começou
unsigned long waitTime = 0; // quanto tempo dura esta espera
unsigned long litAt = 0; // quando o LED acendeu
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Press the button to start");
}
void loop() {
int button = digitalRead(buttonPin);
bool pressed = (button == LOW && lastButton == HIGH); // pressionado agora mesmo
lastButton = button;
unsigned long now = millis();
switch (state) {
case READY:
if (pressed) {
randomSeed(micros()); // o instante em que o botão é pressionado nunca é o mesmo duas vezes
waitTime = random(1000, 3001);
waitStart = now;
state = WAITING;
}
break;
case WAITING:
if (pressed) {
// Pressionado antes de a luz acender: largada falsa.
Serial.println("Too soon!");
state = READY;
} else if (now - waitStart >= waitTime) {
digitalWrite(ledPin, HIGH);
litAt = now;
state = LIT;
}
break;
case LIT:
if (pressed) {
digitalWrite(ledPin, LOW);
unsigned long reaction = now - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");
state = READY;
}
break;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Projetos
2Jogo de Reflexos
Jogo de Reflexos: Espera AleatóriaJogo de Reflexos: CronômetroJogo de Reflexos: Falsa PartidaJogo de Reflexos: Melhor TempoPratique por conta própria: Playground de Arduino