/*
Memory Game
*/
#include "pitches.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27, 16,2);
//hardware
const int button_b = 2;
const int button_g = 3;
const int button_r = 4;
const int button_y = 5;
const int led_g = 6;
const int led_b = 7;
const int led_r = 9;
const int led_y = 10;
const int speaker = 8; //piezo buzzer
const int gameTones[] = { NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
int buttonState[] = {0, 0, 0, 0};
int lastButtonState[] = {0, 0, 0, 0};
int buttonPushCounter[] = {0, 0, 0, 0};
void playTone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speaker, HIGH);
delayMicroseconds(tone);
digitalWrite(speaker, LOW);
delayMicroseconds(tone);
}
}
void setup() {
lcd.init();
lcd.backlight();
randomSeed(analogRead(0));
pinMode(button_b, INPUT_PULLUP);
pinMode(button_g, INPUT_PULLUP);
pinMode(button_r, INPUT_PULLUP);
pinMode(button_y, INPUT_PULLUP);
pinMode(led_g, OUTPUT);
pinMode(led_b, OUTPUT);
pinMode(led_r, OUTPUT);
pinMode(led_y, OUTPUT);
pinMode(speaker, OUTPUT);
}
int game_on = 0;
int wait = 0;
int currentlevel = 1; // This is the level (also the number of button presses to pass to next level)
long rand_num = 0; //initialize long variable for random number from 0-100.
int rando = 0; //initialize random integer for loopgame_on. Will be from 1-4 later.
int butwait = 500; //amount of time to wait for next button input (ghetto de-bounce)
int ledtime = 500; //amount of time each LED flashes for when button is pressed
int n_levels = 10; //number of levels until the game is won
int pinandtone = 0; //This integer is used when the sequence is displayed
int right = 0; //This variable must be 1 in order to go to the next level
int speedfactor = 5; //This is the final speed of the lights and sounds for the last level. This increases as more games are won
int leddelay = 200; //Initializing time for LED. This will decrease as the level increases
int best_score = 0;
void loop() {
int n_array[n_levels];
int u_array[n_levels];
int i;
if (game_on == 0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Best Sore: ");
lcd.setCursor(12,0);
lcd.print(best_score);
delay(2000);
for (i = 0; i < 4; i = i + 1) {
digitalWrite(i + 7, HIGH);
}
playTone(gameTones[2], ledtime);
for (i = 0; i < 4; i =i + 1) {
digitalWrite(i + 7, LOW);
}
delay(200);
for ( i = 0; i < 4; i = i + 1) {
digitalWrite(i + 7, HIGH);
}
playTone(gameTones[2], ledtime);
for (i = 0; i < 4; i =i + 1) {
digitalWrite(i + 7, LOW);
}
currentlevel = 1;
delay(500);
lcd.setCursor(0,0);
lcd.print("START");
delay(1200);
lcd.clear();
for (i = 0; i <n_levels; i = i + 1) {
n_array[i] = 0;
u_array [i] = 0;
rand_num = random(1, 200);
if (rand_num <= 50)
rando = 0;
else if (rand_num>50 && rand_num<=100)
rando=1;
else if (rand_num>100 && rand_num<=150)
rando= 2;
else if (rand_num<=200)
rando= 3;
//saves a random number in our n_array
n_array[i]=rando;
}
game_on = 1;
}
if (wait == 0) {
delay(200);
lcd.setCursor(0,1);
lcd.print("SCORE: ");
lcd.setCursor(7,1);
lcd.print(currentlevel - 1);
lcd.setCursor(0,0);
lcd.print("BEST SCORE: ");
lcd.setCursor(12,0);
lcd.print(best_score);
i = 0;
for ( i = 0; i < currentlevel; i = i + 1) {
leddelay = ledtime / (1 + (speedfactor / n_levels) * (currentlevel - 1));
pinandtone = n_array[i];
digitalWrite(pinandtone + 7, HIGH);
playTone(gameTones[pinandtone], leddelay);
digitalWrite(pinandtone + 7, LOW);
delay(100 / speedfactor);
}
wait = 1;
}
i = 0;
int buttonchange = 0;
int j = 0;
while (j < currentlevel) {
while (buttonchange == 0) {
for (i = 0; i < 4; i = i + 1) {
buttonState[i] = digitalRead(i + 2);
buttonchange = buttonchange + buttonState[i];
}
}
for (i = 0; i < 4; i = i + 1){
if (buttonState[i] == HIGH) {
digitalWrite(i+7, HIGH);
playTone(gameTones[i], ledtime);
digitalWrite(i+7, LOW);
wait = 0;
u_array[j]=i;
buttonState[i] = LOW;
buttonchange = 0;
}
}
if (u_array[j] == n_array[j]) {
j++;
right = 1;
}
else{
right = 0;
i = 4;
j = currentlevel;
wait = 0;
}
}
if (right == 0){
delay(300);
i = 0;
game_on = 0;
currentlevel = 1;
for (i = 0; i < 4; i = i + 1){
digitalWrite(i+7, HIGH);
}
playTone(gameTones[2], ledtime);
for (i = 0; i < 4; i = i + 1){
digitalWrite(i+7, LOW);
}
delay (200);
for (i = 0; i < 4; i = i + 1){
digitalWrite(i+7, HIGH);
}
playTone(gameTones[2], ledtime);
for (i = 0; i < 4; i = i + 1){
digitalWrite(i+7, LOW);
}
delay(500);
game_on = 0;
}
//if you insert the right sequence it levels up
if (right == 1){
currentlevel++;
wait = 0;
}
//if you finish the game
if (currentlevel == n_levels){
delay(500);
// The following is the victory sound:
int notes[] = {2, 2, 2, 2, 0, 1, 2, 1, 2};
int note = 0;
int tempo[] = {200, 200, 200, 400, 400, 400, 200, 200, 600};
int breaks[] = {100, 100, 100, 200, 200, 200, 300, 100, 200};
for (i = 0; i < 9; i = i + 1){
note = notes[i];
digitalWrite(note+7, HIGH);
playTone(gameTones[note], tempo[i]);
digitalWrite(note+7, LOW);
delay(breaks[i]);
}
//sets game_on to 0, so it restarts a new game
game_on = 0;
currentlevel = 1;
n_levels = n_levels + 2;
speedfactor = speedfactor + 1;
}
}