/*
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.
}
Comments
Please log in or sign up to comment.