Simon Says Video Game
This is the well-known game Simon says which we recreate in Arduino for you to realize.
Components and supplies
1
Switch Actuator, Head for spring return push-button
1
Arduino UNO
1
LED (generic)
1
Buzzer
1
Resistor 220 ohm
Tools and machines
1
Prototyping Kit, Breadboard
Project description
Code
Codigo
arduino
1/* 2 18 - Game Simon Says 3 4 LED akan berkedip dengan dengan pola dan urutan tertentu, kemudian kita menekan push button 5 dengan cara mengikuti pola dan urutan led tersebut. 6*/ 7 8//set pin yang digunakan untuk menghubungkan dengan push button, LED dan buzzer 9int button[] = {2,4,6,8}; //push button merah adalah button[0], hijau adalah button[1], biru adalah button[2], kuning adalah button[3] 10int led[] = {3,5,7,9}; //LED merah adalah led[0], hijau adalah led[1], biru adalah led[2], kuning adalah led[3] 11int tones[] = {262, 330, 392, 494}; //nada-nada yang digunakan untuk tiap push button (c, e, g, b) 12 13int roundsToWin = 10; //jumlah ronde yang harus dimainkan sebelum memenangkan permainan 14int buttonSequence[16]; //membuat array yang akan menjadi urutan yang perlu diingat oleh pemain 15 16int buzzerPin = 10; //pin yang terhubung dengan buzzer 17 18int pressedButton = 4; //variabel untuk mengingat push button mana yang ditekan. 4 adalah nilai jika tidak ada push button yang ditekan. 19int roundCounter = 1; //melacak apa yang sedang dimainkan pemain 20 21 22long startTime = 0; //variabel pengatur waktu untuk batas waktu saat push button ditekan 23long timeLimit = 2000; //batas waktu untuk menekan push button 24 25boolean gameStarted = false; //variabel untuk memberitahu game apakah memainkan atau tidak 26 27void setup(){ 28 29 //mengatur semua pin untuk push button sehingga input_pullup (digunakan sehingga tidak perlu memakai eksternal resistor) 30 pinMode(button[0], INPUT_PULLUP); 31 pinMode(button[1], INPUT_PULLUP); 32 pinMode(button[2], INPUT_PULLUP); 33 pinMode(button[3], INPUT_PULLUP); 34 35 //mengatur semua pin LED sebagai output 36 pinMode(led[0], OUTPUT); 37 pinMode(led[1], OUTPUT); 38 pinMode(led[2], OUTPUT); 39 pinMode(led[3], OUTPUT); 40 41 pinMode(buzzerPin, OUTPUT); //mengatur pin buzzer sebagai output 42} 43 44void loop(){ 45 46if (gameStarted == false){ //jika game belum dimulai 47 startSequence(); //jalankan SQUENCE AWAL 48 roundCounter = 0; //reset penghitung ronde 49 delay(1500); //jeda 1,5 detik 50 gameStarted = true; //atur gameStarted ke kondisi true sehingga urutan ini tidak dimuat kembali 51} 52 53//setiap ronde, akan dimualai dengan start kedipan urutan LED dan diulang 54for(int i=0; i <= roundCounter; i++){ //go through the array up to the current round number 55 flashLED(buttonSequence[i]); //nyalakan LED untuk posisi array yang sesuai dan mainkan lagu 56 delay(200); //tunggu 57 allLEDoff(); //matikan semua LED 58 delay(200); 59} 60 61//kemudian mulai dengan urutan satu persatu dan memeriksa jika pemain menekan push button yang benar 62for(int i=0; i <= roundCounter; i++){ //untuk setiap push button yang akan ditekan dalam sequence 63 64 startTime = millis(); //catat waktu awal mulai 65 66 while(true){ //terus jalankan loop sampai pemain menekan push button atau batas waktu habis (batas waktu bisa cek didalam statement if) 67 68 pressedButton = buttonCheck(); //setiap loop memeriksa push button mana yang ditekan 69 70 if (pressedButton < 4){ //jika sebuah push button ditekan... (angka 4 maksudnya adalah tidak ada push button yang ditekan) 71 72 flashLED(pressedButton); //kedip/flash LED untuk push button yang sudah ditekan 73 74 if(pressedButton == buttonSequence[i]){ //if the button matches the button in the sequence 75 delay(250); //biarkan LED menyalauntuk sesaat 76 allLEDoff(); //kemudian matikan semua LED dan 77 break; //akhiri loop while (ini akan membuat melanjutkan ke nomor selanjutnya didalam loop for) 78 79 } else{ //jika push button yang ditekan tidak sama dengan dengan urutan nyala LED 80 loseSequence(); //jalankan SEQUENCE KALAH 81 break; //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali 82 } 83 84 } else { //jika tidak ada push button yang ditekan 85 allLEDoff(); //tmatikan semua LED 86 } 87 88 //memeriksa apakah waktu sudah habis 89 if(millis() - startTime > timeLimit){ //jika batas waktu habis 90 loseSequence(); //jalankan SEQUENCE KALAH 91 break; //setelah selesai menjalankan SEQUENCE KALAH, break dari loop while sehingga game dapat dimulai kembali 92 } 93 } 94} 95 96 roundCounter = roundCounter + 1; //tambahkan jumlah ronde dengan 1 97 98 if (roundCounter >= roundsToWin){ //jika pemain menyelesaikan ke 16 ronde 99 winSequence(); //mainkan lagu kemenangan 100 } 101 102 delay(500); //tunggu 0.5 detik antara setiap ronde 103 104 105} 106 107//----------FUNCTIONS------------ 108 109//KEDIPKAN LED DAN BUNYIKAN BUZZER 110void flashLED (int ledNumber){ 111 digitalWrite(led[ledNumber], HIGH); 112 tone(buzzerPin, tones[ledNumber]); 113} 114 115//MATIKAN SEMUA LED 116void allLEDoff (){ 117 //matikan semua LED 118 digitalWrite(led[0],LOW); 119 digitalWrite(led[1],LOW); 120 digitalWrite(led[2],LOW); 121 digitalWrite(led[3],LOW); 122 //matikan suara buzzer 123 noTone(buzzerPin); 124} 125 126//PERIKSA push button YANG DITEKAN 127int buttonCheck(){ 128 //periksa jika ada push button yang ditekan 129 if(digitalRead(button[0]) == LOW){ 130 return 0; 131 }else if(digitalRead(button[1]) == LOW){ 132 return 1; 133 }else if(digitalRead(button[2]) == LOW){ 134 return 2; 135 }else if(digitalRead(button[3]) == LOW){ 136 return 3; 137 }else{ 138 return 4; //ini akan menjadi nilai untuk tidak ada push button yang ditekan 139 } 140} 141 142//SEQUENCE AWAL 143void startSequence(){ 144 145 randomSeed(analogRead(A0)); //membuat nomor acak benar-benar acak 146 147 //mengisi array buttonSequence dengan angka acak dari 0 hingga 3 148 for (int i=0;i<=roundsToWin;i++){ 149 buttonSequence[i] = round(random(0,4)); 150 } 151 152 //kedip/flash semua LED ketika game dimulai 153 for(int i=0; i<=3; i++){ 154 155 tone(buzzerPin, tones[i], 200); //memainkan salah satu dari 4 nada 156 157 //turn all of the leds on 158 digitalWrite(led[0],HIGH); 159 digitalWrite(led[1],HIGH); 160 digitalWrite(led[2],HIGH); 161 digitalWrite(led[3],HIGH); 162 163 delay(100); //tunggu sesaat 164 165 //turn all of the leds off 166 digitalWrite(led[0],LOW); 167 digitalWrite(led[1],LOW); 168 digitalWrite(led[2],LOW); 169 digitalWrite(led[3],LOW); 170 171 delay(100); //tunggu sesaat 172 173 } //ini akan diulang sebanyak 4 kali 174} 175 176//SEQUENCE MENANG 177void winSequence(){ 178 179 //nyalakan semua LED 180 for(int j=0; j<=3; j++){ 181 digitalWrite(led[j], HIGH); 182 } 183 184 //mainkan lagu 1Up 185 tone(buzzerPin, 1318, 150); //E6 186 delay(175); 187 tone(buzzerPin, 1567, 150); //G6 188 delay(175); 189 tone(buzzerPin, 2637, 150); //E7 190 delay(175); 191 tone(buzzerPin, 2093, 150); //C7 192 delay(175); 193 tone(buzzerPin, 2349, 150); //D7 194 delay(175); 195 tone(buzzerPin, 3135, 500); //G7 196 delay(500); 197 198 //tunggu sampai sebuah push button ditekan 199 do { 200 pressedButton = buttonCheck(); 201 } while(pressedButton > 3); 202 delay(100); 203 204 gameStarted = false; //reset game sehingga sequence awal dimainkan kembali. 205 206} 207 208//SEQUENCE KALAH 209void loseSequence(){ 210 211 //turn all the LEDs on 212 for(int j=0; j<=3; j++){ 213 digitalWrite(led[j], HIGH); 214 } 215 216 //play the 1Up noise 217 tone(buzzerPin, 130, 250); //E6 218 delay(275); 219 tone(buzzerPin, 73, 250); //G6 220 delay(275); 221 tone(buzzerPin, 65, 150); //E7 222 delay(175); 223 tone(buzzerPin, 98, 500); //C7 224 delay(500); 225 226 //tunggu sampai sebuah push button ditekan 227 do { 228 pressedButton = buttonCheck(); 229 } while(pressedButton > 3); 230 delay(200); 231 232 gameStarted = false; //reset game sehingga sequence awal dimainkan kembali. 233}
Downloadable files
esquematico
esquematico

esquematico
esquematico

Comments
Only logged in users can leave comments