Simon: Repita o Padrão
Parte da seção Projetos do Journey de Arduino da Coddy. Lição 15 de 24.
Depois que a placa reproduzir a sequência, é a sua vez: repita as quatro cores na mesma ordem. O sketch precisa de mais um número, step, que conta quantas cores você repetiu até agora. A próxima cor que você deve pressionar é sequence[step].
Conte um pressionamento quando o botão for solto, como o jogo já faz para começar. Nesse momento, a luz e a nota já estão apagadas, e o sketch pode reagir sem problemas:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return encerra a função imediatamente, então, depois de uma cor errada, nada do que vem abaixo é executado. Definir playing novamente como false encerra o jogo, e o próximo pressionamento inicia um novo jogo.
Cada novo jogo deve contar desde o início novamente: defina step = 0 em startGame().
Desafio
DifícilDeixe o jogador responder:
- um
int step = 0;, redefinido para 0 emstartGame() - quando um botão for solto e o jogo estiver
playing, chamecheckPress(i) - uma cor errada imprime
Wrong!e encerra o jogo - após quatro cores corretas, imprima
Well done!e encerre o jogo
Inicie Serial em setup(). Pressione Executar, observe, repita o padrão e, em seguida, Verificar.
Experimente você mesmo
// Uma entrada por cor: vermelho, verde, azul, amarelo
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523}; // C, E, G e C agudo
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // a última leitura de cada botão
int sequence[4]; // as cores que a placa reproduz
bool playing = false; // false até que um toque inicie o jogo
// Acenda a cor i e toque sua nota.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Apague a cor i e pare o som.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// Reproduza a sequência: cada cor por 400 ms, seguida de 200 ms de silêncio.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// Escolha uma nova sequência aleatória e reproduza-a.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
playSequence();
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
int state = digitalRead(buttonPins[i]);
if (state == LOW && lastState[i] == HIGH) { // pressionado
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // solto
lightOff(i);
if (playing == false) {
startGame();
}
}
lastState[i] = state;
}
}
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
Pratique por conta própria: Playground de Arduino