Simón: Repite el patrón
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 15 de 24.
Después de que el tablero reproduzca la secuencia, es tu turno: repite los cuatro colores en el mismo orden. El sketch necesita un número más, step, que cuenta cuántos colores has repetido hasta ahora. El color que debes pulsar a continuación es sequence[step].
Cuenta una pulsación cuando se suelta el botón, como ya hace el juego al comenzar. Para entonces, su luz y su nota están apagadas, y el sketch puede reaccionar sin 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 sale de la función de inmediato, así que, después de un color incorrecto, no se ejecuta nada de lo que viene a continuación. Al volver a establecer playing en false termina el juego, y la siguiente pulsación inicia uno nuevo.
Cada partida nueva debe volver a contar desde el principio: establece step = 0 en startGame().
Desafío
DifícilHaz que el jugador responda:
- un
int step = 0;, que vuelve a 0 enstartGame() - cuando se suelta un botón y el juego está
playing, llama acheckPress(i) - un color incorrecto imprime
Wrong!y termina el juego - después de cuatro colores correctos, imprime
Well done!y termina el juego
Inicia Serial en setup(). Pulsa Run, observa, repite el patrón y después pulsa Check.
Pruébalo tú mismo
// Una entrada por color: rojo, verde, azul, amarillo
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 y C agudo
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // la última lectura de cada botón
int sequence[4]; // los colores que reproduce la placa
bool playing = false; // false hasta que una pulsación inicia el juego
// Enciende el color i y reproduce su nota.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Apaga el color i y detén el sonido.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// Reproduce la secuencia: cada color durante 400 ms, seguido de 200 ms de silencio.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// Elige una nueva secuencia aleatoria y reprodúcela.
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) { // pulsado
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // soltado
lightOff(i);
if (playing == false) {
startGame();
}
}
lastState[i] = state;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
Practica por tu cuenta: Playground de Arduino