Contenido del curso

Proyecto Final 3 

 

Juego Simón Dice

Imagina que pasas las tardes en casa aburrido y, de repente, te viene una idea para hacer más llevadero el paso del tiempo. Decides crear tu propia versión del famoso juego "Simón Dice".

Tu objetivo es programar el MentorBit para crear tu propia versión interactiva del juego, donde los jugadores deben seguir y repetir una secuencia de luces y sonidos generados por el dispositivo.

El juego comenzará con uno de los LED que se encenderá aleatoriamente (el LED Rojo, el LED Vede, el LED Azul y el LED RGB en color Amarillo) y emitirá un sonido, que depende del color (cada color tiene que tener asociado un sonido diferente). Los colores se iluminarán uno tras otro en una secuencia que, empezando en 1, irá aumentando en tamaño a medida que el juego avanza, hasta una secuencia de máximo 30 colores.

Los jugadores deberán reproducir la secuencia iluminando los LEDS en el mismo orden, presionando los pulsadores correspondientes a cada color (se usarán los cuatro pulsadores del MentorBit, cada uno asignado a un color diferente). Si el jugador repite correctamente la secuencia, el juego avanzará a una nueva ronda con una secuencia más larga. Si se equivoca, el juego terminará y se indicará un aviso de error al tiempo que se hacen parpadear todos los LEDs y se genera un sonido diferente de error con el zumbador.

Para volver a empezar el juego, basta con resetear el MentorBit, o volver a cargar el programa.

Para ello vamos a utilizar los siguientes componentes del MentorBit:

  • 4 Pulsadores

  • 3 LEDs y LED RGB

  • Zumbador

Recuerda que, actualmente, el software de mblock no permite el uso de arrays o listas en el apartado de
carga de código a la placa. Por tanto, se debería hacer uso del modo "en vivo" y, dado que puede ser que
no funcione correctamente, aconsejamos hacer las actividades con arrays solamente en C++. Aún así, te
adjuntamos un ejemplo de código de mblock, para que veas cómo se podría plantear o estructurar:


// Proyecto - Juego Simón Dice

// Incluimos las librerías necesarias
#include <MentorBit.h>

// Creamos los objetos que nos permitan trabajar con las clases
MentorBit miMentorBit;

// Variable para guardar la secuencia generada (Máximo 30 elementos)
int secuencia[30];

// Variable para llevar control sobre el número de secuencias acertadas
int nivel = 0;

// Variable para llevar control de la ejecución del programa
bool estamos_jugando = true;

// Guardamos los diferentes pulsadores con nombres más intuitivos
int boton_rojo = miMentorBit.PULSADOR_PULLUP_DIGITAL;
int boton_verde = miMentorBit.PULSADOR_PULLUP_ANALOGICO;
int boton_azul = miMentorBit.PULSADOR_PULLDOWN_DIGITAL;
int boton_amarillo = miMentorBit.PULSADOR_PULLDOWN_ANALOGICO;

// Inicialización del código
void setup() {

    // Configuramos el estado por defecto de los LEDs y el Zumbador
    digitalWrite(miMentorBit.LED_ROJO, LOW);
    digitalWrite(miMentorBit.LED_VERDE, LOW);
    digitalWrite(miMentorBit.LED_AZUL, LOW);
    digitalWrite(miMentorBit.RGB_ROJO, LOW);
    digitalWrite(miMentorBit.RGB_VERDE, LOW);
    digitalWrite(miMentorBit.RGB_AZUL, LOW);
    noTone(miMentorBit.ZUMBADOR);
    // Para generar una serie lo más aleatoria posible, obtenemos la lectura analógica
    // de cualquier puerto analógico que esté al aire, por ejemplo los puertos A4 o A7,
    // ubicados en los Puertos para Módulos
    randomSeed(analogRead(A4));

}

// Bucle principal de funcionamiento
void loop() {

    // Comprobar que el nivel no ha llegado al máximo
    if(!estamos_jugando) {

        // Encendemos todos los LEDs
        digitalWrite(miMentorBit.LED_ROJO, HIGH);
        digitalWrite(miMentorBit.LED_VERDE, HIGH);
        digitalWrite(miMentorBit.LED_AZUL, HIGH);
        digitalWrite(miMentorBit.RGB_ROJO, HIGH);
        digitalWrite(miMentorBit.RGB_VERDE, HIGH);
        digitalWrite(miMentorBit.RGB_AZUL, HIGH);
        // Generamos un tono corto con el Zumbador
        tone(miMentorBit.ZUMBADOR, 2000, 100);
        // Esperamos un poco antes de continuar
        delay(500);
        // Apagamos todos los LEDs
        digitalWrite(miMentorBit.LED_ROJO, LOW);
        digitalWrite(miMentorBit.LED_VERDE, LOW);
        digitalWrite(miMentorBit.LED_AZUL, LOW);
        digitalWrite(miMentorBit.RGB_ROJO, LOW);
        digitalWrite(miMentorBit.RGB_VERDE, LOW);
        digitalWrite(miMentorBit.RGB_AZUL, LOW);

    } else { // Entonces estamos jugando

        // Generamos un nuevo elemento de la secuencia aleatoria
        secuencia[nivel] = random(0, 4);
        // Recorremos la secuencia generada hasta ahora
        for(int i = 0 ; i < nivel + 1 ; i++) {

            // Para cada valor de la secuencia, encendemos el LED correspondiente
            switch(secuencia[i]) {

                case 0: // Color Rojo
                    // Encendemos el LED Rojo
                    digitalWrite(miMentorBit.LED_ROJO, HIGH);
                    // Generamos un tono distinto a los demás
                    tone(miMentorBit.ZUMBADOR, 500, 100);
                    // Esperamos un poco antes de continuar
                    delay(250);
                    // Apagamos el LED Rojo
                    digitalWrite(miMentorBit.LED_ROJO, LOW);
                    break;

                case 1: // Color Verde
                    // Encendemos el LED Verde
                    digitalWrite(miMentorBit.LED_VERDE, HIGH);
                    // Generamos un tono distinto a los demás
                    tone(miMentorBit.ZUMBADOR, 1500, 100);
                    // Esperamos un poco antes de continuar
                    delay(250);
                    // Apagamos el LED Rojo
                    digitalWrite(miMentorBit.LED_VERDE, LOW);
                    break;

                case 2: // Color Azul
                    // Encendemos el LED Azul
                    digitalWrite(miMentorBit.LED_AZUL, HIGH);
                    // Generamos un tono distinto a los demás
                    tone(miMentorBit.ZUMBADOR, 2500, 100);
                    // Esperamos un poco antes de continuar
                    delay(250);
                    // Apagamos el LED Rojo
                    digitalWrite(miMentorBit.LED_AZUL, LOW);
                    break;

                case 3: // Color Amarillo
                    // Encendemos el LED Amarillo
                    digitalWrite(miMentorBit.RGB_ROJO, HIGH);
                    digitalWrite(miMentorBit.RGB_VERDE, HIGH);
                    // Generamos un tono distinto a los demás
                    tone(miMentorBit.ZUMBADOR, 3500, 100);
                    // Esperamos un poco antes de continuar
                    delay(250);
                    // Apagamos el LED Rojo
                    digitalWrite(miMentorBit.RGB_ROJO, LOW);
                    digitalWrite(miMentorBit.RGB_VERDE, LOW);
                    break;

                default:
                    break;

            }

        }

        // Ahora aceptamos la respuesta del usuario para cada elemento de la secuencia
        for(int i = 0 ; i < nivel + 1 ; i++) {

            // Esperamos una pulsación en cualquiera de los botones
            while(
                (digitalRead(boton_rojo) == HIGH) &&
                (digitalRead(boton_verde) == HIGH) &&
                (digitalRead(boton_azul) == LOW) &&
                (digitalRead(boton_amarillo) == LOW)
            ) {

                // Esperamos un poco antes de volver a comprobar los pulsadores
                delay(100);

            }

            // Comprobamos que se haya pulsado el botón Rojo y sea la correcta ahora mismo
            if((digitalRead(boton_rojo) == LOW) && (secuencia[i] == 0)) {

                // Encendemos el LED Rojo
                digitalWrite(miMentorBit.LED_ROJO, HIGH);
                // Generamos un tono distinto a los demás
                tone(miMentorBit.ZUMBADOR, 500, 100);
                // Esperamos un poco antes de continuar
                delay(250);
                // Apagamos el LED Rojo
                digitalWrite(miMentorBit.LED_ROJO, LOW);

            // Comprobamos que se haya pulsado el botón Verde y sea la correcta ahora mismo
            } else if((digitalRead(boton_verde) == LOW) && (secuencia[i] == 1)) {

                // Encendemos el LED Verde
                digitalWrite(miMentorBit.LED_VERDE, HIGH);
                // Generamos un tono distinto a los demás
                tone(miMentorBit.ZUMBADOR, 1500, 100);
                // Esperamos un poco antes de continuar
                delay(250);
                // Apagamos el LED Rojo
                digitalWrite(miMentorBit.LED_VERDE, LOW);

            // Comprobamos que se haya pulsado el botón Azul y sea la correcta ahora mismo
            } else if((digitalRead(boton_azul) == HIGH) && (secuencia[i] == 2)) {

                // Encendemos el LED Azul
                digitalWrite(miMentorBit.LED_AZUL, HIGH);
                // Generamos un tono distinto a los demás
                tone(miMentorBit.ZUMBADOR, 2500, 100);
                // Esperamos un poco antes de continuar
                delay(250);
                // Apagamos el LED Rojo
                digitalWrite(miMentorBit.LED_AZUL, LOW);

            // Comprobamos que se haya pulsado el botón Amarillo y sea la correcta ahora mismo
            } else if((digitalRead(boton_amarillo) == HIGH) && (secuencia[i] == 3)) {

                // Encendemos el LED Amarillo
                digitalWrite(miMentorBit.RGB_ROJO, HIGH);
                digitalWrite(miMentorBit.RGB_VERDE, HIGH);
                // Generamos un tono distinto a los demás
                tone(miMentorBit.ZUMBADOR, 3500, 100);
                // Esperamos un poco antes de continuar
                delay(250);
                // Apagamos el LED Rojo
                digitalWrite(miMentorBit.RGB_ROJO, LOW);
                digitalWrite(miMentorBit.RGB_VERDE, LOW);

            // Si llega a darse este caso, es que el usuario ha fallado la respuesta
            } else {

                // Paramos el juego y salimos del bucle actual
                estamos_jugando = false;
                break;

            }

        }

        // Si llegamos a este punto, el jugador ha acertado todas las respuestas
        // Aumentamos en 1 el nivel actual del juego para continuar jugando
        nivel++;

    }

    // Esperamos un poco antes de continuar
    delay(1000);

}
Vistas
17 Número de vistas
17 Vistas de miembros
0 Vistas públicas
Acciones
0 Gustos
0 No me gusta
0 Comentarios
Compartir en redes sociales
Compartir enlace
Compartir por correo

Por favor iniciar sesión para compartir esto webpage por correo.