top of page
Foto del escritorcmarinv2005

Arduino, Juego Simon

Actualizado: 8 ago 2021

Simon es un juego electrónico creado por Ralph Baer y Howard J. Morrison en 1978. Tuvo un gran éxito durante los 80. Tiene forma de disco, en una de sus caras se puede ver cuatro cuadrantes, cada uno con un color: verde, rojo, azul y amarillo en su versión original. Su nombre se debe por el conocido juego tradicional del mismo nombre: Simón dice, de donde se inspira. El juego de forma aleatoria va iluminando los cuadrantes de colores, y a la vez que se ilumina cada cuadrante emite un sonido propio. Después de esperar, el usuario debe ir introduciendo la secuencia mostrada en el orden correcto, ayudándose de su memoria visual y sonora. Si lo consigue, este responderá con una secuencia más larga, y así sucesivamente. Si falla, el usuario debe volver a empezar.

Aquí pueden descargar el código y modificarlo a su gusto:

Suscríbete a mi canal y de esta manera apoyas mi trabajo. http://www.youtube.com/subscription_center?add_user=cmarinv2005




#define Rojo 2

#define Verde 3

#define Amarillo 4

#define Azul 5

#define Campana 7

#define In_Rojo A0

#define In_Verde A1

#define In_Amarillo A2

#define In_Azul A3


int i;

int nivelActual = 1;

int velocidad = 500;

const int MaximiNivel = 50;

int secuencia[MaximiNivel];

int SecuenciaLeida[MaximiNivel];


void setup(){

pinMode(In_Rojo,INPUT_PULLUP);

pinMode(In_Verde,INPUT_PULLUP);

pinMode(In_Amarillo,INPUT_PULLUP);

pinMode(In_Azul,INPUT_PULLUP);

pinMode(Rojo, OUTPUT);

pinMode(Verde, OUTPUT);

pinMode(Amarillo, OUTPUT);

pinMode(Azul, OUTPUT);

inicio();

}


void loop(){

if(nivelActual == 1){

generaSecuencia();

muestraSecuencia();

leeSecuencia();

}

if(nivelActual != 1){

muestraSecuencia();

leeSecuencia();

}

}

// ------------------------ ------------------------

void inicio(){

for (i = 1; i <= 8; i++) {

digitalWrite(Rojo , HIGH);

delay(100);

digitalWrite(Rojo , LOW);

digitalWrite(Verde , HIGH);

delay(100);

digitalWrite(Verde, LOW);

digitalWrite(Amarillo , HIGH);

delay(100);

digitalWrite(Amarillo, LOW);

digitalWrite(Azul , HIGH);

delay(100);

digitalWrite(Azul , LOW);

}

}


void Marcador(){

int unidad = (nivelActual / 4);

imp_unidad(unidad);

int residuo = (nivelActual % 4);

imp_residuo(residuo);

delay(500);

}


void imp_unidad(int n){

for(int x=1;x<=n;x++){

digitalWrite(Rojo , 1);

digitalWrite(Verde, 1);

digitalWrite(Amarillo, 1);

digitalWrite(Azul, 1);

delay(800);

apagados();

delay(300);

}

}


void imp_residuo(int n){

apagados();

if (n==1){

digitalWrite(Azul , 1);

}

if (n==2){

digitalWrite(Amarillo , 1);

digitalWrite(Azul, 1);

}

if (n==3){

digitalWrite(Verde , 1);

digitalWrite(Amarillo, 1);

digitalWrite(Azul, 1);

}

delay(800);

apagados();

delay(300);

}


void apagados(){

digitalWrite(Rojo , LOW);

digitalWrite(Verde, LOW);

digitalWrite(Amarillo, LOW);

digitalWrite(Azul, LOW);

delay(300);

}


// ------------------- --------------- -------


void muestraSecuencia(){

apagados();

for(int i = 0; i < nivelActual; i++){

if( secuencia[i] == Amarillo ){

tone(Campana, 200);

delay(200);

noTone(Campana);

}

if( secuencia[i] == Azul ){

tone(Campana, 300);

delay(200);

noTone(Campana);

}

if( secuencia[i] == Rojo ){

tone(Campana, 400);

delay(200);

noTone(Campana);

}

if( secuencia[i] == Verde ){

tone(Campana, 500);

delay(200);

noTone(Campana);

}

digitalWrite(secuencia[i], HIGH);

delay(velocidad);

digitalWrite(secuencia[i], LOW);

delay(200);

}

}


void leeSecuencia(){

int flag = 0;

for(int i = 0; i < nivelActual; i++){

flag = 0;

while(flag == 0){

if(digitalRead(In_Verde) == LOW){

digitalWrite(Verde, HIGH);

tone(Campana, 500);

delay(300);

noTone(Campana);

SecuenciaLeida[i] = Verde;

flag = 1;

delay(200);

if(SecuenciaLeida[i] != secuencia[i]){

secuenciaError();

return;

}

digitalWrite(Verde, LOW);

}

if(digitalRead(In_Rojo) == LOW){

digitalWrite(Rojo, HIGH);

tone(Campana, 400);

delay(300);

noTone(Campana);

SecuenciaLeida[i] = Rojo;

flag = 1;

delay(200);

if(SecuenciaLeida[i] != secuencia[i]){

secuenciaError();

return;

}

digitalWrite(Rojo, LOW);

}

if(digitalRead(In_Azul) == LOW){

digitalWrite(Azul, HIGH);

tone(Campana, 300);

delay(300);

noTone(Campana);

SecuenciaLeida[i] = Azul;

flag = 1;

delay(200);

if(SecuenciaLeida[i] != secuencia[i]){

secuenciaError();

return;

}

digitalWrite(Azul, LOW);

}

if(digitalRead(In_Amarillo) == LOW){

digitalWrite(Amarillo, HIGH);

tone(Campana, 200);

delay(300);

noTone(Campana);

SecuenciaLeida[i] = Amarillo;

flag = 1;

delay(200);

if(SecuenciaLeida[i] != secuencia[i]){

secuenciaError();

return;

}

digitalWrite(Amarillo, LOW);

}

}

}

secuenciaCorrecta();

}


void generaSecuencia(){

randomSeed(analogRead(5)); // randomSeed(millis());

for(int i = 0; i < MaximiNivel; i++){

secuencia[i] = random(2,6);

}

}



void TonoError(){

int Tono[ ] = {260, 200, 200, 220, 200, 0, 250, 260};

int duracionNotas[] = {4, 8, 8, 4, 4, 4, 4, 4};

for(int i = 0; i < 8; i++){

int duracionNota = 1000/duracionNotas[i];

tone(Campana, Tono[i],duracionNota);

int pausaEntreNotas = duracionNota * 1.30;

delay(pausaEntreNotas);

noTone(Campana);

}

}



void secuenciaError(){

digitalWrite(Amarillo, HIGH);

digitalWrite(Azul, HIGH);

digitalWrite(Rojo, HIGH);

digitalWrite(Verde, HIGH);

delay(400);

digitalWrite(Amarillo, LOW);

digitalWrite(Azul, LOW);

digitalWrite(Rojo, LOW);

digitalWrite(Verde, LOW);

delay(250);

TonoError();

velocidad = 500;

Marcador();

nivelActual = 1;

inicio();

}


void secuenciaCorrecta(){

if(nivelActual < MaximiNivel);

nivelActual++;

//velocidad -= 20; // habilitar para aumentar velocidad del juego en cada nivel

delay(350);

}




134 visualizaciones0 comentarios

Entradas recientes

Ver todo

Comments


Publicar: Blog2_Post
bottom of page