SIMÓN DICE
SIMÓN DICE
Hoy vamos a explicar el típico juego SIMÓN DICE, el cual, para quien no sepa como funciona, trata de seguir una secuencia de sonidos , los cuales tu tienes que intentar repetir mediante la pulsación de unos botones, estos sonidos se van intercalando aleatoriamente cada vez que se reinicia una partida al fallar en la secuencia que tienes que repetir.
El objetivo de este proyecto, es conseguir encender, mediante cables conectados desde la placa base hasta la protoboard, unos leds a través de resistencias que permiten encender estos al pulsar los botones, cada botón deberá estar asignado a una posición en concreto para que al pulsarlo se encienda el led correspondiente.
Es necesario disponer de un zumbador conectado también mediante cables en la protoboard para que nos permita orientar la secuencia por el sonido ya que al encenderse los leds el zumbador sonará de una manera distinta para cada uno, algo que nos permite diferenciarlos entre sonidos mas graves y agudos.
Este sería un modelo de como debería estar montado dicho proyecto:
Este boceto no serviría de nada sin su dicho programa que se encargue de realizar el proceso del juego:
const int led_rojo = 2;
const int led_azul = 3;
const int led_amarillo = 4;
const int led_verde = 5;
// Declaramos el pin para el zumbador piezoelectrico
const int zumbador = 6;
// Declaramos los pins de salida para los botones
const int boton_rojo = 12;
const int boton_azul = 11;
const int boton_amarillo = 10;
const int boton_verde = 9;
// Declaramos alguna variables
long sequence[20]; // Array que alberga la secuencia
int contador = 0; // Contador
long input = 5; // Indicador de boton pulsado
int wait = 500; // Retraso segun la secuencia se incrementa
int puntuacion_maxima = 20; // Puntuación máxima donde acaba el juego
// Declaramos algunas variables para los efectos musicales
int length = 15; // Numero de notas de la melodia
char notes[] = "ccggaagffeeddc "; // Notas de la melodia (cada letra es una nota distinta)
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 }; // Duracion de cada tono en un array
int tempo = 100; //Tempo de la melodia
void setup() {
pinMode(led_rojo, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(led_amarillo, OUTPUT);
pinMode(led_azul, OUTPUT);
pinMode(zumbador, OUTPUT);
pinMode(boton_rojo, INPUT);
pinMode(boton_verde, INPUT);
pinMode(boton_amarillo, INPUT);
pinMode(boton_azul, INPUT);
digitalWrite(boton_rojo, HIGH);
digitalWrite(boton_verde, HIGH);
digitalWrite(boton_amarillo, HIGH);
digitalWrite(boton_azul, HIGH);
felicitacion();
}
void loop() {
mostrar_secuencia(); // Reproduce la sequencia
leer_secuencia(); // Lee la sequencia
delay(1000); // Espera 1 segundo
}
// Funcion para definir las notas y sus frecuencias
void playNote(char note, int duration) {
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
for (int i = 0; i < 8; i++) {
if (names[i] == note) {
playtone(tones[i], duration);
}
}
}
// Funcion para definir las notas segun la duración y el tono
void playtone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone *2) {
digitalWrite(zumbador, HIGH);
delayMicroseconds(tone);
digitalWrite(zumbador, LOW);
delayMicroseconds(tone);
}
}
// Funciones para encender los leds y reproducir el tono correspondiente
void flash_rojo() {
digitalWrite(led_rojo, HIGH);
playtone(2273,wait);
digitalWrite(led_rojo, LOW);
}
void flash_azul() {
digitalWrite(led_azul, HIGH);
playtone(1700,wait);
digitalWrite(led_azul, LOW);
}
void flash_amarillo() {
digitalWrite(led_amarillo, HIGH);
playtone(1275,wait);
digitalWrite(led_amarillo, LOW);
}
void flash_verde() {
digitalWrite(led_verde, HIGH);
playtone(1136,wait);
digitalWrite(led_verde, LOW);
}
// Funcion para mostrar que botón se tenia que pulsar en caso de error del jugador
void mostrar_boton_correcto(long led) {
switch (led) {
case 0:
flash_rojo();
break;
case 1:
flash_verde();
break;
case 2:
flash_amarillo();
break;
case 3:
flash_azul();
break;
}
delay(50);
}
// Función que reproduce la canción al arrancar el arduino y para el juego cuando se llega a la puntuacion maxima
void felicitacion() {
digitalWrite(led_rojo, HIGH);
digitalWrite(led_verde, HIGH);
digitalWrite(led_amarillo, HIGH);
digitalWrite(led_azul, HIGH);
for (int i = 0; i < length; i++) {
if (notes[i] == ' ') {
delay(beats[i] * tempo); // rest
} else {
playNote(notes[i], beats[i] * tempo);
}
delay(tempo / 2);
}
delay(1000);
digitalWrite(led_rojo, LOW);
digitalWrite(led_verde, LOW);
digitalWrite(led_amarillo, LOW);
digitalWrite(led_azul, LOW);
resetcontador();
}
// Reseteamos contadores
void resetcontador() {
contador = 0;
wait = 500;
}
// Funcion para crear y reproducir los patrones
void mostrar_secuencia() {
// Con esto hacemos que la función Random sea aun mas aleatoria
randomSeed(analogRead(8));
sequence[contador] = random(4);
for (int i = 0; i < contador; i++) {
mostrar_boton_correcto( sequence[i]);
}
wait = 500 - (contador * 15);
contador++;
}
// Funcion para leer los botones que pulsa el jugador
void leer_secuencia() {
for (int i=1; i < contador; i++) {
while (input==5){
if (digitalRead(boton_rojo) == LOW) {
input = 0;
}
if (digitalRead(boton_verde) == LOW) {
input = 1;
}
if (digitalRead(boton_amarillo) == LOW) {
input = 2;
}
if (digitalRead(boton_azul) == LOW) {
input = 3;
}
}
if (sequence[i-1] == input) {
mostrar_boton_correcto(input);
if (i == puntuacion_maxima) {
felicitacion();
}
}
else {
playtone(4545,1500);
delay(500);
mostrar_boton_correcto( sequence[i-1]);
mostrar_boton_correcto( sequence[i-1]);
mostrar_boton_correcto( sequence[i-1]);
delay(1000);
felicitacion();
resetcontador();
}
input = 5;
}
}
Aquí dejo una muestra de como debería de funcionar el juego:
Comentarios
Publicar un comentario