Volver

Construye un juego de Simón Dice con Arduino en Velxio

Introducción

¿Recuerdas el clásico juego de Simón Dice? Es el proyecto perfecto para aprender sobre arrays, máquinas de estado y manejo de entrada de usuario en Arduino. En este tutorial, construiremos un juego de Simón Dice completamente funcional usando cuatro LEDs y cuatro pulsadores, todo simulado directamente en tu navegador con Velxio. ¡No necesitas hardware!

Diagrama del circuito de Simón Dice en el lienzo del simulador de Velxio

Recorrido del Circuito

Veamos los componentes y cómo están conectados.

Componentes

ComponenteIDPropósito
Arduino Unoarduino-unoEl cerebro del juego
LED Rojoled-redSalida para la secuencia roja
LED Verdeled-greenSalida para la secuencia verde
LED Azulled-blueSalida para la secuencia azul
LED Amarilloled-yellowSalida para la secuencia amarilla
Botón Rojobutton-redEntrada del usuario para el rojo
Botón Verdebutton-greenEntrada del usuario para el verde
Botón Azulbutton-blueEntrada del usuario para el azul
Botón Amarillobutton-yellowEntrada del usuario para el amarillo

Cableado

El ánodo (A) de cada LED se conecta a un pin digital del Arduino, y su cátodo (C) va a GND a través de una resistencia limitadora de corriente (simulada internamente). Los botones se cablean con una pata (1.l) a un pin digital y la otra pata (2.l) a GND, usando las resistencias de pull-up internas del Arduino.

Todas las conexiones a tierra comparten el pin GND del Arduino.

Recorrido del Código

Abre el editor de código en Velxio para ver el sketch completo.

Código fuente de Simón Dice en el editor Monaco de Velxio

Constantes y Variables

const int LED_PINS[] = {8, 9, 10, 11};
const int BUTTON_PINS[] = {2, 3, 4, 5};
const int NUM_LEDS = 4;

int sequence[100];
int sequenceLength = 0;
int currentStep = 0;

Definimos arrays para los pines de los LEDs y botones, coincidiendo con el cableado. sequence almacena el patrón aleatorio (hasta 100 pasos). sequenceLength rastrea cuántos pasos debe repetir el jugador, y currentStep rastrea el progreso del jugador.

Configuración

void setup() {
  Serial.begin(9600);

  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LED_PINS[i], OUTPUT);
    pinMode(BUTTON_PINS[i], INPUT_PULLUP);
  }

  randomSeed(millis());
  newGame();
}

Configuramos los pines de los LEDs como salidas y los pines de los botones como entradas con pull-ups internos (así los botones leen LOW cuando se presionan). randomSeed(millis()) asegura una secuencia diferente en cada partida. newGame() inicia la primera ronda.

Lógica del Juego

newGame() reinicia la longitud de la secuencia a 1, añade un paso aleatorio y reproduce la secuencia.

void newGame() {
  sequenceLength = 1;
  currentStep = 0;
  addToSequence();
  playSequence();
}

void addToSequence() {
  sequence[sequenceLength - 1] = random(0, NUM_LEDS);
}

void playSequence() {
  for (int i = 0; i < sequenceLength; i++) {
    flashLED(sequence[i]);
    delay(500);
  }
}

void flashLED(int led) {
  digitalWrite(LED_PINS[led], HIGH);
  delay(300);
  digitalWrite(LED_PINS[led], LOW);
}

playSequence() itera a través de la secuencia almacenada, encendiendo cada LED durante 300ms con un intervalo de 500ms.

Bucle Principal

void loop() {
  for (int i = 0; i < NUM_LEDS; i++) {
    if (digitalRead(BUTTON_PINS[i]) == LOW) {
      flashLED(i);

      if (i == sequence[currentStep]) {
        currentStep++;
        if (currentStep == sequenceLength) {
          delay(1000);
          sequenceLength++;
          currentStep = 0;
          addToSequence();
          playSequence();
        }
      } else {
        // Botón incorrecto - fin del juego
        for (int j = 0; j < 3; j++) {
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], HIGH);
          }
          delay(200);
          for (int k = 0; k < NUM_LEDS; k++) {
            digitalWrite(LED_PINS[k], LOW);
          }
          delay(200);
        }
        newGame();
      }

      delay(300);
      while (digitalRead(BUTTON_PINS[i]) == LOW);
    }
  }
}

El bucle comprueba continuamente todos los botones. Cuando se presiona un botón (LOW), enciende el LED correspondiente. Si el botón presionado coincide con el paso esperado (sequence[currentStep]), avanzamos. Si el jugador completa la secuencia, añadimos un nuevo paso y reproducimos la secuencia más larga. Si es incorrecto, todos los LEDs parpadean tres veces y comienza una nueva partida.

Conceptos Clave

Errores Comunes y Consejos de Depuración

Extensiones Sugeridas

¡Pruébalo Tú Mismo!

¿Listo para jugar? Abre el ejemplo en vivo en Velxio e inicia la simulación. Presiona los botones para repetir la secuencia. ¿Hasta dónde puedes llegar?

Lanzar Simón Dice en Velxio

¡Feliz construcción!


Compartir en:
David Montero

Escrito por

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

Artículos relacionados


Artículo anterior
Demo de pantalla TFT ILI9341: Gráficos y pelota rebotante en Arduino
Artículo siguiente
Ciclo de colores LED RGB con Arduino en Velxio