Memory Game
28 Aug


Posted By
Mercado Roma
0 Comment(s)
1261 View(s)
Demo Video
In this project we will create a simple game to test your memory.
Materials:
- gizDuino LIN (Arduino UNO), USB cable
- 8 x 220 ohms resistor 1/4W
- 4 x LED 5mm (1- Yellow, 2-Green, 1- Red)
- 4 x Push buttons
- 1 x +5v Buzzer
- 16 x 1pin Male – Male jumper wires
- 1 x Breadboard
Breadboard:
CONNECTIONS:
LEDs Pin 7,8,9,10 Push Buttons Pin 2,3,4,5 Buzzer Pin 12
Upload the following code to the Arduino.
/* | |
Memory Game with Arduino | |
Based on a project by Jeremy Wilson | |
Modified by Rui Santos | |
Visit: http://randomnerdtutorials.com | |
*/ | |
// Constants | |
const int button1 = 2; // 1st button controls Blue LED | |
const int button2 = 3; // 2nd button controls Yellow LED | |
const int button3 = 4; // 3rd button controls Green LED | |
const int button4 = 5; // 4th button controls Red LED | |
const int led1 = 7; // Blue LED | |
const int led2 = 8; // Yellow LED | |
const int led3 = 9; // Green LED | |
const int led4 = 10; // Red LED | |
const int buzzer = 12; // Buzzer Output | |
const int tones[] = {1915, 1700, 1519, 1432, 2700}; // tones when you press the LED's - the last one is when you fail. | |
// Variables | |
int buttonState[] = {0,0,0,0}; // current state of the button | |
int lastButtonState[] = {0,0,0,0}; // previous state of the button | |
int buttonPushCounter[] = {0,0,0,0}; | |
void playTone(int tone, int duration) { | |
for (long i = 0; i < duration * 1000L; i += tone * 2) { | |
digitalWrite(buzzer, HIGH); | |
delayMicroseconds(tone); | |
digitalWrite(buzzer, LOW); | |
delayMicroseconds(tone); | |
} | |
} | |
void setup() { | |
// initialize inputs : | |
randomSeed(analogRead(0)); | |
pinMode(button1, INPUT); | |
pinMode(button2, INPUT); | |
pinMode(button3, INPUT); | |
pinMode(button4, INPUT); | |
// initialize outputs: | |
pinMode(led1, OUTPUT); | |
pinMode(led2, OUTPUT); | |
pinMode(led3, OUTPUT); | |
pinMode(led4, OUTPUT); | |
pinMode(buzzer, OUTPUT); | |
// initialize serial communication for debugging: | |
//Serial.begin(9600); | |
} | |
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 | |
void loop() { | |
int n_array[n_levels]; | |
int u_array[n_levels]; | |
int i; | |
//clears arrays both "n_array" and "u_array" and starts a new game | |
if (game_on == 0){ | |
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; | |
} | |
//shows the user the current sequence | |
if (wait == 0){ | |
delay (200); | |
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(tones[pinandtone], leddelay); | |
digitalWrite(pinandtone+7, LOW); | |
delay(100/speedfactor); | |
} | |
wait = 1; | |
} | |
i = 0; | |
int buttonchange = 0; | |
int j = 0; // This is the current position in the sequence | |
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(tones[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(tones[4], 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(tones[4], 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(tones[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; | |
} | |
} | |
Documented by: Kayle Urbano
For more details about the projects, see the following reference: Electronics Projects, Tutorials and Reviews. (n.d.). Retrieved from https://randomnerdtutorials.com/
Leave a Comment