ELEDTROLED
Published © CC BY

Simon Says Video Game

This is the well-known game Simon says which we recreate in Arduino for you to realize.

BeginnerProtip906
Simon Says Video Game

Things used in this project

Hardware components

Switch Actuator, Head for spring return push-button
Switch Actuator, Head for spring return push-button
×1
LED (generic)
LED (generic)
×1
Buzzer
Buzzer
×1
Resistor 220 ohm
Resistor 220 ohm
×1
Arduino UNO
Arduino UNO
×1

Hand tools and fabrication machines

Prototyping Kit, Breadboard
Prototyping Kit, Breadboard

Story

Read more

Schematics

esquematico

Code

Codigo

Arduino
/*
  18 - Game Simon Says

  LED akan berkedip dengan dengan pola dan urutan tertentu, kemudian kita menekan push button 
  dengan cara mengikuti pola dan urutan led tersebut.
*/

//set pin yang digunakan untuk menghubungkan dengan push button, LED dan buzzer
int button[] = {2,4,6,8};     //push button merah adalah button[0], hijau adalah button[1], biru adalah button[2], kuning adalah button[3]
int led[] = {3,5,7,9};        //LED merah adalah led[0], hijau adalah led[1], biru adalah led[2], kuning adalah led[3]
int tones[] = {262, 330, 392, 494};   //nada-nada yang digunakan untuk tiap push button (c, e, g, b)

int roundsToWin = 10;         //jumlah ronde yang harus dimainkan sebelum memenangkan permainan
int buttonSequence[16];       //membuat array yang akan menjadi urutan yang perlu diingat oleh pemain

int buzzerPin = 10;           //pin yang terhubung dengan buzzer

int pressedButton = 4;        //variabel untuk mengingat push button mana yang ditekan. 4 adalah nilai jika tidak ada push button yang ditekan.
int roundCounter = 1;         //melacak apa yang sedang dimainkan pemain


long startTime = 0;           //variabel pengatur waktu untuk batas waktu saat push button ditekan
long timeLimit = 2000;        //batas waktu untuk menekan push button
  
boolean gameStarted = false;      //variabel untuk memberitahu game apakah memainkan atau tidak

void setup(){

  //mengatur semua pin untuk push button sehingga input_pullup (digunakan sehingga tidak perlu memakai eksternal resistor)
  pinMode(button[0], INPUT_PULLUP);
  pinMode(button[1], INPUT_PULLUP);
  pinMode(button[2], INPUT_PULLUP);
  pinMode(button[3], INPUT_PULLUP);
  
  //mengatur semua pin LED sebagai output
  pinMode(led[0], OUTPUT);
  pinMode(led[1], OUTPUT);
  pinMode(led[2], OUTPUT);
  pinMode(led[3], OUTPUT);

  pinMode(buzzerPin, OUTPUT);   //mengatur pin buzzer sebagai output
}

void loop(){

if (gameStarted == false){    //jika game belum dimulai
  startSequence();            //jalankan SQUENCE AWAL
  roundCounter = 0;           //reset penghitung ronde
  delay(1500);                //jeda 1,5 detik
  gameStarted = true;         //atur gameStarted ke kondisi true sehingga urutan ini tidak dimuat kembali
}

//setiap ronde, akan dimualai dengan start kedipan urutan LED dan diulang
for(int i=0; i <= roundCounter; i++){   //go through the array up to the current round number
  flashLED(buttonSequence[i]);          //nyalakan LED untuk posisi array yang sesuai dan mainkan lagu
  delay(200);                           //tunggu
  allLEDoff();                          //matikan semua LED
  delay(200);
}

//kemudian mulai dengan urutan satu persatu dan memeriksa jika pemain menekan push button yang benar
for(int i=0; i <= roundCounter; i++){   //untuk setiap push button yang akan ditekan dalam sequence
  
  startTime = millis();                 //catat waktu awal mulai
  
  while(true){  //terus jalankan loop sampai pemain menekan push button atau batas waktu habis (batas waktu bisa cek didalam statement if)
    
    pressedButton = buttonCheck();      //setiap loop memeriksa push button mana yang ditekan
    
    if (pressedButton < 4){             //jika sebuah push button ditekan... (angka 4 maksudnya adalah tidak ada push button yang ditekan)
      
      flashLED(pressedButton);          //kedip/flash LED untuk push button yang sudah ditekan
      
      if(pressedButton == buttonSequence[i]){   //if the button matches the button in the sequence
          delay(250);                   //biarkan LED menyalauntuk sesaat
          allLEDoff();                  //kemudian matikan semua LED dan
          break;                        //akhiri loop while (ini akan membuat melanjutkan ke nomor selanjutnya didalam loop for)
          
      } else{                           //jika push button yang ditekan tidak sama dengan dengan urutan nyala LED
          loseSequence();               //jalankan SEQUENCE KALAH
          break;                        //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali
      }
    
    } else {                            //jika tidak ada push button yang ditekan
      allLEDoff();                      //tmatikan semua LED
    }

    //memeriksa apakah waktu sudah habis
    if(millis() - startTime > timeLimit){   //jika batas waktu habis
      loseSequence();                       //jalankan SEQUENCE KALAH
      break;                                //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali
    }
  }    
}

  roundCounter = roundCounter + 1;      //tambahkan jumlah ronde dengan 1
  
  if (roundCounter >= roundsToWin){     //jika pemain menyelesaikan ke 16 ronde
    winSequence();                      //mainkan lagu kemenangan
  }
  
  delay(500);                           //tunggu 0.5 detik antara setiap ronde


}

//----------FUNCTIONS------------

//KEDIPKAN LED DAN BUNYIKAN BUZZER
void flashLED (int ledNumber){
  digitalWrite(led[ledNumber], HIGH);
  tone(buzzerPin, tones[ledNumber]);
}

//MATIKAN SEMUA LED
void allLEDoff (){
  //matikan semua LED
  digitalWrite(led[0],LOW);
  digitalWrite(led[1],LOW);
  digitalWrite(led[2],LOW);
  digitalWrite(led[3],LOW);
  //matikan suara buzzer
  noTone(buzzerPin);
}

//PERIKSA push button YANG DITEKAN
int buttonCheck(){
  //periksa jika ada push button yang ditekan
  if(digitalRead(button[0]) == LOW){
    return 0;
  }else if(digitalRead(button[1]) == LOW){
    return 1;
  }else if(digitalRead(button[2]) == LOW){
    return 2;
  }else if(digitalRead(button[3]) == LOW){
    return 3;
  }else{
    return 4; //ini akan menjadi nilai untuk tidak ada push button yang ditekan
  }
}

//SEQUENCE AWAL
void startSequence(){

  randomSeed(analogRead(A0));   //membuat nomor acak benar-benar acak

  //mengisi array buttonSequence dengan angka acak dari 0 hingga 3
  for (int i=0;i<=roundsToWin;i++){
    buttonSequence[i] = round(random(0,4));
  }
 
  //kedip/flash semua LED ketika game dimulai
  for(int i=0; i<=3; i++){
    
    tone(buzzerPin, tones[i], 200); //memainkan salah satu dari 4 nada
    
    //turn all of the leds on
    digitalWrite(led[0],HIGH);
    digitalWrite(led[1],HIGH);
    digitalWrite(led[2],HIGH);
    digitalWrite(led[3],HIGH);
    
    delay(100);         //tunggu sesaat
    
    //turn all of the leds off
    digitalWrite(led[0],LOW);
    digitalWrite(led[1],LOW);
    digitalWrite(led[2],LOW);
    digitalWrite(led[3],LOW);
    
    delay(100);   //tunggu sesaat
  
  } //ini akan diulang sebanyak 4 kali
}

//SEQUENCE MENANG
void winSequence(){

  //nyalakan semua LED
  for(int j=0; j<=3; j++){
    digitalWrite(led[j], HIGH);
  }

  //mainkan lagu 1Up
  tone(buzzerPin, 1318, 150);   //E6
  delay(175);
  tone(buzzerPin, 1567, 150);   //G6
  delay(175);
  tone(buzzerPin, 2637, 150);   //E7
  delay(175);
  tone(buzzerPin, 2093, 150);   //C7
  delay(175);
  tone(buzzerPin, 2349, 150);   //D7
  delay(175);
  tone(buzzerPin, 3135, 500);   //G7
  delay(500);  

  //tunggu sampai sebuah push button ditekan
  do {         
    pressedButton = buttonCheck();
  } while(pressedButton > 3);
  delay(100);

  gameStarted = false;   //reset game sehingga sequence awal dimainkan kembali.
  
}

//SEQUENCE KALAH
void loseSequence(){

  //turn all the LEDs on
  for(int j=0; j<=3; j++){
    digitalWrite(led[j], HIGH);
  }

  //play the 1Up noise
  tone(buzzerPin, 130, 250);   //E6
  delay(275);
  tone(buzzerPin, 73, 250);   //G6
  delay(275);
  tone(buzzerPin, 65, 150);   //E7
  delay(175);
  tone(buzzerPin, 98, 500);   //C7
  delay(500);
  
  //tunggu sampai sebuah push button ditekan
  do {         
    pressedButton = buttonCheck();
  } while(pressedButton > 3);
  delay(200);
  
  gameStarted = false;   //reset game sehingga sequence awal dimainkan kembali.
}

Credits

ELEDTROLED

ELEDTROLED

0 projects • 1 follower

Comments