İçindekiler:

Arduino - Piyano Fayansları: 16 Adım (Resimli)
Arduino - Piyano Fayansları: 16 Adım (Resimli)
Anonim
Arduino - Piyano Fayansları
Arduino - Piyano Fayansları

Merhaba internet insanları, Bu, bir arduino uno r3'te bir mobil oyundan KESİNLİKLE olmayan bir şeyin nasıl yapılacağı hakkında olacak.

yani başlamak için, aşağıdaki gibi tüm parçalara ihtiyacınız olacak! 1x Arduino Uno r3 (42 $)

2x LCD Tuş Takımı Kalkanı (her biri 19 $)

5x düğmeler

5x 220Ω dirençler

28x kablo

Pekala, tüm parçalara sahip olduğunuzda, başlama zamanı!

Adım 1: Kablolama

kablolama
kablolama
kablolama
kablolama
kablolama
kablolama

Arduino'nuzu ve arkadaşlarınızı şemada gösterildiği gibi bağlayarak başlayın, Düğme raylarının zemin tarafındaki A0-4 yuvaları ile düğmelerin doğru şekilde bağlandığından emin olun, aksi takdirde arduino düğmelerin yalnızca bir basış yerine sürekli olarak basılı tutulduğunu düşünecektir.

Adım 2: Beyan Beyanları

Buradaki tüm kodlar, void kurulumunuzdan ve void loop'unuzdan önce gelmelidir, bunun nedeni, tüm bu değişkenlerin ve nesnelerin, kuracağımız birçok fonksiyonda kullanılmasıdır.

koyarak başlayın:

#Dahil etmek

kodunuzun en üstünde, arduino'ya "LiquidCrystal.h" kitaplığını ve bunun bir parçası olan işlevleri kullanmasını söylüyor.

Bir sonraki adım, bu kodu #include'ımızın altına koyarak butonlarımız için kullandığımız pinleri tanımlamaktır:

#define btnA0#define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Kodu okumamızı veya gerekirse değiştirmemizi kolaylaştırmak için btnEnter ve btn1 ila btn 4 terimlerini tanımlarız. Bu, btn1 yazdığımızda arduino aslında buton 15'i kastettiğimizi bilecek demektir. Portları 15, 16, 17 ve 18 olarak çağırsak da, arduino üzerinde A1 A2 A3 ve A4 olarak etiketlenirler, bunun nedeni şudur. biz bunları sadece dijital girişler için kullanmamıza rağmen, bunlar özellikle analog girişler için kullanılan portlardır.

Daha sonra Likit Kristal Ekranları kontrol edecek nesneleri oluşturacağız. Bunu yapmak için bu kodu tanımlarımızın altına koyun

LiquidCrystal lcdSol(8, 9, 12, 10, 11, 13);LiquidCrystal lcdSağ(2, 3, 4, 5, 6, 7);

Bunun yaptığı şey, arduino'ya lcdLeft veya lcdRight dediğimizde bir LiquidCrystal nesnesine atıfta bulunduğumuzu söylemektir. Ekli parantez içindeki sayılar, arduino'ya, işlevlerini kullandığımızda LCD'ye mesaj göndermek için nesnenin hangi bağlantı noktalarını kullanması gerektiğini söyler.

Şimdi, bir sonraki kod bitini nesne bildirimlerinin altına koyarak değişkenleri bildirmemiz gerekiyor:

//bu değişkenler değiştirebileceğiniz seçeneklerdir - daha yüksek sayılar = daha hızlı oyun hızı upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

//gameboolean bolPlay için değişkenleri ayarla; // oynatıcının olup olmadığını izler int intScore; //oyuncunun skorunu izler int intDiff; //oyunun hangi zorlukta olduğunu söylemek için estetik bir şey //giriş için değişkenleri ayarla int intEnter; //kullanıcı enter düğmesine basarsa izler int intInput; //kullanıcının hangi düğmelere bastığını izler boolean bolTilePressed; //oynatıcının yanlışlıkla bir düğmeye 5x basıp kaybetmediğinden emin olun //dönüş için değişkenleri ayarla intTick; //miller (döngü başına) kadar sayar intDelay int intDelay; //programın bir sonraki dönüşe kadar beklediği süre millis int intGameSpeed; //hata ayıklama seçeneklerinin biti boolean bolSerialBoard; // true olduğunda kartı seri monitörde yazdıracak

Veri türünü ve ardından değişkenin adını belirterek bir değişken bildiririz, ör. int thisIsAnInteger

bolSerialBoard ve bolPlay gibi Boolean değişkenleri, true veya false olmak üzere yalnızca iki değerden birine sahip olabilir.

intScore ve intInput gibi tamsayı değişkeni (int), 1, 5 veya 100 gibi tam sayıları değerler olarak alabilir.

Burada kullanmadığımız diğer bazı önemli veri türleri, bir metin yığını olan bir dize ve bir ondalık sayı olan bir kayan noktadır.

Buradaki değişkenlerin her biri program tarafından birkaç farklı yerde kullanılıyor, işte her birinin ne yaptığının bir özeti

bolPlay, programa menünün görüntülenip görüntülenmeyeceğini veya asıl oyunun çalışıp çalışmayacağını söyler.

intScore, oyuncunun karoları vurdukça puanını takip eder, ana menüde intDiff, programa LCD'lere hangi metin bitinin yazdırılacağını söylemek için kullanılır, intEnter, programa enter düğmesine (en solda) basılıp basılmadığını söylemek için kullanılır, intInput, programa diğer 4 düğmeden hangisine basıldığını söylemek için kullanılır.

bolTilePressed, programın, basılı tutulduğunda değil, yalnızca düğmeye basıldığında okumasını sağlamak için kullanılır.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium ve intGameSpeedHard, seçilen zorluğa göre oyunun ne kadar hızlı hızlanması gerektiğini kontrol etmek için kullanılır.

intTick ve intDelay, programın her döngüde kartı hareket ettirmesini durdurmak için kullanılır.

bolSerialBoard, programın kartı arduino'nun seri monitörüne test amacıyla bir dizi sayı olarak göndermesini sağlamak için kullanılır.

Son olarak, bu kodu kullanarak tahtamızı bir dizi olarak ilan etmenin zamanı geldi:

// oyun dizisini ayarla 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} };

Dizi, herhangi bir noktanın matematik için çağrılabileceği veya değiştirilebileceği bir matristir.

Kodunuz şimdi şöyle görünmelidir;

// kitaplıkları dahil et#include

//bu değişkenler değiştirebileceğiniz seçeneklerdir - daha yüksek sayılar = daha hızlı oyun hızlandırma

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

// Pinleri tanımla

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

// LCD nesneleri oluştur (n, ~, n, ~, ~, n)

LiquidCrystal lcdSol(8, 9, 12, 10, 11, 13); LiquidCrystal lcdSağ(2, 3, 4, 5, 6, 7);

// oyun dizisini ayarla

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} };

// oyun için değişkenleri ayarla

boole bolPlay; // oynatıcının olup olmadığını izler int intScore; //oyuncunun skorunu izler int intDiff; // oyunun hangi zorlukta olduğunu söylemek için estetik bir şey

// giriş için değişkenleri ayarla

int intEnter; //kullanıcı enter düğmesine basarsa izler int intInput; //kullanıcının hangi düğmelere bastığını izler boolean bolTilePressed; //oyuncunun yanlışlıkla bir düğmeye 5x basıp kaybetmediğinden emin olun

// dönüş için değişkenleri ayarla

int intTick; //milyonlarca (döngü başına) kadar sayar intDelay int intDelay; //programın bir sonraki dönüşe kadar beklediği süre millis int intGameSpeed;

// abit hata ayıklama seçenekleri

boolean bolSerialBoard; // true olduğunda kartı seri monitörde yazdıracak

Adım 3: Kurulum İşlevi

Kurulum döngüsü, başlangıçta başladığında arduino tarafından yalnızca bir kez okunan bir işlevdir.

Kurulum döngüsünde sadece birkaç değişkenimizin değerlerini ayarlıyoruz çünkü onları bildirirken bir değer ayarlamak yerine burada yapıyoruz.

Bu kodu Void Kurulumunuza koyarak başlayın.

bolPlay = false;intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Her satır sadece bir değere bir değişken ayarlıyor.

bolPlay false olarak ayarlanır, böylece oyun oynamaya başlamaz.

intScore 0'a ayarlanmıştır, çünkü doğal olarak puanınız 0'dan başlar.

intTick, program şu anda hiçbir şey saymadığı için 0'da başlar.

intDelay, döşemelerin başladığı oran olduğundan 1000'e ayarlanmıştır.

intDiff sadece münzevi bir şeydir, böylece program oyunun zorluğu için ne yazacağını bilir.

intGameSpeed, intGameSpeedMedium ne olursa olsun, yani orta zorluğa ayarlanmıştır.

Daha sonra bu kodu, az önce girdiğiniz kodun altındaki Void Setup'a koyun.

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

Seri.başla(9600);

Bu, arduino'ya seri monitör aracılığıyla bilgisayarla iletişim kurmaya başlamasını söyler (arduino IDE'nin sağ üst köşesindeki düğmeye tıklayarak görülebilir).

Void Kurulumunuz şimdi şöyle görünmelidir!

geçersiz kurulum() { Serial.begin(9600); //seri monitörü başlat //değişkenleri ayarla bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd'nin lcdLeft'ini başlat.begin(16, 2); lcdRight.begin(16, 2); }

Adım 4: Döngü İşlevi

Döngü işlevi, arduino tarafından arduino'nun her yinelemesinde çalıştırılır.

Aşağıdaki kodu Void Loop'unuza kopyalayın.

boşluk döngüsü() { girdi(); //oyun girişini kontrol edin if (bolPlay == true){ if (intTick >= intDelay){ //oyunun bir tur oynamasını mı yoksa beklemeye devam etmesini mi kontrol edin Serial.println("~~~~~~~ ~~");//kartın hareket ettiğini belirtmek için print //writeSerial(); //seçenek etkinse kartı seri butonlara yazGame(); //oyuncu girdilerini kontrol et playBoard(); //tahtayı hareket ettirin ve yeni bir döşeme ekleyin clearLcd(); //drawBoard() çizmeden önce LCD'leri temizleyin; //kartı lcd'nin altCheck()'ine çizin; intTick = 0; //reset intTick } else { buttonGame(); //oyuncu girdilerini kontrol et clearLcd(); //drawBoard() çizmeden önce LCD'leri temizleyin; //tahtayı lcd'nin üzerine çizin intTick = intTick + intGameSpeed; //işarete ekle } } else { clearLcd(); //başlık çizmeden önce LCD'leri temizleyin(); //başlık ve puan bilgilerini göster butonlarıMenu(); // oyuncu girişini oku clearBoard(); //tüm panonun = 0 } gecikme(10); //arduino'yu kısa bir süre geciktir }

bolPlay true değerine eşit olduğunda bu, oyunun oynandığı anlamına gelir ve oyun oynarken tüm kodun çalıştırılması gerekir, ancak biz sadece tahtanın yeni bir kutucuk eklemesini ve intTick intDelay değerimizden büyük olduğunda aşağı hareket etmesini istiyoruz, aksi halde yine de kullanıcının bir karoya basması için bir düğmeye basmasına ve intTick'in hızı artırmasına izin vermek istiyoruz.

Bu kodun çoğu, henüz yapmadığımız işlevleri kullanır ve bunları sonraki adımlarda yapacağız. Bu işlevlerin amacı aşağıdaki gibidir.

Giriş, kullanıcının hangi düğmelere bastığını okur.

düğmelerOyun, düğmelerin menüde değil, oyundayken ne yaptığını kontrol eder

playBoard, tahtaya yeni bir döşeme ekler ve ardından tahtadaki her şeyi bir boşluk aşağı taşır

clearLCD, döşemelerin arkasında hayalet kalmadığından emin olmak için LCD'leri temizler

drawBoard, arrGame'den geçer ve LCD'lere yazdırır

clearBoard, oyun oynanmadığında arrGame'in tamamını temizler

bottomCheck, arrGame'in alt kısmında bir arıza durumu olup olmadığını kontrol eder

başlık, menüdeyken oyunun başlığını ve puan bilgilerini görüntüler

düğmeler menüsü, menüdeyken kullanıcının girdilerinin ne yapacağını kontrol eder.

gameOver başka bir işlevdir, ancak burada çağrılmadığı için bunun yerine altKontrol ve düğmelerOyun işlevleri içinde çağrılır.

Adım 5: ClearLCD İşlevi

bir fonksiyon yaratmak için bunu koda ekleyerek başlıyoruz

geçersiz işlevAdı() {

}

"functionName", zaten mevcut olmadığı sürece herhangi bir şey olabilir.

Bu kodu programınıza kopyalayın:

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(" "); } } }

bu, LCD'lerdeki her noktadan geçmek ve bir boşluk yazmak için 2 sayılmış döngü kullanarak tüm dizi boyunca çalışır.

Hiçbir şeye sıfırlanmadan LCD'ler daha önce yazılanları koruyacaktır

Adım 6: DrawBoard İşlevi

bu kodu programınıza kopyalayın

void drawBoard() { for (int i = 1; i <= 15; i++){ //sol LCD'de sütun 1 ve 2'yi çiz // karo = 0 ise hiçbir şey yazma, = 1 "#" yaz, = 2 "@" yazın lcdLeft.setCursor(i, 1); //ilk sütuna ayarla (en soldaki) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //ikinci sütuna ayarla (orta sol) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //üçüncü sütuna ayarla (orta sağ) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //dördüncü sütuna ayarla (en sağda) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.yazı yazmak("@");} } }

bu, panonun her satırından geçmek için bir döngü kullanır, daha sonra satırdaki herhangi bir sütunun 1 veya 2'ye eşit olup olmadığını kontrol eder, buna bağlı olarak LCD'ye bir hashtag yazdırır, henüz bir döşeme için isabet veya isabet döşemesi için bir @.

7. Adım: PlayBoard İşlevi

bu kodu programınıza kopyalayın.

void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //üst satırı temizle arrGame[0][rastgele(0, 4)] = 1; //(int i = 15; i>= 1; i--){ //(int ii = 0; ii <= 3; ii ++){ //her sütun için arrGame[ii] = arrGame[i - 1][ii]; } } }

bu kod, en üst satırın tamamını 0'a temizleyerek veya döşeme yok olarak başlar ve ardından rastgele bir döşemeyi 1 ve isabetsiz döşeme olarak ayarlar.

Daha sonra, 15'ten 1'e kadar geriye doğru sayılan bir döngüden geçer, satırı, üstündeki satır ne olursa olsun eşit olacak şekilde ayarlayarak, kartın LCD'lerde aşağı doğru hareket etmesini sağlar.

Adım 8: ClearBoard İşlevi

bu kodu programınıza kopyalayın.

void clearBoard() { //tık ve gecikme değerlerini sıfırla intTick = 0; intDelay = 1000; //tahtayı gözden geçirin ve her şeyi 0'a ayarlayın for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }

Bu kod, oyun oynamadığında, diziden geçmek için sayılan döngüler kullanılarak arrGame'in tamamının 0'a ayarlandığından veya karo yok olduğundan emin olmak için çalıştırılır.

Kod ayrıca intDelay ve intTick değerlerini de sıfırlar.

9. Adım: Başlık İşlevi

aşağıdaki kodu programınıza kopyalayın

void title() { //LCD'ye başlık yaz ve skor için boşluk lcdRight.setCursor(0, 0); lcdRight.write("Piyano Fayansları"); lcdRight.setCursor(0, 1); lcdRight.write("Puan: "); // puanı bir dizgeye çevir char strScore[3]; sprintf(strScore, "%d", intScore); // skoru LCD'de göster lcdRight.write(strScore); //zorlukla lcdRight.setCursor(10, 1) ekleyin; if (intDiff == 0){ lcdRight.write("Kolay"); } if (intDiff == 1){ lcdRight.write("Orta"); } if (intDiff == 2){ lcdRight.write("Zor"); } //Biraz komuta basın lcdLeft.setCursor(0, 0); lcdLeft.write("Enter tuşuna basın"); lcdLeft.setCursor(0, 1); lcdLeft.write("başlamak için!"); }

Bu kod oyunun adını ve skoru LCD'lere yazar, bunu LCD'ye LCD.setCursor kullanarak yazmaya nereden başlayacağını söyleyerek ve ardından dizeyi LCD.write'a yazarak yapar.

Burada ayrıca yeni bir değişken oluşturulur, strScore, sprintf işlevini kullanarak intScore'u bir dize veya karakter veri türüne dönüştürmek için kullanılır.

intDiff burada da kullanılır, değerlerine göre farklı zorluk seçeneklerini yazdırır.

Adım 10: ButtonsMenu İşlevi

aşağıdaki kodu programınıza ekleyin

void buttonMenu(){ // enter'a basıldığında oyunu başlat ve skor değerini sıfırla if (intEnter == 1){ bolPlay = true; intScore = 0; oyun tahtası(); drawBoard(); } // 3 butonuna basıldığında kartı seri olarak yazdırmak için hata ayıklama seçeneğini açın if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = doğru; } else { Serial.println("Seri Kart Devre Dışı"); bolSerialBoard = yanlış; } } //oyun hızını kolay zorluğa ayarlayın if (intInput == 0){ Serial.print("Oyun ayarı kolay ("); Serial.print(intGameSpeedEasy); Serial.println("ms hızlandırma)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //oyun hızını orta zorluğa ayarlayın if (intInput == 1){ Serial.print("Oyun orta ("); Serial.print(intGameSpeedMedium); Serial.println("ms hızlanma)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //oyun hızını zor bir zorluğa ayarlayın if (intInput == 2){ Serial.print("Oyun zor ("); Serial.print(intGameSpeedHard); Serial.println("ms hızlanma)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }

bu kod yalnızca, boşluk Döngüsü'nde bolPlay false değerine eşit olduğunda çalıştırılır.

intEnter 1 olarak ayarlanmışsa bu, giriş düğmesine basıldığı anlamına gelir, basılıyorsa program bolPlay'i true olarak ayarlar ve oyun başlar.

Program daha sonra intInput'un neye eşit olduğunu okur. 0'a eşitse soldan ilk düğmeye basılır, sağa doğru 3'e kadar gidilir. intInput 4'e eşitse hiçbir düğmeye basılmaz.

0-2 düğmelerine basılırsa oyun zorluğu değiştirir, ayrıca oyun hızı değerini ayarlar, yani daha hızlı hızlanır.

3 düğmesine basılırsa oyun, programdaki sorunları bulmaya yardımcı olmak için tüm panonun seri monitörde yazdırıldığı bir hata ayıklama modunu etkinleştirir veya devre dışı bırakır.

Adım 11: ButtonsGame İşlevi

aşağıdaki kodu programınıza kopyalayın

void buttonGame(){ if (intInput != 4) { //bir butona basılırsa if (bolTilePressed == false){ //yalnızca bolTilePressed yanlış ise bir butonu kontrol etmek için tetikleme eylemi bolTilePressed = true; //daha sonra tekrar asitli bir şekilde tetiklenmediğinden emin olmak için bolTilePressed değerini true olarak ayarlayın int intLowestTile = 0; //en düşük döşemeye sahip döşemeye ayarlanacak int intCheckedTile = 15; //hangi karoların kontrol edildiğini takip etmek için while (intLowestTile == 0) { //herhangi bir şeye ayarlanmadığı sürece karoları kontrol edin (int i = 0; i 100){ //int olduğu sürece gecikme 100'den düşük değil intDelay = intDelay - 20; // ondan bir değer al } } else { Serial.println("Yanlış tuşa basıldı"); oyun bitti(); //aksi takdirde oyun biter } } } } }

Kod yalnızca void Loop'ta bolPlay true değerine eşit olduğunda çalıştırılır.

DüğmelerMenu gibi, intInput değerine dayalı olarak, oyuncunun bir karoya vurup vurmadığını veya bir karoyu kaçırıp vurmadığını kontrol eder.

Bunu, arrGame'i aşağıdan yukarıya doğru bir while döngüsü kullanarak, hangi satırın isabetsiz bir döşemeyle en düşük olduğunu aramak için yapar. Ardından, basılan düğmeye karşılık gelen o satırdaki noktanın isabetsiz bir döşeme olup olmadığını kontrol eder, isabet edilmezse 1 yerine 2'ye ayarlar, yani @ olarak görüntülenir, aksi takdirde gameOver'ı tetikler henüz yaratmadığımız fonksiyon.

Bu işlev ayrıca, bir düğmeye basıldığında doğru ve hiçbir düğmeye basılmadığında yanlış olarak ayarlayarak bolTilePressed değişkenini kullanır. Bu, kullanıcının oyunu yanlışlıkla kaybetmemesini sağlamak içindir çünkü program, düğmeyi basılı tuttuklarında birden çok kez bastıklarını düşündü.

Adım 12: GameOver İşlevi

Aşağıdaki kodu programınıza kopyalayın

void gameOver() { Serial.println("Oyun Bitti!"); Serial.print("Skorunuz: "); Serial.println(intScore); Serial.print("Hızınız: "); Serial.println(intDelay); bolPlay = yanlış; }

Bu, checkBottom veya buttonGame işlevleri tarafından tetiklenir ve bolPlay'i false olarak ayarlayarak oyunun sonunu tetikler.

Ayrıca, seri monitöre kullanıcı puanı için bir mesaj yazdırır ve hız karoları milisaniye cinsinden eklenir.

Adım 13: Giriş İşlevi

Aşağıdaki kodu programınıza kopyalayın.

void input() { intEnter = digitalRead(btnEnter); //oku girin //diğer girişlerden hangisini okuyun veya hiçbiri 4'e ayarlanmadıysa if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == YÜKSEK){intInput = 2;} else { if (digitalRead(btn4) == YÜKSEK){intInput = 3;} else { intInput = 4; }}}} //girişleri seri olarak yazdır if (intEnter == 1){Serial.println("Enter Basılı! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //eğer hiçbir butona basılmazsa reset bolTilePressed bolTilePressed = false; } }

Bu kod, düğmelerOyun ve düğmelerMenü işlevleriyle birlikte kullanılır. kullanıcının bastığı düğmelere bağlı olarak intInput değerini ayarlar veya hiçbir düğmeye basılmazsa intInput'u 4'e ayarlar.

Herhangi bir düğmeye basılmazsa, bolTilePressed, butonlarOyun işlevi için sıfırlanır.

Ayrıca hangi düğmeye basıldığı seri monitöre bir mesaj yazdırır.

Adım 14: BottomCheck İşlevi

aşağıdaki kodu programınıza kopyalayın.

void bottomCheck() { for (int i = 0; i <= 3; i++){ //4 sütun için if (arrGame[15] == 1){ //bir karo altta ise Serial.println("Alttaki Döşe"); arrGame[15] = 2; drawBoard(); gecikme(400); arrGame[15] = 1; drawBoard(); gecikme(400); arrGame[15] = 2; drawBoard(); gecikme(400); arrGame[15] = 1; drawBoard(); gecikme(400); oyun bitti(); } } }

Bir döngü kullanarak bu kod, arrGame'in alt satırında herhangi bir isabetsiz döşeme (1'e eşit döşeme) olup olmadığını kontrol eder, ekranın alt kısmında isabetsiz bir döşeme varsa döşemeyi yanıp söner ve ardından oyunu başlatma işlevini tetikler.

Adım 15: WriteSerial İşlevi

aşağıdaki kodu programınıza kopyalayın

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

Bu, buttonMenu işlevinde etkinleştirilebilen hata ayıklama seçeneğinin izlediği işlevdir. Bu işlevde bolSerialBoard true olarak ayarlanırsa, arrGame'den geçer ve bir dizi kullanarak test amacıyla tüm kartı seri monitöre yazdırır.

Adım 16: Tamamlama

Tamamlama!
Tamamlama!

Tüm kodunuz tamamlanmamalı ve şöyle görünmeli!

/* * İsim - Piyano Fayansları; Arduino * Tarafından - Domenic Marulli * Tarih - 11/*

/ kitaplıkları dahil et

#Dahil etmek

//bu değişkenler değiştirebileceğiniz seçeneklerdir - daha yüksek sayılar = daha hızlı oyun hızlandırma

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

// Pinleri tanımla

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

// LCD nesneleri oluştur (n, ~, n, ~, ~, n)

LiquidCrystal lcdSol(8, 9, 12, 10, 11, 13); LiquidCrystal lcdSağ(2, 3, 4, 5, 6, 7);

// oyun dizisini ayarla

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} };

// oyun için değişkenleri ayarla

boole bolPlay; // oynatıcının olup olmadığını izler int intScore; //oyuncunun skorunu izler int intDiff; // oyunun hangi zorlukta olduğunu söylemek için estetik bir şey

// giriş için değişkenleri ayarla

int intEnter; //kullanıcı enter düğmesine basarsa izler int intInput; //kullanıcının hangi düğmelere bastığını izler boolean bolTilePressed; //oyuncunun yanlışlıkla bir düğmeye 5x basıp kaybetmediğinden emin olun

// dönüş için değişkenleri ayarla

int intTick; //milyonlarca (döngü başına) kadar sayar intDelay int intDelay; //programın bir sonraki dönüşe kadar beklediği süre millis int intGameSpeed;

// abit hata ayıklama seçenekleri

boolean bolSerialBoard; // true olduğunda kartı seri monitörde yazdıracak

// bir kez çalıştırılacak kurulum

geçersiz kurulum() { Serial.begin(9600); //seri monitörü başlat //değişkenleri ayarla bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd'nin lcdLeft'ini başlat.begin(16, 2); lcdRight.begin(16, 2); }

// her 10 milisaniyede bir çalıştırılacak döngü

boşluk döngüsü() { girdi(); //oyun girişini kontrol edin if (bolPlay == true){ if (intTick >= intDelay){ //oyunun bir tur oynamasını mı yoksa beklemeye devam etmesini mi kontrol edin Serial.println("~~~~~~~ ~~");//kartın hareket ettiğini belirtmek için print //writeSerial(); //seçenek etkinse kartı seri butonlara yazGame(); //oyuncu girdilerini kontrol et playBoard(); //tahtayı hareket ettirin ve yeni bir döşeme ekleyin clearLcd(); //drawBoard() çizmeden önce LCD'leri temizleyin; //kartı lcd'nin altCheck()'ine çizin; intTick = 0; //reset intTick } else { buttonGame(); //oyuncu girdilerini kontrol et clearLcd(); //drawBoard() çizmeden önce LCD'leri temizleyin; //tahtayı lcd'nin üzerine çizin intTick = intTick + intGameSpeed; //işarete ekle } } else { clearLcd(); //başlık çizmeden önce LCD'leri temizleyin(); //başlık ve puan bilgilerini göster butonlarıMenu(); // oyuncu girişini oku clearBoard(); //tüm panonun = 0 } gecikme(10); //arduino'yu kısa bir süre geciktir }

// lcd'yi temizler, böylece girilmemiş hücreler orada kalmaz

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(" "); } } }

//kartı lcd'ye çeker

void drawBoard() { for (int i = 1; i <= 15; i++){ //sol LCD'de sütun 1 ve 2'yi çiz // karo = 0 ise hiçbir şey yazma, = 1 "#" yaz, = 2 "@" yazın lcdLeft.setCursor(i, 1); //ilk sütuna ayarla (en soldaki) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //ikinci sütuna ayarla (orta sol) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //üçüncü sütuna ayarla (orta sağ) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //dördüncü sütuna ayarla (en sağda) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.yazı yazmak("@");} } }

//tahtayı aşağı hareket ettirir ve karo olarak rastgele bir değer yerleştirir

void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //üst satırı temizle arrGame[0][rastgele(0, 4)] = 1; //(int i = 15; i>= 1; i--){ //(int ii = 0; ii <= 3; ii ++){ //her sütun için arrGame[ii] = arrGame[i - 1][ii]; } } }

// tüm tahtayı 0'a ayarlar ve değişkenleri oyun öncesine sıfırlar

void clearBoard() { //tık ve gecikme değerlerini sıfırla intTick = 0; intDelay = 1000; //tahtayı gözden geçirin ve her şeyi 0'a ayarlayın for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }

// LCD'lerde Ana Menüyü görüntüler

void title() { //LCD'ye başlık yaz ve skor için boşluk lcdRight.setCursor(0, 0); lcdRight.write("Piyano Fayansları"); lcdRight.setCursor(0, 1); lcdRight.write("Puan: "); // puanı bir dizgeye çevir char strScore[3]; sprintf(strScore, "%d", intScore); // skoru LCD'de göster lcdRight.write(strScore); //zorlukla lcdRight.setCursor(10, 1) ekleyin; if (intDiff == 0){ lcdRight.write("Kolay"); } if (intDiff == 1){ lcdRight.write("Orta"); } if (intDiff == 2){ lcdRight.write("Zor"); } //Biraz komuta basın lcdLeft.setCursor(0, 0); lcdLeft.write("Enter tuşuna basın"); lcdLeft.setCursor(0, 1); lcdLeft.write("başlamak için!"); }

// butonları ve oyun dışındayken ne yapacaklarını kontrol eder

void buttonMenu(){ // enter'a basıldığında oyunu başlat ve skor değerini sıfırla if (intEnter == 1){ bolPlay = true; intScore = 0; oyun tahtası(); drawBoard(); } // 3 butonuna basıldığında kartı seri olarak yazdırmak için hata ayıklama seçeneğini açın if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = doğru; } else { Serial.println("Seri Kart Devre Dışı"); bolSerialBoard = yanlış; } } //oyun hızını kolay zorluğa ayarlayın if (intInput == 0){ Serial.print("Oyun ayarı kolay ("); Serial.print(intGameSpeedEasy); Serial.println("ms hızlandırma)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //oyun hızını orta zorluğa ayarlayın if (intInput == 1){ Serial.print("Oyun orta ("); Serial.print(intGameSpeedMedium); Serial.println("ms hızlanma)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //oyun hızını zor bir zorluğa ayarlayın if (intInput == 2){ Serial.print("Oyun zor ("); Serial.print(intGameSpeedHard); Serial.println("ms hızlanma)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }

// butonları ve oyundayken onlar için ne yapılacağını kontrol eder

void buttonGame(){ if (intInput != 4) { //bir butona basılırsa if (bolTilePressed == false){ //yalnızca bolTilePressed yanlış ise bir butonu kontrol etmek için tetikleme eylemi bolTilePressed = true; //daha sonra tekrar asitli bir şekilde tetiklenmediğinden emin olmak için bolTilePressed değerini true olarak ayarlayın int intLowestTile = 0; //en düşük döşemeye sahip döşemeye ayarlanacak int intCheckedTile = 15; //hangi karoların kontrol edildiğini takip etmek için while (intLowestTile == 0) { //herhangi bir şeye ayarlanmadığı sürece karoları kontrol edin (int i = 0; i 100){ //int olduğu sürece gecikme 100'den düşük değil intDelay = intDelay - 20; // ondan bir değer al } } else { Serial.println("Yanlış tuşa basıldı"); oyun bitti(); //aksi takdirde oyun biter } } } } }

geçersiz gameOver() {

Serial.println("Oyun Bitti!"); Serial.print("Skorunuz: "); Serial.println(intScore); Serial.print("Hızınız: "); Serial.println(intDelay); bolPlay = yanlış; }

// oyuncu girdisini kontrol eder

void input() { intEnter = digitalRead(btnEnter); //oku girin //diğer girişlerden hangisini okuyun veya hiçbiri 4'e ayarlanmadıysa if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == YÜKSEK){intInput = 2;} else { if (digitalRead(btn4) == YÜKSEK){intInput = 3;} else { intInput = 4; }}}} //girişleri seri olarak yazdır if (intEnter == 1){Serial.println("Enter Basılı! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //eğer hiçbir butona basılmazsa reset bolTilePressed bolTilePressed = false; } }

//tahtanın alt kısmında hata olup olmadığını kontrol eder

void bottomCheck() { for (int i = 0; i <= 3; i++){ //4 sütun için if (arrGame[15] == 1){ //bir karo altta ise Serial.println("Alttaki Döşe"); arrGame[15] = 2; drawBoard(); gecikme(400); arrGame[15] = 1; drawBoard(); gecikme(400); arrGame[15] = 2; drawBoard(); gecikme(400); arrGame[15] = 1; drawBoard(); gecikme(400); oyun bitti(); } } }

// bolSerialBoard doğruysa kartı seri monitöre yazdırır

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

Tüm kodlar girildikten sonra arduino'nuza yükleyin ve keyfini çıkarın!

Önerilen: