Introduction: Arduino Uno Memory Game!

About: I like to shock...

Hey guys!

Here's a quick and easy Arduino memory game!!

Arduino file download here: http://www.mediafire.com/file/qrehasjuqdt17s9/memo...

Or copy and paste this:

Feel free to ask any questions!!

 const int LED_YELLOW  = 10; // Yellow LED pin
const int LED_BLUE    = 11; // Blue LED pin
const int LED_GREEN   = 12; // Green LED pin
const int LED_RED     = 13; // Red LED pin
const int BUTTON_YELLOW = 2;  // Yellow button input pin
const int BUTTON_BLUE   = 3;  // Blue button input pin
const int BUTTON_GREEN  = 4;  // Green button input pin
const int BUTTON_RED    = 5;  // Red button input pin
const int PIEZO         = 6;  // The pin the piezo is connected to
const int STATE_START_GAME        = 0;  // Initial state
const int STATE_PICK_RND_SEQUENCE = 1;  // Pick a random sequence of LEDs
const int STATE_SHOW_RND_SEQUENCE = 2;  // Show the randomly selected sequence of LED flashes
const int STATE_READ_PLAYER_GUESS = 3;  // Read the player's guess
const int STATE_VERIFY_GUESS      = 4;  // Check the guess against the random sequence
const int STATE_GUESS_CORRECT     = 5;  // Player guessed correctly
const int STATE_GUESS_INCORRECT   = 6;  // Player guessed incorrectly
const int MAX_DIFFICULTY_LEVEL    = 9;  // Maximum difficulty level (LED flash sequence length)
// Array used to store the generated random sequence
int randomSequence[MAX_DIFFICULTY_LEVEL];
// Array used to store the player's guess
int playerGuess[MAX_DIFFICULTY_LEVEL];
// A counter to record the number of button presses made by the player
int numButtonPresses;
// The current state the game is in
int currentState;
int nextState;
// The difficulty level (1..MAX_DIFFICULTY_LEVEL)
// (Do not set to zero!)
int difficultyLevel;
void setup() {
  // Initialise input buttons
  for(int i=BUTTON_YELLOW; i<=BUTTON_RED; i++) {
    pinMode(i, INPUT);
  }
  // Initialise LEDs
  for(int i=LED_YELLOW; i<=LED_RED; i++) {
    pinMode(i, OUTPUT);
  }
  // Set initial difficulty level to 1 random flash && put game in start state
  difficultyLevel = 1;
  currentState = STATE_START_GAME;
  nextState = currentState;
  numButtonPresses = 0;
}
void loop() {
  // Run the state machine controlling the game's states
  switch( currentState ) {
    case STATE_START_GAME: 
      delay(5000); // Give player time to get ready
      nextState = STATE_PICK_RND_SEQUENCE; 
      break;
    case STATE_PICK_RND_SEQUENCE:
      generateRndSequence();
      nextState = STATE_SHOW_RND_SEQUENCE;
      break; 
    case STATE_SHOW_RND_SEQUENCE:
      showRndSequence();  // Display the rnd sequence to the player
      nextState = STATE_READ_PLAYER_GUESS;
      break;
    case STATE_READ_PLAYER_GUESS:
      readPlayerGuess();  // Poll buttons and record each button press
      // If all inputs have been made then verify the guess
      if( numButtonPresses >= difficultyLevel ) {
        numButtonPresses = 0;
        nextState = STATE_VERIFY_GUESS;
      }
      break;
    case STATE_VERIFY_GUESS:
      // Check player's guess against the generated random sequence
      if( verifyGuess() ) {
        nextState = STATE_GUESS_CORRECT;
      } else {
        nextState = STATE_GUESS_INCORRECT;
      }
      break;
    case STATE_GUESS_CORRECT:
      // Player was right. Increase difficulty level and goto start game
      soundCorrectGuess();
      difficultyLevel++;
      if( difficultyLevel > MAX_DIFFICULTY_LEVEL )
        difficultyLevel = MAX_DIFFICULTY_LEVEL;
      nextState = STATE_START_GAME;
      break;
    case STATE_GUESS_INCORRECT:
      // Player was wrong. Sound buzzer, show correct sequence, set difficulty level to 1 and re-start game
      soundBuzzer();
      showRndSequence();
      difficultyLevel = 1;
      nextState = STATE_START_GAME;
      break;
  }
  currentState = nextState;
}
// Generate a random sequence of LED pin numbers
void generateRndSequence() {
  for(int i=0; i
// Show random sequence
void showRndSequence() {
  for(int i=0; i
// Read a button press representing a guess from player
void readPlayerGuess() {
  if( digitalRead(BUTTON_YELLOW) == HIGH ) {
    playerGuess[numButtonPresses] = LED_YELLOW;
    numButtonPresses++;
    flashLED(LED_YELLOW, true);
    blockUntilRelease(BUTTON_YELLOW);
  } else if( digitalRead(BUTTON_BLUE) == HIGH ) {
    playerGuess[numButtonPresses] = LED_BLUE;
    numButtonPresses++;
    flashLED(LED_BLUE, true);
    blockUntilRelease(BUTTON_BLUE);
  }else if( digitalRead(BUTTON_GREEN) == HIGH ) {
    playerGuess[numButtonPresses] = LED_GREEN;
    numButtonPresses++;
    flashLED(LED_GREEN, true);
    blockUntilRelease(BUTTON_GREEN);
  }else if( digitalRead(BUTTON_RED) == HIGH ) {
    playerGuess[numButtonPresses] = LED_RED;
    numButtonPresses++;
    flashLED(LED_RED, true);
    blockUntilRelease(BUTTON_RED);
  }
}
void blockUntilRelease(int buttonNumber) {
  while( digitalRead(buttonNumber) == HIGH )
    ;
}
// Compare the guess with the random sequence and return true if identical
bool verifyGuess() {
  bool identical = true;
  for(int i=0; i
// Sound the buzzer for incorrect guess
void soundBuzzer() {
  tone(PIEZO, 100, 2000);
  delay(2300);  
}
void soundCorrectGuess() {
  tone(PIEZO, 700, 100);
  delay(100);
  tone(PIEZO, 800, 100);
  delay(100);
  tone(PIEZO, 900, 100);
  delay(100);
  tone(PIEZO, 1000, 100);
  delay(100);
  tone(PIEZO, 1100, 100);
  delay(100);
  tone(PIEZO, 1200, 100);
  delay(100);
}
// Flash the LED on the given pin
void flashLED(int ledPinNum, bool playSound) {
  digitalWrite(ledPinNum, HIGH);
  if( playSound )
    playSoundForLED(ledPinNum);
  delay(1000);
  digitalWrite(ledPinNum, LOW);
  delay(500);
}
void playSoundForLED(int ledPinNum) {
  int pitch = 0;
  switch(ledPinNum) {
    case LED_YELLOW: pitch = 200; break;
    case LED_BLUE: pitch = 250; break;
    case LED_GREEN: pitch = 300; break;
    case LED_RED: pitch = 350; break;
  }
  tone(PIEZO, pitch, 800);
}
// Get a random LED pin number
int rndLEDPin() {
  return random(LED_YELLOW, LED_RED + 1);
}

Supplies

  • 1x piezo buzzer
  • 4x LEDs ( any 4 colours you like, i have 2 reds because i only have 3 options...)
  • 4x220 ohm resistors (for LEDs)
  • 4x 10k ohm resistors
  • 4x tactile switches ( buttons )6
  • Arduino UNO
  • Jumper cables (several)