Simón: Secuencia aleatoria
Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 14 de 24.
Ahora le toca el turno al tablero. La primera vez que se suelta un botón, comienza el juego: el tablero elige cuatro colores al azar, los guarda en un array y los reproduce.
random(4) da 0, 1, 2 o 3: un color. Un bucle for llena el array. Como en el juego de reacción, inicializa la semilla con micros() al pulsar o todos los juegos reproducirán los mismos colores:
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}Un segundo bucle for reproduce el patrón: enciende un color con su nota, espera, lo apaga y vuelve a esperar. La segunda espera importa cuando un color aparece dos veces: sin ella, rojo, rojo parece un único rojo largo. Ahora el jugador solo observa, así que delay() está bien.
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}Un bool llamado playing recuerda que el juego ha comenzado, así que solo la primera pulsación lo inicia.
Desafío
IntermedioHaz que la placa reproduzca un patrón:
- añade
int sequence[4];ybool playing = false; - cuando se suelte un botón y
playingseafalse: inicializa la semilla, llena el array conrandom(4), estableceplayingentruey reproduce el patrón - el patrón: espera 500 ms y después cada color con su nota durante 400 ms, seguido de 200 ms de silencio
Después, los botones se iluminan y suenan como antes. Pulsa Run, pulsa un botón y, después, 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
// 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);
}
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);
}
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
4Simón
Simón: Botones y notasSimón: Secuencia aleatoriaSimón: Repite el patrónSimón: El juego completoPractica por tu cuenta: Playground de Arduino