MACACO EXPLOSÃO
- Manuel Bueno Lasso
- Juan José Pérez Abad
- Pablo de la Hoz Menéndez
- Carlos Chamizo Cano
Introducción:
Macaco Explosão consiste en un juego cooperativo que simula una bomba, la cual deberá ser desactivada por el jugador a través de cuatro pruebas con la ayuda de un compañero, que usará la guía del juego para interpretar las señales del dispositivo. El jugador deberá resolver los cuatro minijuegos para ganar, pudiendo repetir una prueba tantas veces como lo desee, siempre y cuando no pierda en el proceso.
Hardware:
Lista de componentes utilizados:
Implementación:
Se han utilizado un total de 10 puertos digitales y 1 puerto analógico.
Todos los componentes mencionados a excepción de las resistencias se encuentran conectados al puerto GND de la placa y, adicionalmente, el potenciómetro y los pulsadores están conectados al puerto de 5V.
Funcionamiento y Casos de Uso:
El proyecto consiste en resolver 4 minijuegos donde el jugador deberá estar acompañado por un ayudante, el cual posee la guía y deberá dar indicaciones sobre cada minijuego.
El juego comienza en un estado inicial al cual solo se puede acceder al arrancar el dispositivo, al perder en alguno de los minijuegos o al ganar el juego completo. En esta fase, denominada Lobby, se iluminarán todos los leds y sonará una melodía mientras se espera a que el jugador inicie la desactivación de la bomba.
Gracias al pulsador 4, el jugador puede avanzar al menú de selección, esto se indicará con un led amarillo. Cada minijuego corresponderá con un led rojo del dispositivo, entre los cuales el usuario podrá desplazarse usando los pulsadores 1 y 2. Para seleccionar un minijuego el jugador deberá pulsar el botón 3, después de lo cual se emitirá un sonido que confirmará la selección.
La dinámica de la “bomba” es la siguiente. El jugador deberá completar todos los minijuegos, dentro de cada uno de los cuales tendrá una serie de restricciones de uso y un límite de intentos o un límite de tiempo. En el caso de perder en uno de los minijuegos, la bomba explotará, mientras que si se completan exitosamente todos ellos, se indicará mediante una melodía.
El funcionamiento se encuentra explicado en detalle en la guía del juego, que se encuentra en el PDF denominado “Guia_de_juego”.
Minijuegos:
1: O tamanho do macaco
En este juego, el jugador deberá adivinar un número que ha sido elegido de forma aleatoria entre el 0 y el 9, ambos incluidos. Este deberá introducir números mediante una secuencias de 0s y 1s, siendo 0 el primer botón y 1 el segundo botón, siguiendo las traducciones especificadas en la guía. El sistema indicará mediante una combinación de leds y sonidos si el número introducido es mayor o menor. En caso de introducir un código inexistente, se notificará al jugador pero no contará como fallo. El jugador contará con 4 intentos para completar el minijuego.
2: Macaco que não sabe onde está
En este juego, la bomba creará una secuencia aleatoria de 5 pasos, que el jugador deberá adivinar por prueba y error. Para ello, deberá probar a utilizar los cuatro pulsadores en diferentes ordenaciones hasta dar con la secuencia adecuada. En caso de presionar un botón erróneo, el piezo reproducirá un sonido grave y se deberá reiniciar la secuencia. En caso de que se utilice el pulsador correcto, se reproducirá un sonido agudo.
El tiempo para resolver este acertijo es de 40 segundos.
3: Acenda o macaco sônico
En este juego, el jugador deberá superar 3 fases para completar el juego. En cada fase se mostrará una combinación de los leds 1 ,2 y 3. En función de esta combinación de leds se deberá introducir una combinación a través de los botones 1, 2 y 3. Se confirmará la selección pulsando el último botón. Tras introducir el código, se reproducirá una serie de sonidos en función de los pulsadores utilizados y se indicará si estos han sido correctos o no. En caso de error, se iluminará el led 4 para indicar que es un fallo, se volverá a mostrar la combinación anterior y se dará un nuevo intento al jugador. En caso correcto, se pasará a la siguiente fase, o en caso de ser la última fase, se reproducirá una música de victoria. Las 3 fases funcionan de manera similar, sin embargo para cada fase habrá códigos distintos.
El jugador tendrá 3 intentos para completar el juego.
4: Macaco cambalhota
Para este último módulo, se deben superar tres fases para terminar el juego. En la primera fase, se debe introducir un código según los LEDs iluminados con una secuencia de 0s y 1s. En la segunda, sonará el piezo y se debe mover el potenciómetro hasta que se iluminen de nuevo los LEDs , pudiendo también cambiar el sonido. Una vez en la fase tres, en función del tipo de sonido y los LEDs que se iluminen se deberá introducir otro código de 0s y 1s. En caso de fallar 3 veces, se pierde este juego.
Casos de Uso:
El principal caso de uso de este proyecto sería el de un juego de mesa ocasional para dos personas, como Simón Dice o similares. También se podría usar como ejercicio para niños y adultos con el objetivo mejorar el trabajo cooperativo bajo presión y el pensamiento rápido.
Código:
Los minijuegos han sido desarrollados de forma independiente por los diferentes miembros del equipo, de manera que la manera más práctica de integrarlos ha sido la modularización. El número de variables compartidas entre ellos es mínimo, siendo estas las referentes a los puertos de entrada y salida de la placa y, en ocasiones, variables reutilizadas para evitar el alargamiento innecesario del código. De esta manera, la función loop() ha sido dedicada principalmente a la implementación del punto intermedio entre los minijuegos: el menú de selección. Cada minijuego, a su vez, posee una serie de funciones básicas para su funcionamiento, a las que llamará cuando sea necesario.
El código define tres posibles estados en el sistema:
● Estado de Lobby: es una función llamada cada vez que se inicia o termina el juego, donde se permanece indefinidamente en un bucle hasta que se accione un pulsador concreto.
● Estado de Selección: se corresponde con la propia función loop(), donde se permite la selección y llamada a las diferentes funciones que componen los minijuegos.
● Estado de Minijuego: son los módulos que constituyen los minijuegos, a los que se llamará desde el loop(). En caso de victoria, terminarán de forma normal y devolverán un 1, mientras que, en caso de que el jugador pierda, devolverán un 0 y terminarán antes de tiempo, provocando un regreso inmediato al Lobby.
Problemas y soluciones encontradas:
En primer lugar, ha sido imposible reunirse de forma presencial debido a las limitaciones de desplazamientos y las medidas de seguridad que se han tomado durante el período de pandemia. Es por ello que se ha recurrido a reuniones a través de discord para realizar las tareas comunes, como la creación de la memoria, la unificación del código o las pruebas sobre el hardware.
Otro problema encontrado ha sido la heterogeneidad del código de los minijuegos, ya que el hecho de asignar diferentes pruebas a distintas personas ha provocado que cada una de ellas estuviera programada de diferente manera, con variables distintas y, en ocasiones, puertos diferentes. Esto se ha solucionado siguiendo un diseño del código modular a la hora de juntarlo, además de cambiar los nombres de las variables con el objetivo de lograr un conjunto unificado. De esta manera, cada minijuego es una función separada del loop(), que puede llamar a sus propias funciones, y en el loop() ha sido dedicado al código del menú de selección.
La herramienta de simulación utilizada (tinkercad) ha presentado comportamientos inesperados y, en ocasiones, incorrectos, durante las pruebas del código. Esto se acentuó especialmente durante la implementación del contrarreloj, donde el tiempo de la simulación se alteraba enormemente, hasta el punto de que podía llegar a tardar 10 veces más de lo debido en completar los períodos establecidos. Ante esto, fue necesario realizar la implementación de la cuenta atrás a ciegas, sin capacidad de comprobar su funcionamiento hasta el momento de la implementación hardware real.
Vídeo de muestra:
Anexo I: Diagrama conductual
Anexo II: Código de la práctica
#define MAX_TIME 20000 int sound = 2; int leds[4] = {6,5,4,3}; int yLed = 7; int buttons[4] = {8,12,10,9}; int pot = 1; int number = -1; int inNumber = -1; int chance = -1; int ctr = 0; int minigame = 0; int potValue = 0; int trials = 0; int sTime = 0; int cTime = 0; bool finalIt = false; bool switchIt = true; bool soundSolved = false; int numGames = 0; int finished = 0; bool reset = true; bool gameDone[4]= {false, false, false, false}; enum notes{ LOWNOTE = 262, MIDNOTE = 330, MIDNOTE_2 = 392, MIDNOTE_3 = 350, HIGHNOTE = 523, STARTNOTE = 440 }; enum minigame2Notes{ DO = 523, RE = 587, MI = 649 }; enum directions{ UP = 0, DOWN = 1, LEFT = 2, RIGHT = 3 }; int input[4] = {2,2,2,2}; int comb[4] = {2,2,2,2}; int translate(int input[4]){ if(input[0] == 1 && input[1] == 0 && input[2] == 1 && input[3] == 0 ){ return 0; } else if (input[0] == 0 && input[1] == 1 && input[2] == 0 && input[3] == 0 ) { return 1; } else if (input[0] == 1 && input[1] == 1 && input[2] == 1 && input[3] == 1 ) { return 2; } else if (input[0] == 1 && input[1] == 0 && input[2] == 0 && input[3] == 1 ) { return 3; } else if (input[0] == 1 && input[1] == 0 && input[2] == 0 && input[3] == 0 ) { return 4; } else if (input[0] == 0 && input[1] == 0 && input[2] == 1 && input[3] == 0 ) { return 5; } else if (input[0] == 0 && input[1] == 0 && input[2] == 1 && input[3] == 1 ) { return 6; } else if (input[0] == 0 && input[1] == 0 && input[2] == 0 && input[3] == 1 ) { return 7; } else if (input[0] == 0 && input[1] == 0 && input[2] == 0 && input[3] == 0 ) { return 8; } else if (input[0] == 1 && input[1] == 0 && input[2] == 1 && input[3] == 1 ) { return 9; } else { return 10; } } bool code(int comb[4]){ if(comb[0] == 0 && comb[1] == 0 && comb[2] == 1 && comb[3] == 0 && number == 0){ return true; } else if (comb[0] == 1 && comb[1] == 1 && comb[2] == 0 && comb[3] == 1 && number == 1 ) { return true; } else if (comb[0] == 1 && comb[1] == 0 && comb[2] == 0 && comb[3] == 0 && number == 2) { return true; } return false; } int lastButton(){ cTime = millis(); int elapsed = cTime-sTime; if(elapsed >= MAX_TIME && finalIt){ return 6; } else if(elapsed >= MAX_TIME && !finalIt){ if(switchIt){ sTime = cTime; switchIt = false; } finalIt = true; } int bt = -1; int up = 0; int down = 0; int left = 0; int right = 0; while(bt == -1){ cTime = millis(); elapsed = cTime-sTime; if(elapsed >= MAX_TIME/2 || finalIt){ digitalWrite(leds[0],HIGH); } if(elapsed >= MAX_TIME || finalIt){ digitalWrite(leds[1],HIGH); } if(elapsed > MAX_TIME/2 && finalIt){ digitalWrite(leds[2],HIGH); } if(elapsed >= MAX_TIME && finalIt){ return 6; } else if(elapsed >= MAX_TIME && !finalIt){ if(switchIt){ sTime = cTime; switchIt = false; } finalIt = true; } up = digitalRead(buttons[2]); down = digitalRead(buttons[1]); left = digitalRead(buttons[0]); right = digitalRead(buttons[3]); if(up == false){ delay(50); if(up == false){ bt = UP; return bt; } } if(down == false){ delay(50); if(down == false){ bt = DOWN; return bt; } } if(left == false){ delay(50); if(left == false){ bt = LEFT; return bt; } } if(right == false){ delay(50); if(right == false){ bt = RIGHT; return bt; } } } return 0; } bool codeWSound(int comb[4]){ if(comb[0] == 0 && comb[1] == 1 && comb[2]== 0 && comb[3]== 0 && number == 0 ){ return true; } else if(comb[0] == 0 && comb[1] == 0 && comb[2]== 0 && comb[3]== 1 && number == 1 ){ return true; } else if (comb[0] == 1 && comb[1] == 0 && comb[2]== 1 && comb[3]== 1 && number == 2 ){ return true; } else if (comb[0] == 0 && comb[1] == 1 && comb[2]== 1 && comb[3]== 1 && number == 3 ){ return true; } else if (comb[0] == 0 && comb[1] == 1 && comb[2]== 1 && comb[3]== 0 && number == 4 ){ return true; } else if (comb[0] == 1 && comb[1] == 1 && comb[2]== 0 && comb[3]== 0 && number == 5 ){ return true; } return false; } void end(){ tone(sound, MIDNOTE_2,500); delay(500); tone(sound, MIDNOTE_3,500); delay(500); tone(sound,MIDNOTE,500); delay(1000); } int minigame0(){ trials = 0; randomSeed(analogRead(0)); number = random() % 10; chance = 0; tone(sound, STARTNOTE,500); delay(500); while(inNumber != number){ ctr = 0; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } while(ctr < 4){ if(digitalRead(buttons[1]) == false && digitalRead(buttons[2] == true)){ input[ctr] = 1; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); }else if(digitalRead(buttons[2]) == false && digitalRead(buttons[1] == true)){ input[ctr] = 0; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); } if(ctr == 4){ if(translate(input) == 10){ ctr = 0; tone(sound, STARTNOTE,500); delay(500); digitalWrite(leds[1],LOW); digitalWrite(leds[3],LOW); digitalWrite(leds[0],HIGH); digitalWrite(leds[2],HIGH); delay(2000); digitalWrite(leds[0],LOW); digitalWrite(leds[2],LOW); } } } for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } inNumber = translate(input); if(inNumber < number){ trials ++; if(trials == 4){ for(int i = 0;i<4;i++){ digitalWrite(leds[i],HIGH); } end(); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } reset = true; return 0; } chance = random()%2; switch(chance){ case 0: tone(sound,LOWNOTE,500); delay(500); digitalWrite(leds[0],HIGH); delay(2000); break; case 1: tone(sound,HIGHNOTE,500); delay(500); break; } } else if (inNumber > number){ trials ++; if(trials == 4){ for(int i = 0;i<4;i++){ digitalWrite(leds[i],HIGH); } end(); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } reset = true; return 0; } chance = random()%2; switch(chance){ case 0: tone(sound,HIGHNOTE,500); delay(500); digitalWrite(leds[0],HIGH); delay(2000); break; case 1: tone(sound,LOWNOTE,500); delay(500); break; } } else { tone(sound,LOWNOTE,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,HIGHNOTE,500); delay(500); } } return 1; } int minigame1(){ finalIt = false; switchIt = true; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } int start = 0; tone(sound, STARTNOTE,500); delay(500); start = digitalRead(buttons[0]); while(start == true){ start = digitalRead(buttons[0]); if(start == false){ delay(200); } } sTime = millis(); randomSeed(analogRead(0)); int lastB = -1; bool solved = false; int puz[5]; int j =0; for(int i = 0;i<5;i++){ puz[i] = random()%4; } while(!solved){ lastB = lastButton(); if(lastB == 6){ end(); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } reset = true; return 0; } if(lastB == puz[j]){ j++; tone(sound,HIGHNOTE,300); delay(300); } else { j = 0; tone(sound,LOWNOTE,300); delay(300); } if(j == 5){ solved = true; } } tone(sound,LOWNOTE,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,HIGHNOTE,500); delay(500); return 1; } int minigame2(){ for(int i=0;i<3;i++){ digitalWrite(leds[i],LOW); } trials = 0; randomSeed(analogRead(0)); tone(sound, STARTNOTE,500); delay(500); int buttonState [3] = {0,0,0}; bool confirmed = false; bool completed [3] = {false, false, false}; int lights[3]; lights[0] = random()%3; lights[1] = random()%4; lights[2] = random()%7; while(!completed[2]){ confirmed = false; for(int i = 0;i<3;i++){ buttonState[i] = 0; } for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } if(trials == 3){ end(); reset = true; return 0; } if(!completed[0]){ switch(lights[0]){ case 0: digitalWrite(leds[2],HIGH); break; case 1: digitalWrite(leds[0],HIGH); break; case 2: digitalWrite(leds[1],HIGH); break; } } else if(!completed[1]){ switch(lights[1]){ case 0: digitalWrite(leds[0],HIGH); digitalWrite(leds[2],HIGH); break; case 1: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); break; case 2: digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); break; case 3: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); break; } } else if(!completed[2]){ switch(lights[2]){ case 0: digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); break; case 1: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); break; case 2: digitalWrite(leds[0],HIGH); digitalWrite(leds[2],HIGH); break; case 3: digitalWrite(leds[1],HIGH); break; case 4: digitalWrite(leds[0],HIGH); break; case 5: digitalWrite(leds[2],HIGH); break; case 6: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); break; } } delay(1000); for(int i=0;i<3;i++){ digitalWrite(leds[i],LOW); } int k = 0; while(!confirmed){ if(digitalRead(buttons[2]) == false){ buttonState[0] = 1; digitalWrite(leds[0],HIGH); delay(200); } if(digitalRead(buttons[1]) == false){ buttonState[1] = 1; digitalWrite(leds[1],HIGH); delay(200); } if(digitalRead(buttons[0])== false){ buttonState[2] = 1; digitalWrite(leds[2],HIGH); delay(200); } if(digitalRead(buttons[3]) == false){ confirmed = true; delay(200); } } for(int i = 0;i <3;i++){ if(buttonState[i] == 1){ switch(i){ case 0: tone(sound,DO,500); break; case 1: tone(sound,RE,500); break; case 2: tone(sound,MI,500); break; } delay(500); digitalWrite(leds[i],LOW); } } delay(500); if(!completed[0]){ switch(lights[0]){ case 0: if(buttonState[0] == 1 && buttonState[1] == 0 && buttonState[2] == 0){ completed[0] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 1: if(buttonState[0] == 1 && buttonState[1] == 1 && buttonState[2] == 0){ completed[0] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 2: if(buttonState[0] == 1 && buttonState[1] == 0 && buttonState[2] == 1){ completed[0] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; } } else if (!completed[1]){ switch(lights[1]){ case 0: if(buttonState[0] == 0 && buttonState[1] == 1 && buttonState[2] == 1){ completed[1] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 1: if(buttonState[0] == 1 && buttonState[1] == 0 && buttonState[2] == 1){ completed[1] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 2: if(buttonState[0] == 0 && buttonState[1] == 0 && buttonState[2] == 1){ completed[1] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 3: if(buttonState[0] == 1 && buttonState[1] == 1 && buttonState[2] == 0){ completed[1] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; } } else if(!completed[2]){ switch(lights[2]){ case 0: if(buttonState[0] == 0 && buttonState[1] == 1 && buttonState[2] == 1){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 1: if(buttonState[0] == 0 && buttonState[1] == 1 && buttonState[2] == 0){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 2: if(buttonState[0] == 1 && buttonState[1] == 1 && buttonState[2] == 0){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 3: if(buttonState[0] == 1 && buttonState[1] == 0 && buttonState[2] ==1){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 4: if(buttonState[0] == 1 && buttonState[1] == 1 && buttonState[2] == 1){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 5: if(buttonState[0] == 1 && buttonState[1] == 0 && buttonState[2] == 0){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; case 6: if(buttonState[0] == 0 && buttonState[1] == 0 && buttonState[2] == 1){ completed[2] = true; } else { trials ++; digitalWrite(leds[3],HIGH); delay(500); } break; } } } noTone(sound); delay(500); tone(sound,LOWNOTE,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,HIGHNOTE,500); delay(500); return 1; } int minigame3(){ trials = 0; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } randomSeed(analogRead(0)); tone(sound, STARTNOTE,500); delay(500); number = random()%3; switch(number){ case 0: for(int i = 0;i<3;i++){ digitalWrite(leds[i],HIGH); } break; case 1: digitalWrite(leds[0],HIGH); digitalWrite(leds[3],HIGH); break; case 2: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); break; } ctr = 0; delay(4000); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } while(ctr < 4){ if(digitalRead(buttons[1]) == false && digitalRead(buttons[2] == true)){ comb[ctr] = 1; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); }else if(digitalRead(buttons[2]) == false && digitalRead(buttons[1] == true)){ comb[ctr] = 0; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); } if(ctr == 4){ if(code(comb) == false){ trials ++; if(trials == 3){ for(int i = 0;i<4;i++){ digitalWrite(leds[i],HIGH); } tone(sound, MIDNOTE_2,500); delay(500); tone(sound, MIDNOTE_3,500); delay(500); tone(sound,MIDNOTE,500); delay(1000); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } reset = true; return 0; } ctr = 0; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } tone(sound, STARTNOTE,500); delay(500); switch(number){ case 0: for(int i = 0;i<3;i++){ digitalWrite(leds[i],HIGH); } break; case 1: digitalWrite(leds[0],HIGH); digitalWrite(leds[3],HIGH); break; case 2: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); break; } delay(500); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } } } } number = random() %2; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } while(!soundSolved){ switch(number){ case 0: tone(sound, LOWNOTE); delay(500); break; case 1: tone(sound, HIGHNOTE); delay(500); break; } potValue = analogRead(pot); if(potValue> 300 && potValue<550){ if(number == 1){ soundSolved = true; noTone(sound); } } else if(potValue > 650 && potValue<900){ if(number == 0){ soundSolved = true; noTone(sound); } } } for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } number = random()%5; while(!codeWSound(comb)){ switch(number){ case 0: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); digitalWrite(leds[3],HIGH); tone(sound,LOWNOTE); delay(500); break; case 1: digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); tone(sound,LOWNOTE); delay(500); break; case 2: digitalWrite(leds[2],HIGH); digitalWrite(leds[3],HIGH); tone(sound,LOWNOTE); delay(500); break; case 3: digitalWrite(leds[0],HIGH); digitalWrite(leds[1],HIGH); digitalWrite(leds[3],HIGH); tone(sound,HIGHNOTE); delay(500); break; case 4: digitalWrite(leds[1],HIGH); digitalWrite(leds[2],HIGH); tone(sound,HIGHNOTE); delay(500); break; case 5: digitalWrite(leds[2],HIGH); digitalWrite(leds[3],HIGH); tone(sound,HIGHNOTE); delay(500); break; } ctr = 0; delay(4000); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } while(ctr < 4){ if(digitalRead(buttons[1]) == false && digitalRead(buttons[2] == true)){ comb[ctr] = 1; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); }else if(digitalRead(buttons[2]) == false && digitalRead(buttons[1] == true)){ comb[ctr] = 0; digitalWrite(leds[ctr],HIGH); ctr++; delay(200); } } if(!codeWSound(comb)){ trials ++; if(trials == 3){ for(int i = 0;i<4;i++){ digitalWrite(leds[i],HIGH); } tone(sound, MIDNOTE_2,500); delay(500); tone(sound, MIDNOTE_3,500); delay(500); tone(sound,MIDNOTE,500); delay(1000); for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } reset = true; return 0; } } for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } } noTone(sound); delay(500); tone(sound,LOWNOTE,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,HIGHNOTE,500); delay(500); return 1; } int lobby(){ for(int i = 0;i<4;i++){ digitalWrite(leds[i],HIGH); } digitalWrite(yLed,HIGH); while(digitalRead(buttons[3])== true){ tone(sound,HIGHNOTE,40); delay(500); if(digitalRead(buttons[3])== false){ return 0; } tone(sound,LOWNOTE,40); delay(500); } return 0; } void setup(){ pinMode(sound,OUTPUT); pinMode(yLed,OUTPUT); for(int i = 0;i<4;i++){ pinMode(leds[i],OUTPUT); } for(int i = 0;i<3;i++){ pinMode(buttons[i],INPUT); } } void loop(){ if(reset){ lobby(); delay(500); reset = false; } finished = 0; minigame = 0; for(int i = 0;i<4;i++){ digitalWrite(leds[i],LOW); } digitalWrite(yLed,HIGH); digitalWrite(leds[minigame],HIGH); while(digitalRead(buttons[0]) == true){ if(digitalRead(buttons[1]) == false && digitalRead(buttons[2] == true)){ digitalWrite(leds[minigame],LOW); if(minigame < 3){ minigame++; } digitalWrite(leds[minigame],HIGH); delay(200); } else if(digitalRead(buttons[2]) == false && digitalRead(buttons[1] == true)){ digitalWrite(leds[minigame],LOW); if(minigame > 0){ minigame --; } digitalWrite(leds[minigame],HIGH); delay(200); } } digitalWrite(yLed,LOW); digitalWrite(leds[minigame],LOW); switch(minigame){ case 0: finished = minigame0(); if(finished == 1 && gameDone[0] == false){ numGames++; gameDone[0] = true; } break; case 1: finished = minigame1(); if(finished == 1 && gameDone[1] == false){ numGames++; gameDone[1] = true; } break; case 2: finished = minigame2(); if(finished == 1 && gameDone[2] == false){ numGames++; gameDone[2] = true; } break; case 3: finished = minigame3(); if(finished == 1 && gameDone[3] == false){ numGames++; gameDone[3] = true; } break; } if(numGames == 4){ reset = true; noTone(sound); delay(500); tone(sound,LOWNOTE,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,HIGHNOTE,500); delay(500); tone(sound,MIDNOTE_2,500); delay(500); tone(sound,MIDNOTE,500); delay(500); tone(sound,LOWNOTE,500); delay(1000); } }