Daftar Isi:

Arduino - Ubin Piano: 16 Langkah (dengan Gambar)
Arduino - Ubin Piano: 16 Langkah (dengan Gambar)

Video: Arduino - Ubin Piano: 16 Langkah (dengan Gambar)

Video: Arduino - Ubin Piano: 16 Langkah (dengan Gambar)
Video: FENOMENA ANEH DI MASJIDILHARAM 2024, Juli
Anonim
Arduino - Ubin Piano
Arduino - Ubin Piano

Halo orang-orang internet, Ini akan menjadi tentang bagaimana membuat apa yang PASTI bukan rip off dari game mobile di arduino uno r3.

jadi untuk memulai, Anda akan membutuhkan semua bagian, yaitu sebagai berikut! 1x Arduino Uno r3 ($42)

2x LCD Keypad Shield (masing-masing $19)

5x tombol

5x 220Ω resistor

28x kabel

Baiklah, setelah Anda mendapatkan semua bagian, saatnya untuk memulai!

Langkah 1: Pengkabelan

Pengkabelan
Pengkabelan
Pengkabelan
Pengkabelan
Pengkabelan
Pengkabelan

Mulailah dengan memasang kabel arduino dan teman-teman Anda seperti yang ditunjukkan pada diagram, Pastikan bahwa tombol-tombol terhubung ke atas dengan cara yang benar, dengan slot A0-4 di sisi dasar rel tombol, atau arduino akan mengira tombol-tombol itu ditekan terus-menerus alih-alih hanya dengan menekan.

Langkah 2: Pernyataan Pernyataan

Semua kode di sini harus didahulukan sebelum void setup dan void loop, ini karena semua variabel dan objek ini digunakan di beberapa fungsi yang akan kita atur.

Mulailah dengan meletakkan:

#termasuk

di bagian atas kode Anda, ini memberi tahu arduino untuk menggunakan perpustakaan "LiquidCrystal.h" dan fungsi-fungsi yang merupakan bagian darinya.

Langkah selanjutnya adalah menentukan pin yang kita gunakan untuk tombol kita dengan meletakkan kode ini di bawah #include:

#define btnEnter A0#define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Kami mendefinisikan istilah btnEnter dan btn1 ke btn 4 untuk membuat kode lebih mudah dibaca, atau diubah jika perlu. Artinya ketika kita mengetik btn1 maka arduino akan mengetahui bahwa yang kita maksud sebenarnya adalah tombol 15. Meskipun kita memanggil port 15, 16, 17 dan 18, mereka diberi label pada arduino sebagai A1 A2 A3 dan A4, ini karena mereka adalah port yang digunakan khusus untuk input analog, meskipun kami hanya menggunakannya untuk input digital.

Selanjutnya kita akan membuat objek yang akan mengontrol Liquid Crystal Displays. Untuk melakukan ini, letakkan kode ini di bawah definisi kami

LiquidCrystal lcdKiri(8, 9, 12, 10, 11, 13);LiquidCrystal lcdKanan(2, 3, 4, 5, 6, 7);

Apa yang dilakukan adalah memberitahu arduino bahwa ketika kita memanggil lcdLeft atau lcdRight kita mengacu pada objek LiquidCrystal. Angka-angka dalam kurung terlampir memberi tahu arduino port mana yang harus digunakan objek untuk mengirim pesan ke LCD saat kita menggunakan fungsinya.

Sekarang kita perlu mendeklarasikan variabel dengan meletakkan bit kode berikutnya di bawah deklarasi objek:

//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan game yang lebih cepat hingga intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

//set up variabel untuk bolPlay gameboolean; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk memberitahu kesulitan apa permainan ini //set up variabel untuk input int intEnter; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //memastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kehilangan //mengatur variabel untuk turn int intTick; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed; // sedikit opsi debug boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial

Kami mendeklarasikan variabel dengan menyatakan tipe data dan kemudian nama variabel, mis. int thisIsAnInteger

Variabel Boolean, seperti bolSerialBoard dan bolPlay hanya dapat memiliki satu dari dua nilai, benar atau salah.

Variabel integer (int) seperti intScore dan intInput dapat mengambil bilangan bulat sebagai nilai, seperti 1, 5 atau 100.

Beberapa tipe data penting lainnya yang tidak kita gunakan di sini adalah string, yang merupakan potongan teks, dan float, yang merupakan angka desimal.

Masing-masing variabel di sini digunakan di beberapa tempat berbeda oleh program, berikut adalah sinopsis dari apa yang dilakukan masing-masing variabel

bolPlay memberi tahu program jika menu harus ditampilkan atau jika game yang sebenarnya harus dijalankan.

intScore melacak skor pemain saat mereka memukul ubin, intDiff digunakan pada menu utama untuk memberi tahu program teks apa yang akan dicetak pada LCD, intEnter digunakan untuk memberitahu program jika tombol enter (paling kiri) ditekan, intInput digunakan untuk memberi tahu program mana dari 4 tombol lainnya yang ditekan.

bolTilePressed digunakan untuk memastikan program hanya membaca saat tombol ditekan dan bukan saat ditahan.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium, dan intGameSpeedHard digunakan untuk mengontrol seberapa cepat game harus dipercepat berdasarkan tingkat kesulitan yang dipilih.

intTick dan intDelay digunakan untuk menghentikan program dari memindahkan papan setiap kali loop.

bolSerialBoard digunakan untuk memungkinkan Anda membuat program mengirim board ke monitor serial arduino sebagai rangkaian angka untuk tujuan pengujian.

Akhirnya saatnya untuk mendeklarasikan papan kita sebagai array menggunakan kode ini:

// set up game arrayint arrGame[16][4] = { {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, 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, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };

Array adalah matriks yang titiknya dapat dipanggil untuk matematika atau diubah.

Kode Anda sekarang akan terlihat seperti ini;

// sertakan perpustakaan#sertakan

//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan permainan yang lebih cepat

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Tentukan pin

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// membuat objek LCD (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight(2, 3, 4, 5, 6, 7);

// mengatur susunan permainan

int arrGame[16][4] = { {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, 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, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };

//mengatur variabel untuk permainan

boolean bolPlay; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk menceritakan kesulitan permainan ini

//set up variabel untuk input

int masuk; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //pastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kalah

//set up variabel untuk turn

int intTik; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed;

// sedikit opsi debug

boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial

Langkah 3: Fungsi Pengaturan

Loop pengaturan adalah fungsi yang dibaca oleh arduino hanya sekali ketika pertama kali dimulai.

Dalam loop pengaturan, kami hanya mengatur nilai dari beberapa variabel kami karena alih-alih menetapkan nilai saat mendeklarasikannya, kami melakukannya di sini.

Mulailah dengan memasukkan kode ini ke dalam Void Setup Anda.

bolPlay = false;intScore = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Setiap baris hanya mengatur variabel ke nilai.

bolPlay disetel ke false agar game tidak mulai dimainkan.

intScore diatur ke 0, karena secara alami skor Anda dimulai dari 0.

intTick dimulai dari 0 karena program saat ini tidak menghitung apa pun.

intDelay diatur ke 1000 karena itulah tingkat ubin mulai.

intDiff hanyalah hal pertapa sehingga program tahu apa yang harus ditulis untuk kesulitan permainan.

intGameSpeed disetel ke apa pun intGameSpeedMedium, artinya disetel pada tingkat kesulitan sedang.

Selanjutnya letakkan kode ini di Void Setup di bawah kode yang baru saja Anda masukkan.

lcdLeft.begin(16, 2);lcdRight.begin(16, 2);

Serial.begin(9600);

Ini memberitahu arduino untuk mulai berkomunikasi dengan komputer melalui monitor serial (terlihat dengan mengklik tombol di kanan atas IDE arduino).

Pengaturan Void Anda sekarang akan terlihat seperti ini!

void setup() { Serial.begin(9600); //mulai serial monitor //set up variabel bolPlay = false; intSkor = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //mulai lcd's lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }

Langkah 4: Fungsi Loop

Fungsi loop dijalankan oleh arduino setiap iterasi dari arduino.

Salin kode berikut ke dalam Void Loop Anda.

void loop() { masukan(); //periksa input pemutaran if (bolPlay == true){ if (intTick >= intDelay){ //periksa untuk melihat apakah game harus memutar atau terus menunggu Serial.println("~~~~~~~~ ~~");//print untuk menandakan papan bergerak //writeSerial(); //jika opsi diaktifkan, tulis papan menjadi tombol serialGame(); //memeriksa input pemain playBoard(); //pindahkan papan dan tambahkan ubin baru clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke bagian bawah lcdCheck(); intTik = 0; //reset intTick } else { keysGame(); //periksa input pemain clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke lcd intTick = intTick + intGameSpeed; //tambahkan ke centang } } else { clearLcd(); //bersihkan LCD sebelum menggambar judul(); //tampilkan tombol info judul dan skorMenu(); //baca input pemain clearBoard(); //pastikan seluruh papan = 0 } delay(10); //tunda arduino sebentar }

ketika bolPlay sama dengan true itu berarti permainan sedang dimainkan, dan semua kode untuk saat permainan dimainkan harus dijalankan, tetapi kami hanya ingin papan menambahkan ubin baru dan turun ketika intTick lebih besar dari intDelay kami, jika tidak, kami masih ingin mengizinkan pengguna menekan tombol untuk menekan ubin dan agar intTick meningkatkan kecepatan.

Sebagian besar kode ini menggunakan fungsi yang belum kami buat, dan kami akan membuatnya di langkah selanjutnya. Tujuan dari fungsi-fungsi tersebut adalah sebagai berikut.

Input membaca tombol mana yang telah ditekan pengguna.

tombolGame mengontrol apa yang dilakukan tombol saat berada di dalam game, dan bukan di menu

playBoard menambahkan ubin baru ke papan, lalu memindahkan semua yang ada di papan ke bawah satu ruang

clearLCD membersihkan LCD untuk memastikan tidak ada hantu yang tertinggal di belakang ubin

drawBoard melewati arrGame dan mencetaknya ke LCD

clearBoard membersihkan seluruh arrGame saat game tidak dimainkan

bottomCheck memeriksa bagian bawah arrGame untuk kondisi kegagalan

judul menampilkan judul game dan informasi skor saat berada di menu

tombol menu mengontrol apa yang dilakukan input pengguna saat berada di menu.

gameOver adalah fungsi lain, meskipun tidak dipanggil di sini karena sebaliknya disebut di bagian bawahCheck dan fungsi tombolGame.

Langkah 5: Fungsi ClearLCD

untuk membuat fungsi kita mulai dengan menambahkan ini ke kode

batal namafungsi() {

}

"functionName" bisa apa saja, asalkan belum ada.

Salin kode ini ke dalam program Anda:

void clearLcd() { for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 1; ii++){ lcdLeft.setCursor(i, ii); lcdLeft.write(" "); lcdRight.setCursor(i, ii); lcdRight.write(" "); } } }

ini berjalan melalui seluruh array dengan menggunakan 2 loop terhitung untuk melewati setiap titik pada LCD dan menulis spasi.

Tanpa disetel ulang ke nol, LCD akan mempertahankan apa pun yang ditulis sebelumnya

Langkah 6: Fungsi DrawBoard

salin kode ini ke dalam program Anda

void drawBoard() { for (int i = 1; i <= 15; i++){ //gambar kolom 1 dan 2 di sebelah kiri LCD //jika ubin = 0 tulis apa-apa, = 1 tulis "#", = 2 tulis "@" lcdLeft.setCursor(i, 1); //set ke kolom pertama (paling kiri) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //set ke kolom kedua (kiri tengah) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //set ke kolom ketiga (kanan tengah) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //set ke kolom keempat (paling kanan) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.menulis("@");} } }

ini menggunakan loop untuk melewati setiap baris papan, kemudian memeriksa untuk melihat apakah ada kolom di baris yang sama dengan 1 atau 2, berdasarkan itu ia kemudian mencetak pada LCD baik tagar, untuk ubin yang belum hit, atau @ untuk ubin hit.

Langkah 7: Fungsi PlayBoard

salin kode ini ke dalam program Anda.

void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //hapus baris atas arrGame[0][random(0, 4)] = 1; //menetapkan titik acak di baris atas menjadi ubin untuk (int i = 15; i>= 1; i--){ //bekerja dari bawah papan ke atas untuk (int ii = 0; ii <= 3; ii ++){ //untuk setiap kolom arrGame[ii] = arrGame[i - 1][ii]; } } }

kode ini dimulai dengan mengosongkan seluruh baris atas ke 0, atau tanpa ubin, dan kemudian menetapkan satu ubin acak menjadi 1, dan tidak terkena ubin.

Kemudian melewati loop yang dihitung secara terbalik, dari 15 ke 1, mengatur baris menjadi sama dengan apa pun yang sama dengan baris di atasnya, membuat papan bergerak ke bawah LCD

Langkah 8: Fungsi ClearBoard

salin kode ini ke dalam program Anda.

void clearBoard() { //setel ulang nilai centang dan tunda intTick = 0; intTunda = 1000; //menelusuri papan dan mengatur semuanya ke 0 for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }

Kode ini dijalankan saat game tidak dimainkan untuk memastikan seluruh arrGame disetel ke 0, atau tidak ada ubin, dengan menggunakan loop terhitung untuk menelusuri array.

Kode juga mengatur ulang nilai intDelay dan intTick.

Langkah 9: Fungsi Judul

salin kode berikut ke dalam program Anda

void title() { //menulis judul ke LCD dan spasi untuk skor lcdRight.setCursor(0, 0); lcdRight.write("Ubin Piano"); lcdRight.setCursor(0, 1); lcdRight.write("Nilai: "); //mengubah skor menjadi string char strScore[3]; sprintf(strScore, "%d", intScore); //menampilkan skor ke LCD lcdRight.write(strScore); //menambahkan lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write("Mudah"); } if (intDiff == 1){ lcdRight.write("Sedang"); } if (intDiff == 2){ lcdRight.write("Sulit"); } //Tekan sedikit instruksi lcdLeft.setCursor(0, 0); lcdLeft.write("Tekan Enter"); lcdLeft.setCursor(0, 1); lcdLeft.write("untuk memulai!"); }

Kode ini menulis judul permainan dan skor ke LCD, ini dilakukan dengan memberi tahu LCD di mana harus mulai mengetik menggunakan LCD.setCursor dan kemudian menulis string di LCD.write.

Variabel baru juga dibuat di sini, strScore, digunakan untuk mengubah intScore menjadi tipe data string atau char menggunakan fungsi sprintf.

intDiff juga digunakan di sini, berdasarkan nilainya, ia mencetak opsi kesulitan yang berbeda.

Langkah 10: Fungsi ButtonsMenu

masukkan kode berikut ke dalam program Anda

void buttonMenu(){ // saat enter ditekan, mulailah permainan dan reset nilai skor if (intEnter == 1){ bolPlay = true; intSkor = 0; papan permainan(); drawBoard(); } // ketika tombol 3 ditekan, aktifkan opsi debug untuk mencetak board secara serial if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = benar; } else { Serial.println("Serial Board Dinonaktifkan"); bolSerialBoard = salah; } } //set kecepatan game ke tingkat kesulitan mudah if (intInput == 0){ Serial.print("Game diatur ke mudah ("); Serial.print(intGameSpeedEasy); Serial.println("ms percepatan)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //set kecepatan game ke tingkat kesulitan sedang if (intInput == 1){ Serial.print("Game disetel ke medium ("); Serial.print(intGameSpeedMedium); Serial.println("ms acceleration)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //set kecepatan game ke tingkat kesulitan yang sulit if (intInput == 2){ Serial.print("Game disetel ke hard ("); Serial.print(intGameSpeedHard); Serial.println("ms acceleration)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }

kode ini hanya dijalankan ketika bolPlay sama dengan false di void Loop

jika intEnter disetel ke 1 berarti tombol enter telah ditekan, jika ditekan program akan menyetel bolPlay ke true dan permainan dimulai.

Program kemudian membaca apa yang sama dengan intInput. jika sama dengan 0 tombol pertama dari kiri ditekan, naik ke kanan hingga 3. Jika intInput sama dengan 4 tidak ada tombol yang ditekan.

jika tombol 0-2 ditekan permainan mengubah kesulitan, juga menyesuaikan nilai kecepatan permainan, artinya akan berakselerasi lebih cepat.

jika tombol 3 ditekan, permainan akan mengaktifkan atau menonaktifkan mode debug di mana seluruh papan dicetak di monitor serial untuk membantu menemukan masalah dalam program.

Langkah 11: Fungsi ButtonsGame

salin kode berikut ke dalam program Anda

void buttonGame(){ if (intInput != 4) { //jika tombol ditekan if (bolTilePressed == false){ //hanya jika bolTilePressed adalah tindakan pemicu salah untuk memeriksa tombol tekan bolTilePressed = true; //lalu setel bolTilePressed ke true untuk memastikan itu tidak dipicu lagi secara tidak sengaja int intLowestTile = 0; //untuk disetel ke ubin dengan ubin terendah int intCheckedTile = 15; //untuk melacak ubin mana yang telah diperiksa sementara (intLowestTile == 0) { //selama tidak disetel ke apa pun, periksa ubin untuk (int i = 0; i 100){ //selama int penundaan tidak lebih rendah dari 100 intDelay = intDelay - 20; //ambil nilai darinya } } else { Serial.println("Tekan tombol salah"); tamat(); //jika tidak, permainan berakhir } } } } }

Kode hanya dijalankan ketika bolPlay sama dengan true di void Loop.

Seperti buttonMenu berdasarkan nilai intInput, ia memeriksa untuk melihat apakah pemain telah memukul ubin atau melewatkannya.

Ini dilakukan dengan melewati arrGame dari bawah ke atas menggunakan loop sementara untuk mencari baris mana yang terendah dengan ubin yang tidak terkena. Itu kemudian memeriksa untuk melihat apakah tempat di baris yang sesuai dengan tombol yang ditekan adalah ubin yang tidak terkena atau tidak, jika tidak dipukul, set itu sama dengan 2, bukan 1, artinya akan ditampilkan sebagai @, jika tidak maka akan memicu gameOver fungsi yang belum kita buat.

Fungsi ini juga memanfaatkan variabel bolTilePressed dengan menyetelnya ke true saat tombol ditekan dan false saat tidak ada tombol yang ditekan. Ini untuk memastikan pengguna tidak kehilangan permainan secara tidak sengaja karena program mengira mereka menekan tombol beberapa kali ketika mereka menahannya.

Langkah 12: Fungsi GameOver

Salin kode berikut ke dalam program Anda

void gameOver() { Serial.println("Permainan Berakhir!"); Serial.print("Skor Anda adalah: "); Serial.println(intScore); Serial.print("Kecepatan Anda adalah: "); Serial.println(intDelay); bolPlay = salah; }

Ini dipicu oleh fungsi checkBottom atau tombolGame dan memicu akhir permainan dengan menyetel bolPlay ke false.

Itu juga mencetak pesan ke monitor serial untuk skor pengguna dan ubin kecepatan ditambahkan dalam milidetik.

Langkah 13: Fungsi Input

Salin kode berikut ke dalam program Anda.

void input() { intEnter = digitalRead(btnEnter); //read enter //baca input lainnya yang mana, atau jika tidak ada yang disetel ke 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == HIGH){intInput = 2;} else { if (digitalRead(btn4) == HIGH){intInput = 3;} else { intInput = 4; }}}} //serial print input if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //jika tidak ada tombol yang ditekan reset bolTilePressed bolTilePressed = false; } }

Kode ini digunakan dengan fungsi tombolGame dan tombolMenu. berdasarkan tombol yang telah ditekan pengguna, ia menetapkan nilai intInput, atau jika tidak ada tombol yang ditekan, ia menyetel intInput menjadi 4.

Jika tidak ada tombol yang ditekan, di sinilah bolTilePressed diatur ulang untuk fungsi tombolGame.

Itu juga mencetak pesan ke monitor serial di mana tombol ditekan.

Langkah 14: Fungsi BottomCheck

salin kode berikut ke program Anda.

void bottomCheck() { for (int i = 0; i <= 3; i++){ //untuk 4 kolom if (arrGame[15] == 1){ //jika sebuah ubin berada di bagian bawah Serial.println("Ubin di bagian bawah"); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); tamat(); } } }

menggunakan loop kode ini memeriksa baris bawah arrGame untuk setiap ubin yang tidak terkena (ubin sama dengan 1), jika ada ubin yang tidak terkena di bagian bawah layar itu akan mem-flash ubin dan kemudian memicu fungsi game over.

Langkah 15: Fungsi WriteSerial

salin kode berikut ke dalam program Anda

void writeSerial() { if (bolSerialBoard == true){ for (int i = 0; i <= 15; i ++){ for (int ii = 0; ii <= 3; ii++){ Serial.print(arrGame [aku aku aku]); Serial.print(", "); } Serial.println(""); } } }

Ini adalah fungsi yang diikuti oleh opsi debug yang dapat diaktifkan di fungsi ButtonsMenu. Jika bolSerialBoard disetel ke true dalam fungsi itu, ia akan melalui arrGame dan mencetak seluruh papan ke monitor serial untuk tujuan pengujian dengan menggunakan array.

Langkah 16: Selesai

Penyelesaian!
Penyelesaian!

Semua kode Anda tidak boleh lengkap dan terlihat seperti ini!

/* * Nama - Ubin Piano; Arduino * Oleh - Domenic Marulli * Tanggal - 11/*

/ sertakan perpustakaan

#termasuk

//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan permainan yang lebih cepat

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Tentukan pin

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// membuat objek LCD (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight(2, 3, 4, 5, 6, 7);

// mengatur susunan permainan

int arrGame[16][4] = { {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, 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, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };

//mengatur variabel untuk permainan

boolean bolPlay; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk menceritakan kesulitan permainan ini

//set up variabel untuk input

int masuk; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //pastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kalah

//set up variabel untuk turn

int intTik; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed;

// sedikit opsi debug

boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial

//setup yang akan dijalankan sekali

void setup() { Serial.begin(9600); //mulai serial monitor //set up variabel bolPlay = false; intSkor = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //mulai lcd's lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }

//loop yang akan dijalankan setiap 10 milidetik

void loop() { masukan(); //periksa input pemutaran if (bolPlay == true){ if (intTick >= intDelay){ //periksa untuk melihat apakah game harus memutar atau terus menunggu Serial.println("~~~~~~~~ ~~");//print untuk menandakan papan bergerak //writeSerial(); //jika opsi diaktifkan, tulis papan menjadi tombol serialGame(); //memeriksa input pemain playBoard(); //pindahkan papan dan tambahkan ubin baru clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke bagian bawah lcdCheck(); intTik = 0; //reset intTick } else { keysGame(); //periksa input pemain clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke lcd intTick = intTick + intGameSpeed; //tambahkan ke centang } } else { clearLcd(); //bersihkan LCD sebelum menggambar judul(); //tampilkan tombol info judul dan skorMenu(); //baca input pemain clearBoard(); //pastikan seluruh papan = 0 } delay(10); //tunda arduino sebentar }

//membersihkan lcd, jadi sel yang tidak masuk tidak akan tertinggal di sana

void clearLcd() { for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 1; ii++){ lcdLeft.setCursor(i, ii); lcdLeft.write(" "); lcdRight.setCursor(i, ii); lcdRight.write(" "); } } }

//menarik papan ke lcd

void drawBoard() { for (int i = 1; i <= 15; i++){ //gambar kolom 1 dan 2 di sebelah kiri LCD //jika ubin = 0 tulis apa-apa, = 1 tulis "#", = 2 tulis "@" lcdLeft.setCursor(i, 1); //set ke kolom pertama (paling kiri) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //set ke kolom kedua (kiri tengah) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //set ke kolom ketiga (kanan tengah) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //set ke kolom keempat (paling kanan) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.menulis("@");} } }

//memindahkan papan ke bawah dan menempatkan nilai acak menjadi ubin

void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //hapus baris atas arrGame[0][random(0, 4)] = 1; //menetapkan titik acak di baris atas menjadi ubin untuk (int i = 15; i>= 1; i--){ //bekerja dari bawah papan ke atas untuk (int ii = 0; ii <= 3; ii ++){ //untuk setiap kolom arrGame[ii] = arrGame[i - 1][ii]; } } }

//set seluruh board ke 0 dan reset variabel ke pregame

void clearBoard() { //setel ulang nilai centang dan tunda intTick = 0; intTunda = 1000; //menelusuri papan dan mengatur semuanya ke 0 for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }

// menampilkan Menu Utama pada LCD

void title() { //menulis judul ke LCD dan spasi untuk skor lcdRight.setCursor(0, 0); lcdRight.write("Ubin Piano"); lcdRight.setCursor(0, 1); lcdRight.write("Nilai: "); //mengubah skor menjadi string char strScore[3]; sprintf(strScore, "%d", intScore); //menampilkan skor ke LCD lcdRight.write(strScore); //menambahkan lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write("Mudah"); } if (intDiff == 1){ lcdRight.write("Sedang"); } if (intDiff == 2){ lcdRight.write("Sulit"); } //Tekan sedikit instruksi lcdLeft.setCursor(0, 0); lcdLeft.write("Tekan Enter"); lcdLeft.setCursor(0, 1); lcdLeft.write("untuk memulai!"); }

// memeriksa tombol dan apa yang harus dilakukan saat keluar dari permainan

void buttonMenu(){ // saat enter ditekan, mulailah permainan dan reset nilai skor if (intEnter == 1){ bolPlay = true; intSkor = 0; papan permainan(); drawBoard(); } // ketika tombol 3 ditekan, aktifkan opsi debug untuk mencetak board secara serial if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = benar; } else { Serial.println("Serial Board Dinonaktifkan"); bolSerialBoard = salah; } } //set kecepatan game ke tingkat kesulitan mudah if (intInput == 0){ Serial.print("Game diatur ke mudah ("); Serial.print(intGameSpeedEasy); Serial.println("ms percepatan)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //set kecepatan game ke tingkat kesulitan sedang if (intInput == 1){ Serial.print("Game disetel ke medium ("); Serial.print(intGameSpeedMedium); Serial.println("ms acceleration)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //set kecepatan game ke tingkat kesulitan yang sulit if (intInput == 2){ Serial.print("Game disetel ke hard ("); Serial.print(intGameSpeedHard); Serial.println("ms acceleration)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }

// memeriksa tombol dan apa yang harus dilakukan untuk itu saat dalam game

void buttonGame(){ if (intInput != 4) { //jika tombol ditekan if (bolTilePressed == false){ //hanya jika bolTilePressed adalah tindakan pemicu salah untuk memeriksa tombol tekan bolTilePressed = true; //lalu setel bolTilePressed ke true untuk memastikan itu tidak dipicu lagi secara tidak sengaja int intLowestTile = 0; //untuk disetel ke ubin dengan ubin terendah int intCheckedTile = 15; //untuk melacak ubin mana yang telah diperiksa sementara (intLowestTile == 0) { //selama tidak disetel ke apa pun, periksa ubin untuk (int i = 0; i 100){ //selama int penundaan tidak lebih rendah dari 100 intDelay = intDelay - 20; //ambil nilai darinya } } else { Serial.println("Tekan tombol salah"); tamat(); //jika tidak, permainan berakhir } } } } }

batalkan gameOver() {

Serial.println("Permainan Selesai!"); Serial.print("Skor Anda adalah: "); Serial.println(intScore); Serial.print("Kecepatan Anda adalah: "); Serial.println(intDelay); bolPlay = salah; }

// memeriksa input pemain

void input() { intEnter = digitalRead(btnEnter); //read enter //baca input lainnya yang mana, atau jika tidak ada yang disetel ke 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == HIGH){intInput = 2;} else { if (digitalRead(btn4) == HIGH){intInput = 3;} else { intInput = 4; }}}} //serial print input if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //jika tidak ada tombol yang ditekan reset bolTilePressed bolTilePressed = false; } }

//memeriksa bagian bawah papan untuk kegagalan

void bottomCheck() { for (int i = 0; i <= 3; i++){ //untuk 4 kolom if (arrGame[15] == 1){ //jika sebuah ubin berada di bagian bawah Serial.println("Ubin di bagian bawah"); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); tamat(); } } }

//mencetak board ke serial monitor jika bolSerialBoard benar

void writeSerial() { if (bolSerialBoard == true){ for (int i = 0; i <= 15; i ++){ for (int ii = 0; ii <= 3; ii++){ Serial.print(arrGame [aku aku aku]); Serial.print(", "); } Serial.println(""); } } }

Setelah semua kode dimasukkan, unggah ke arduino Anda dan nikmatilah!

Direkomendasikan: