7 Okt 2019

19 - Game Tebak Kata

Game Tebak Kata

Setelah kamu selesai membuat sebuah permain bernama "Simon Says", kali ini kamu akan membuat permainan yang tidak kalah menarik, game ini harus dimainkan oleh dua orang. Untuk memainkannya salah seorang memegang LCD dan papan Arduino dan diletakan di atas kepala sehingga tidak terlihat. Pada layar LCD akan menampilkan angka penghitung mundur yang singkat kemudian menampilkan sebuah kata. Pemain yang lain berada didepan orang pertama tadi yang bisa melihat kata apa yang muncul pada LCD, kemudian berusaha memberikan clue pada orang pertama untuk bisa menebak kata dengan benar. Jika tebakannya benar orang yang pertama bisa menekan push buton yang ada pada papan breadboard dan melanjutkan ke tebakan selanjutnya.

Kebutuhan Komponen:

— 1 x Arduino UNO
— 1 x Breadboard
— 1 x LCD
— 1 x Potensiometer
— 1 x Buzzer
— 1 x Push Button
— 1 x Resistor 330Ω
— 20 x Kabel Jumper

Perakitan:

Rangkaian:



Upload Sketch:

Untuk mengisikan program ke board Arduino melalui PC/Laptop dapat menggunakan software Arduino IDE.

Apabila kamu tidak mau menggunakan PC/Laptop untuk mengupload sketch/program ke board Arduino, kamu masih bisa menggunakan handphone Android untuk mengisikan program ke Arduino menggunakan aplikasi Bluino Loader, cara uploadnya pun bisa dua cara melalui USB dengan menggunakan adapter OTG atau melalui Bluetooth.

Cara lain dapat juga upload sketch langsung melalui aplikasi ini ke Arduino melalui USB OTG atau Bluetooth dengan cara menekan ikon upload (tanda panah ke kanan) di bawah.
/*
  19 - Game Tebak Kata

  Ini merupakan versi DIY dari sebuah permainan tebak-tebakan. Untuk memainkannya salah seorang memegang LCD dan papan Arduino
  dan diletakan diatas kepala sehingga tidak terlihat. Pada layar LCD akan menampilkan angka penghitung mundur yang singkat
  kemudian menampilkan nama-nama hewan. Pemain yang lain berada didepan orang pertama tadi yang bisa melihat kata apa 
  yang muncul pada LCD, kemudian berusaha memberikan petunjuk pada orang pertama untuk bisa menebak kata dengan benar.
  Jika tebakannya benar orang yang pertama bisa menekan push button yang ada pada papan breadboard dan melanjutkan ke tebakan selanjutnya.
*/


#include             // menyertakan library liquid crystal yang berisi kumpulan perintah untuk menampilkan tulisan pada layar LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);     //memberitahu Arduino pin-pin mana saja yang dihubungkan ke LCD

int buttonPin = 7;                    //pin yang dihubungkan dengan push button
int buzzerPin = 6;                    //pin yang dihubungkan dengan buzzer
int buttonPressTime = 0;              //variabel untuk menyimpan berapa waktu yang tersisa bagi pemain untuk menebak kata
                        
long timeLimit = 15000;               //batas waktu bagi pemain untuk menebak setiap kata
long startTime = 0;                   //digunakan untuk mengukur waktu yang telah berlalu untuk setiap kata
int roundNumber = 0;                  //terus melacak RoundNumber sehingga dapat ditampilkan di akhir permainan
const int arraySize = 25;

const char* words[arraySize] = {"rusa", "kambing", "beruang", "angsa", "anjing", "kucing", "tupai", "burung", "gajah", "kuda",
  "banteng", "jerapah", "sapi", "kelelawar", "sigung", "kura-kura", "paus", "badak", "singa", "monyet",
  "katak", "buaya", "kanguru", "kuda nil", "kelinci"};
 
int sequence[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};     //mulai dengan daftar array full dari 0s

void setup() {

  pinMode(buttonPin, INPUT_PULLUP);       //atur pin push button sebagai input

  lcd.begin(16, 2);                       //memberi tahu ke library LCD untuk ukuran layar yang digunakan

  generateRandomOrder();                  //memanggil fungsi untuk menghasilkan angka array secara acak dari 1-25 yang akan menentukan urutan kata-kata yang ditampilkan
  
  showStartSequence();                    //menampilkan tulisan ketika start sequence

}

void loop() {
  
  for(int i=0; i timeLimit){         //Jika batas waktu habis sebelum menekan push button
          gameOver();                                 //game akan berakhir
        }

        if(digitalRead(buttonPin) == LOW){
            tone(buzzerPin, 272, 1);
        }
        
      }                       //keluar dari loop ini ketika push button ditekan

      delay(500);             //jeda beberapa saat sebelum melanjutkan ke babak selanjutnya, sehingga penekanan push botton tidak terbaca dua kali
      
    }
  //jika kamu selesai menebak ke 25 kata
  winner();   //tampilkan tulisan You Win
}


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

//DISPLAYS A COUNTDOWN TO START THE GAME
void showStartSequence(){
  
  lcd.clear();                  //bersihkan layar LCD
  
  lcd.setCursor(0,0);           //pindah kursor ke pojik kiri atas
  lcd.print("Katagori:");       //tampilkan tulisan "Katagori:"
  
  lcd.setCursor(0,1);           //move the cursor to the bottom left corner
  lcd.print("Hewan");           //tampilkan tulisan "Hewan:"
  
  delay(2000);                  //tunggu 2 detik

  lcd.clear();                  //bersihkan layar LCD
  lcd.print("Siap!");           //tampilkan tulisan "Siap!"
  delay(1000);                  //tunggu 1 detik

  lcd.clear();                  //bersihkan layar LCD
  lcd.print("3");               //tampilkan "3"
  delay(1000);                  //tunggu 1 detik

  lcd.clear();                  //bersihkan layar LCD
  lcd.print("2");               //tampilkan "2"
  delay(1000);                  //tunggu 1 detik

  lcd.clear();                  //bersihkan layar LCD
  lcd.print("1");               //tampilkan "1"
  delay(1000);                  //tunggu 1 detik
}

//GERNATES A RANDOM ORDER FOR THE WORDS TO BE DISPLAYED
void generateRandomOrder(){
  
  randomSeed(analogRead(0));            //reset random seed (Arduino perlu ini untuk menghasil nomor secara acak)
  
  for (int i = 0; i < 24; i++){         //lakukan langkah ini sampai 25 posisi terpenuhi
    
    int currentNumber = 0;              //variabel untuk menyimpan nomor saat ini
    boolean match = false;              //apakah currentNumber cocok dengan nomor sebelumnya?

    //menghasilkan nomor acak sampai kamu menghasilkan nomor yang tidak cocok dengan nomor yang lain di dalam array
    do {                                       
      currentNumber = random(0,arraySize);      //menghasilkan nomor acak dari 1-25
      match = false;                            //kita belum memeriksa kecocokan, jadi mulailah dengan asumsi bahwa itu tidak cocok
      for (int i = 0; i < arraySize; i++){      //untuk semua 25 nomor didalam array
        if (currentNumber == sequence[i]){      //currentNumber cocok dengan nomor mana saja?
          match = true;                         //jika sama, rubah variabel match ke kondisi true
        }
      }
    } while(match == true);                     //jika variabel match berisi true, menghasilkan nomor acak yang lain dan ulangi lagi
    sequence[i] = currentNumber;                //jika variabel match berisi false, kemudian tambahkan pada sequence
  }
}

//GAME OVER
void gameOver(){
  lcd.clear();                    //bersihkan layar LCD
  
  lcd.setCursor(0,0);             //pindah kursor ke pojok kiri atas
  lcd.print("Game Over");         //tampilkan "Game Over"
  
  lcd.setCursor(0,1);             //pindah kursor ke baris bawah
  lcd.print("Score: ");           //tampilkan tilisan "Score:"
  lcd.print(roundNumber);         //tampilkan nilai score (nomor babak adalah sama dengan nilai score)
  
  //mainkan musik untuk kekalahan
  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);

  while(true){}                   //berhenti di loop ini seterusnya
}

//WINNER
void winner(){
  lcd.clear();                    //bersihkan layar LCD
  
  lcd.setCursor(7,0);             //pindah kursor ke tengah atas
  lcd.print("YOU");               //tampilkan "You"
  
  lcd.setCursor(7,1);             //pindah kursor ke tengah bawah
  lcd.print("WIN!");              //tampilkan "WIN!"

  //mainkan musik 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); 

  while(true){}                   //berhenti di loop ini seterusnya
}

Cara menggunakan:

Permainan dimulai dengan tampil tulisan "Katagori: Hewan" dan penghitung mundur untuk bersiap-siap. Ketika babak pertama dimulai kata yang harus ditebak muncul serta penghitung mundur muncul pada layar LCD. Saat push button ditekan sebelum batas waktu habis kata baru akan muncul. Jika kamu menang atau kalah akan memainkan musik pendek.


0 comments:

Posting Komentar