Menu
CoddyTech

Simón: El juego completo

Parte de la sección Proyectos del Journey de Arduino de Coddy. Lección 16 de 24.

El Simon real empieza poco a poco y va creciendo. En la ronda 1 se reproduce un color. Cada vez que repites bien una ronda, el tablero mantiene los mismos colores y añade uno al final, hasta que cometes un error.

El arreglo necesita espacio para una partida larga y una variable length para indicar cuánto se usa. Añadir un color son dos líneas:

sequence[length] = random(4);
length++;

Inicializa la semilla una sola vez, cuando empieza el juego. playSequence() ahora reproduce length colores en lugar de cuatro, y una ronda termina cuando step llega a length.

Un error termina el juego con un sonido que claramente no es una nota, de 110 Hz durante un segundo, e imprime la puntuación: las rondas completadas, length - 1, ya que la ronda perdida no cuenta.

El arreglo tiene 20 posiciones y el programa nunca debe escribir más allá del final, así que un jugador que repita 20 colores gana.

challenge icon

Desafío

Difícil

Conviértelo en el juego completo:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; y int length = 0;
  • el juego empieza con un color; cada ronda que se repite correctamente añade uno y los reproduce todos
  • un error: 110 Hz durante 1000 ms, después imprime Game over! Score: y la puntuación, y termina el juego
  • 20 colores repetidos correctamente: imprime You win! y termina el juego

Pulsa Run, mira hasta dónde llegas 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
int step = 0;          // cuántos colores ha repetido el jugador

// 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;
  step = 0;
  playSequence();
}

// El jugador ha soltado el botón del color i: ¿es el siguiente en la secuencia?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

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) {  // se soltó
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconPonte a prueba

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