Mündəricat:

Arduino - Piano Karoları: 16 Addım (Şəkillərlə birlikdə)
Arduino - Piano Karoları: 16 Addım (Şəkillərlə birlikdə)

Video: Arduino - Piano Karoları: 16 Addım (Şəkillərlə birlikdə)

Video: Arduino - Piano Karoları: 16 Addım (Şəkillərlə birlikdə)
Video: 35 видео со страшными призраками: мегасборник 2023 года [V1] 2024, Iyul
Anonim
Arduino - Piano Karoları
Arduino - Piano Karoları

Salam internet insanları, bu, bir arduino uno r3 üzərindəki mobil oyunun qəti olaraq necə yırtılmayacağını izah edəcək.

1x Arduino Uno r3 (42 dollar), beləliklə başlamaq üçün bütün hissələrə ehtiyacınız olacaq!

2x LCD Klaviatura Qalxanı (hər biri 19 dollar)

5x düymələr

5x 220Ω rezistorlar

28x tel

Tamam, bütün hissələri aldıqdan sonra işə başlamağın vaxtı gəldi!

Addım 1: Kabel çəkmə

Kablolama
Kablolama
Kablolama
Kablolama
Kablolama
Kablolama

Diaqramda göstərildiyi kimi arduino və dostlarınızı bağlayaraq başlayın.

Düymələrin, düymələrin relslərinin alt tərəfindəki A0-4 yuvaları ilə düzgün bir şəkildə bağlandığından əmin olun, yoxsa arduino düymələrin yalnız bir mətbuat vasitəsi ilə deyil, daim basıldığını düşünür.

Addım 2: Bəyannamə Bəyanatları

Buradakı bütün kodlar boşluq qurmağınızdan və boşluq döngənizdən əvvəl getməlidir, çünki bu dəyişənlərin və obyektlərin hamısı quracağımız bir neçə funksiyada istifadə olunur.

Qoyaraq başlayın:

#daxil edin

kodunuzun yuxarısında, bu arduino -ya "LiquidCrystal.h" kitabxanasından və onun bir hissəsi olan funksiyalardan istifadə etməyi bildirir.

Növbəti addım, bu kodu #include altına qoyaraq düymələrimiz üçün istifadə etdiyimiz sancaqları təyin etməkdir:

#define btnA0 daxil edin #btn1 müəyyən edin 15 #btn2 müəyyən edin 16 #btn3 müəyyən edin 17 #btn4 müəyyən edin 18

Kodu oxumağımızı asanlaşdırmaq və ya lazım gələrsə dəyişdirmək üçün btnEnter və btn1 -dən btn 4 -ə qədər şərtləri təyin edirik. Bu o deməkdir ki, btn1 yazdığımızda arduino əslində 15 düyməsini nəzərdə tutduğumuzu anlayacaq, 15, 16, 17 və 18 limanlarına zəng etsək də, arduino üzərində A1 A2 A3 və A4 kimi etiketlənmişdir. onlar yalnız rəqəmsal girişlər üçün istifadə etməyimizə baxmayaraq, xüsusi olaraq analog girişlər üçün istifadə olunan portlardır.

Sonra, Maye Kristal Ekranları idarə edəcək obyektlər yaradacağıq. Bunu etmək üçün bu kodu təriflərimizin altına qoyun

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

Bunun nə etməsi arduino -ya lcdLeft və ya lcdRight -a zəng edəndə bir LiquidCrystal obyektinə istinad etdiyimizi söyləyir. Əlavə edilmiş mötərizədəki nömrələr, funksiyalarından istifadə edərkən LCD -yə mesaj göndərmək üçün obyektin hansı portlardan istifadə etməli olduğunu arduino -ya bildirir.

İndi, növbəti kod bitini obyekt bəyannamələrinin altına qoyaraq dəyişənləri elan etməliyik:

// bu dəyişənlər dəyişə biləcəyiniz variantlardır - daha yüksək ədədlər = daha sürətli oyun sürəti intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// gameboolean bolPlay üçün dəyişənlər qurun; // oyunçunun intScore olub olmadığını izləyir; // oyunçunun int intiff hesabını izləyir; // oyunun nə çətin olduğunu söyləmək üçün yalnız estetik bir şey // giriş int intEnter üçün dəyişənlər qurmaq; // istifadəçinin int intInput daxil etmək düyməsini basdığını izləyir; // istifadəçinin boolean bolTilePressed düymələrini basdığını izləyir; // oyunçunun təsadüfən 5x düyməsinə basmamasını və itirməməsini təmin edin // int intTick -i çevirmək üçün dəyişənlər qurun; // intDelay int intDelay qədər millimləri (döngə başına) sayır; // proqramın millis int intGameSpeed -də növbəti növbəyə qədər gözlədiyi vaxt; // ayıklama seçimlərinin mənası boolean bolSerialBoard; // nə vaxt doğru lövhəni serial monitorda çap edəcək

Məlumat növünü və sonra dəyişənin adını, məsələn, bir dəyişən elan edirik. int thisIsAnInteger

BolSerialBoard və bolPlay kimi Boolean dəyişənlər yalnız doğru və ya yanlış iki dəyərdən birinə sahib ola bilər.

İntScore və intInput kimi tam ədəd dəyişənləri (int) 1, 5 və ya 100 kimi bütün ədədləri dəyər kimi qəbul edə bilər.

Burada istifadə etmədiyimiz digər görkəmli məlumat növləri bir mətn parçası olan bir sətir və ondalık sayı olan bir floatdır.

Buradakı dəyişənlərin hər biri proqram tərəfindən bir neçə fərqli yerdə istifadə olunur, burada hər birinin nə etdiyinin xülasəsi verilmişdir

bolPlay, menyunun göstəriləcəyini və ya əsl oyunun işləyəcəyini proqrama bildirir.

intScore plitələrə vurduqda oyunçunun hesabını izləyir, intDiff əsas menyuda LCD -də hansı mətnin çap olunacağını proqrama bildirmək üçün istifadə olunur.

intEnter, giriş düyməsinə (ən solda) basıldığı təqdirdə proqramı bildirmək üçün istifadə olunur, intInput proqramı digər 4 düymədən hansının basıldığını söyləmək üçün istifadə olunur.

bolTilePressed, proqramın yalnız düyməyə basıldığı zaman oxunduğundan əmin olmaq üçün istifadə olunur.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium və intGameSpeedHard, hansı çətinliyin seçildiyinə görə oyunun nə qədər sürətlənməsini nəzarət etmək üçün istifadə olunur.

intTick və intDelay, proqramın hər döngədə lövhəni hərəkət etməsini dayandırmaq üçün istifadə olunur.

bolSerialBoard, proqramın test məqsədləri üçün lövhəni arduino seriyalı monitoruna bir sıra nömrələr kimi göndərməsini təmin etmək üçün istifadə olunur.

Nəhayət, bu kodu istifadə edərək lövhəmizi bir sıra olaraq elan etməyin vaxtı gəldi:

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

Bir sıra, hər hansı bir nöqtənin riyaziyyata çağırıla biləcəyi və ya dəyişdirilə biləcəyi bir matrisdir.

Kodunuz indi belə bir şeyə bənzəməlidir;

// kitabxanalar daxildir#daxildir

// bu dəyişənlər dəyişə biləcəyiniz variantlardır - daha yüksək rəqəmlər = daha sürətli oyun sürəti

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

// Sancaqlar təyin edin

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

// LCD obyektləri yaradın (n, ~, n, ~, ~, n)

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

// oyun serialı qurun

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 üçün dəyişənlər qurun

boolean bolPlay; // oyunçunun intScore olub olmadığını izləyir; // oyunçunun int intiff hesabını izləyir; // oyunun nə qədər çətin olduğunu söyləmək üçün yalnız estetik bir şey

// giriş üçün dəyişənlər qurun

int intEnter; // istifadəçinin int intInput daxil etmək düyməsini basdığını izləyir; // istifadəçinin boolean bolTilePressed düymələrini basdığı izləri; // oyunçunun təsadüfən 5x düyməsinə basmamasını və itirməyini təmin edin

// növbə üçün dəyişənlər qurun

int intTick; // intDelay int intDelay qədər millimləri (döngə başına) sayır; // proqramın millis int intGameSpeed -də növbəti növbəyə qədər gözlədiyi vaxt;

// ayıklama variantları

boolean bolSerialBoard; // nə vaxt doğru lövhəni serial monitorda çap edəcək

Addım 3: Quraşdırma funksiyası

Quraşdırma döngəsi arduino tərəfindən başlanğıcda yalnız bir dəfə oxunan bir funksiyadır.

Quraşdırma döngəsində yalnız bir neçə dəyişənimizin dəyərlərini təyin edirik, çünki onları elan edərkən bir dəyər təyin etmək əvəzinə burada edirik.

Bu kodu Void Setup -a qoyaraq başlayın.

bolPlay = yanlış; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Hər bir xətt yalnız bir dəyişən bir dəyər təyin edir.

oyunun oynamağa başlamaması üçün bolPlay yanlış olaraq təyin olunur.

intScore 0 olaraq təyin olunur, çünki təbii olaraq hesabınız 0 -dan başlayır.

intTick 0 -da başlayır, çünki proqram hazırda heç nə saymır.

intDelay 1000 -ə təyin edilmişdir, çünki plitələrin başladığı nisbət budur.

intDiff sadəcə zahid bir şeydir, belə ki proqram oyunun çətinliyi üçün nə yazacağını bilir.

intGameSpeed, intGameSpeedMedium nə olursa olsun, yəni orta çətinliklə təyin olunur.

Sonra bu kodu, daxil etdiyiniz kodun altına Void Setup -a daxil edin.

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

Serial.begin (9600);

Bu, arduino -ya serial monitor vasitəsilə kompüterlə ünsiyyətə başlamağı bildirir (arduino IDE -nin sağ üst hissəsindəki düyməni basmaqla görünür).

Void Setup'ınız indi belə bir şeyə bənzəməlidir!

void setup () {Serial.begin (9600); // serial monitoru işə salın // dəyişənləri qurun bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin başlayın (16, 2); lcdRight.begin (16, 2); }

Addım 4: Döngü funksiyası

Döngü funksiyası arduinonun hər bir iterasiyası arduino tərəfindən idarə olunur.

Aşağıdakı kodu Void Loop -a kopyalayın.

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// oyunun bir dönüş etməli olub olmadığını yoxlamaq üçün yoxlayın Serial.println ("~~~~~~~ ~~ "); // lövhənin hərəkət etdiyini bildirmək üçün yazmaq // writeSerial (); // seçim aktivdirsə, lövhəni serial düymələrinə yazınGame (); // oyunçu girişlərini yoxlayın playBoard (); // lövhəni hərəkət etdirin və yeni bir kafel əlavə edin clearLcd (); // drawBoard () çəkməzdən əvvəl LCD -ləri təmizləyin; // lövhəni lcd -nin altına çəkinCheck (); intTick = 0; // sıfırla intTick} başqa {buttonGame (); // oyunçu girişlərini yoxlayın clearLcd (); // drawBoard () çəkməzdən əvvəl LCD -ləri təmizləyin; // lövhəni lcd's intTick = intTick + intGameSpeed üzərinə çəkin; // işarəyə əlavə et}} başqa {clearLcd (); // başlıq çəkməzdən əvvəl LCD -ləri təmizləyin (); // başlığı və hesab məlumat düymələrini göstərin Menyu (); // oyunçu girişini oxuyun clearBoard (); // bütün lövhəni təmin edin = 0} gecikmə (10); // arduinonu qısa müddətə təxirə salın}

bolPlay həqiqətə bərabər olduqda, bu, oyunun oynandığı deməkdir və oyunun oynandığı vaxtdakı bütün kodların işə salınması lazımdır, ancaq intTick intDelay -dən daha böyük olduqda yalnız lövhənin yeni bir kafel əlavə etməsini və aşağı düşməsini istəyirik. əks halda istifadəçiyə bir kafel vurmaq və intTick -in sürətini artırmaq üçün bir düyməni basmasına icazə vermək istəyirik.

Bu kodun əksəriyyəti hələ etmədiyimiz funksiyalardan istifadə edir və bunları növbəti addımlarda edəcəyik. Bu funksiyaların məqsədi aşağıdakı kimidir.

Giriş istifadəçinin hansı düymələri basdığını oxuyur.

buttonGame, düymələrin menyuda deyil, oyunda nə etdiyini idarə edir

playBoard, lövhəyə yeni bir kafel əlavə edir və sonra lövhədəki hər şeyi bir boşluq aşağı hərəkət etdirir

clearLCD heç bir xəyalın kafelin arxasında qalmadığından əmin olmaq üçün LCD -ləri təmizləyir

drawBoard arrGame -dən keçir və onu LCD -lərə yazdırır

clearBoard, oyun oynamadığı zaman arrGame -in hamısını təmizləyir

bottomCheck, arrGame -in alt hissəsini bir uğursuzluq vəziyyəti üçün yoxlayır

başlıq, oyunun başlığını və hesab məlumatlarını menyuda göstərdi

düymələr menyusu, istifadəçinin girişlərinin menyuda nə etdiyini idarə edir.

gameOver başqa bir funksiyadır, baxmayaraq ki, altda yox deyildiyi kimi burada çağırılmırCheck və buttonGame funksiyaları.

Addım 5: ClearLCD funksiyası

bir funksiya yaratmaq üçün bunu koda əlavə etməklə başlayırıq

void functionName () {

}

"functionName" artıq olmadığı müddətcə hər şey ola bilər.

Bu kodu proqramı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 (""); }}}

LCD -lərdəki hər bir nöqtədən keçmək və bir boşluq yazmaq üçün 2 sayılan döngə istifadə edərək bütün dizi boyunca keçir.

Heç bir şeyə sıfırlanmadan LCD, əvvəllər yazılanları qoruyacaq

Addım 6: DrawBoard funksiyası

bu kodu proqramınıza kopyalayın

void drawBoard () {for (int i = 1; i <= 15; i ++) {// sol LCD -də 1 və 2 -də collums çəkin // əgər kafel = 0 heç nə yazmırsa, = 1 "#" yazın, = 2 "@" lcdLeft.setCursor yazın (i, 1); // (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight. yazın ("@");}}}

bu, lövhənin hər bir sətrindən keçmək üçün bir döngə istifadə edir, sonra satırdakı hər hansı bir sütunun 1 və ya 2 -yə bərabər olub olmadığını yoxlayır, buna əsaslanaraq LCD -də ya bir hashtag yazdırmaq üçün hələ bir kafel yoxdur. hit və ya bir vuruş kafel üçün @.

Addım 7: PlayBoard funksiyası

bu kodu proqramınıza kopyalayın.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // üst sıranı sil arrGame [0] [təsadüfi (0, 4)] = 1; // üst sətirdə təsadüfi bir nöqtə qoyun (int i = 15; i> = 1; i-) {// lövhənin altından yuxarıya doğru işləyən (int ii = 0; ii <= 3; ii ++) {// hər collum üçün arrGame [ii] = arrGame [i - 1] [ii]; }}}

bu kod bütün üst sıranı 0 -a silməklə başlayır və ya heç bir kafel yoxdur və sonra təsadüfi bir kafelin 1 və görünməyən bir kafel olmasını təyin edir.

Ardından, 15 -dən 1 -ə qədər, əksinə sayılmış bir döngədən keçir, sətri yuxarıdakı satırın bərabər olduğu yerə bərabərləşdirir və lövhənin LCD -dən aşağıya doğru hərəkət etməsinə səbəb olur.

Addım 8: ClearBoard funksiyası

bu kodu proqramınıza kopyalayın.

void clearBoard () {// işarəni sıfırlayın və intTick = 0 dəyərlərini gecikdirin; intDelay = 1000; // lövhədən keçin və hər şeyi 0 olaraq təyin edin (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Bu kod, dizi keçmək üçün sayılan döngələrdən istifadə edərək, arrGame -in bütününün 0 -a qoyulduğundan və ya heç bir kafel olmadığından əmin olmaq üçün oyun oynanılmadığı zaman işləyir.

Kod intDelay və intTick dəyərlərini də sıfırlayır.

Addım 9: Başlıq funksiyası

aşağıdakı kodu proqramınıza kopyalayın

void title () {// başlığı LCD -yə yazın və lcdRight.setCursor üçün boşluq yazın (0, 0); lcdRight.write ("Piano Fayansları"); lcdRight.setCursor (0, 1); lcdRight.write ("Hesab:"); // skoru simli simlərə çevir StrScore [3]; sprintf (strScore, "%d", intScore); // LCD lcdRight.write üzərində hesab göstər (strScore); // diffictuly lcdRight.setCursor əlavə edin (10, 1); əgər (intDiff == 0) {lcdRight.write ("Asan"); } əgər (intDiff == 1) {lcdRight.write ("Orta"); } əgər (intDiff == 2) {lcdRight.write ("Sərt"); } // lcdLeft.setCursor (0, 0) təlimatını bir az basın; lcdLeft.write ("Enter düyməsini basın"); lcdLeft.setCursor (0, 1); lcdLeft.write ("başlamaq üçün!"); }

Bu kod oyunun adını və hesabını LCD -lərə yazır, bunu LCD -yə LCD.setCursor istifadə edərək yazmağa haradan başlayacağını və sonra sətri LCD.write -də yazaraq edir.

Burada yeni bir dəyişən yaradılır, strScore, sprintf funksiyasından istifadə edərək intScore -u simli və ya simli məlumat tipinə çevirmək üçün istifadə olunur.

intDiff də burada istifadə olunur, dəyərlərinə əsaslanaraq fərqli çətinlik seçimlərini yazdırır.

Addım 10: ButtonsMenu funksiyası

proqramınıza aşağıdakı kodu daxil edin

boş düymələrMenu () {// daxil edildikdə oyuna başlayın və əgər (intEnter == 1) {bolPlay = doğru; intScore = 0; playBoard (); drawBoard (); } // 3 -cü düyməyə basıldıqda lövhəni ardıcıl olaraq çap etmək üçün debug seçimini yandırın (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = doğru; } başqa {Serial.println ("Serial Board Disabled"); bolSerialBoard = yanlış; }} // oyun sürətini asan bir çətinlik olaraq təyin edin (intInput == 0) {Serial.print ("Oyun asan olaraq quruldu ("); Serial.print (intGameSpeedEasy); Serial.println ("ms sürətləndirmə)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // oyun sürətini orta çətinliyə təyin edin, əgər (intInput == 1) {Serial.print ("Oyun orta olaraq ayarlandı ("); Serial.print (intGameSpeedMedium); Serial.println ("ms sürətləndirmə)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // oyun sürətini çətin çətinlik səviyyəsinə təyin edin, əgər (intInput == 2) {Serial.print ("Oyun sərt olaraq ayarlandı ("); Serial.print (intGameSpeedHard); Serial.println ("ms sürətləndirmə)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

bu kod yalnız bolPlay boşluq döngəsində yalana bərabər olduqda işlədilir

intEnter 1 -ə təyin olunarsa, bu düyməni basmaq deməkdir, əgər ona basılırsa, proqram bolPlay -ı doğru olaraq təyin edir və oyun başlayır.

Proqram daha sonra intInput -un nəyə bərabər olduğunu oxuyur. 0 -a bərabərdirsə, soldan ilk düymə basılır, sağa 3 -ə qədər gedir. intInput 4 -ə bərabərdirsə heç bir düyməyə basılmır.

0-2 düymələrinə basıldıqda oyun çətinliyi dəyişir, eyni zamanda oyun sürətinin dəyərini tənzimləyir, yəni daha sürətli sürətlənəcək.

3 düyməsinə basıldığı təqdirdə, oyun, proqramdakı problemləri tapmaqda kömək etmək üçün bütün lövhənin serial monitorda çap edildiyi bir hata ayıklama rejimini aktivləşdirəcək və ya söndürəcək.

Addım 11: ButtonsGame Function

aşağıdakı kodu proqramınıza kopyalayın

void buttonGame () {if (intInput! = 4) {// if but a pressed if if (bolTilePressed == false) {// only if bolTilePressed is not trigger button to check a button to bolTilePressed = true; // sonra yenidən təsadüfən tetiklenmediğinden əmin olmaq üçün bolTilePressed -i true olaraq təyin edin int intLowestTile = 0; // ən aşağı kafel olan kafelə qoyulacaq int intCheckedTile = 15; // (intLowestTile == 0) {// heç bir şey təyin olunmadığı müddətcə plitələrin yoxlanıldığını izləmək üçün (int i = 0; i 100) {// int gecikmə 100 intDelay = intDelay - 20 -dən aşağı deyil; // ondan bir dəyər alın}} başqa {Serial.println ("Yanlış düymə basıldı"); oyun bitdi(); // əks halda oyun bitdi}}}}}

Kod yalnız bolPlay boşluq döngəsində doğruya bərabər olduqda işlədilir.

Düymələri kimi, intInput dəyərinə əsaslanaraq, oyunçunun bir kafel vurub vurmadığını yoxlayır.

Bunu, görünməyən bir kafel ilə hansı satırın ən aşağı olduğunu axtarmaq üçün bir müddət döngəsindən istifadə edərək arrGame -dən aşağıdan yuxarıya keçərək edir. Daha sonra düyməni basmaq üçün həmin sətirdə göstərilən düymənin görünməmiş bir kafel olub -olmadığını yoxlayır, əgər görünməsə onu 1 əvəzinə 2 -yə bərabər edir, yəni @olaraq göstərilir, əks halda oyunu tetikler. hələ yaratmadığımız funksiya.

Bu funksiya, düyməyə basıldığında doğru və heç bir düyməyə basılmadığı zaman yanlış olaraq təyin edərək bolTilePressed dəyişənindən istifadə edir. Bu, istifadəçinin oyunu təsadüfən itirməməsini təmin etmək üçündür, çünki proqram düyməni basıb saxladıqda dəfələrlə basdıqlarını düşünürdü.

Addım 12: GameOver funksiyası

Aşağıdakı kodu proqramınıza kopyalayın

void gameOver () {Serial.println ("Oyun bitdi!"); Serial.print ("Hesabınız belə idi:"); Serial.println (intScore); Serial.print ("Sürətiniz belə idi:"); Serial.println (intDelay); bolPlay = yanlış; }

Bu ya checkBottom ya da buttonGame funksiyaları tərəfindən tetiklenir və bolPlay -ı yalan olaraq təyin edərək oyunun sonunu tetikler.

İstifadəçilərin qolu və sürət plitələrinin milisaniyələrdə əlavə edilməsi üçün serial monitoruna bir mesaj da yazdırır.

Addım 13: Giriş funksiyası

Aşağıdakı kodu proqramınıza kopyalayın.

void input () {intEnter = digitalRead (btnEnter); // oxu daxil edin // digər girişlərdən hansını oxuyun və ya heç biri 4 -ə qoyulmamışdırsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} başqa {əgər (digitalRead (btn3) == YÜKSƏK) {intInput = 2;} başqa {əgər (digitalRead (btn4) == YÜKSƏK) {intInput = 3;} başqa {intInput = 4; }}}} // girişləri ardıcıl olaraq çap edin (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } başqa {// heç bir düyməyə basılmasa sıfırlama bolTilePressed bolTilePressed = false; }}

Bu kod düymələriGame və buttonMenu funksiyaları ilə istifadə olunur. İstifadəçinin basdığı düymələrə əsasən intInput dəyərini təyin edir və ya heç bir düyməyə basılmazsa intInputu 4 -ə bərabər edir.

Heç bir düyməyə basılmazsa, bura düymələriGame funksiyası üçün bolTilePressed sıfırlanır.

Həm də düymənin basıldığı serial monitoruna bir mesaj yazdırır.

Addım 14: BottomCheck funksiyası

aşağıdakı kodu proqramınıza kopyalayın.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for 4 collumns if (arrGame [15] == 1) {// əgər bir kafel Serialın altındadırsa.println ("Çini altda"); arrGame [15] = 2; drawBoard (); gecikmə (400); arrGame [15] = 1; drawBoard (); gecikmə (400); arrGame [15] = 2; drawBoard (); gecikmə (400); arrGame [15] = 1; drawBoard (); gecikmə (400); oyun bitdi(); }}}

bir döngə istifadə edərək, bu kod arrGame -in alt sırasını hər hansı bir görünməmiş plitələr üçün yoxlayır (plitələr 1 -ə bərabərdir), ekranın altındakı görünməmiş bir kafel varsa, kafel yanıb -sönəcək və sonra oyunu funksiya üzərində işə salacaq.

Addım 15: WriteSerial Function

aşağıdakı kodu proqramı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]); Serial.print (","); } Serial.println (""); }}}

Bu, buttonMenu funksiyasında aktivləşdirilə bilən ayıklama seçiminin izlədiyi funksiyadır. Əgər bolSerialBoard bu funksiyada doğru olaraq təyin edilərsə, arrGame -dən keçəcək və bir sıra istifadə edərək test üçün bütün lövhəni serial monitoruna yazdıracaq.

Addım 16: Tamamlama

Tamamlanma!
Tamamlanma!

Bütün kodlarınız tam olmamalı və buna bənzəməlidir!

/ * * Adı - Piano Çini; Arduino * By - Domenic Marulli * Tarix - 11/ *

/ kitabxanalar daxildir

#daxil edin

// bu dəyişənlər dəyişə biləcəyiniz variantlardır - daha yüksək rəqəmlər = daha sürətli oyun sürəti

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

// Sancaqlar təyin edin

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

// LCD obyektləri yaradın (n, ~, n, ~, ~, n)

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

// oyun serialı qurun

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 üçün dəyişənlər qurun

boolean bolPlay; // oyunçunun intScore olub olmadığını izləyir; // oyunçunun int intiff hesabını izləyir; // oyunun nə qədər çətin olduğunu söyləmək üçün yalnız estetik bir şey

// giriş üçün dəyişənlər qurun

int intEnter; // istifadəçinin int intInput daxil etmək düyməsini basdığını izləyir; // istifadəçinin boolean bolTilePressed düymələrini basdığı izləri; // oyunçunun təsadüfən 5x düyməsinə basmamasını və itirməyini təmin edin

// növbə üçün dəyişənlər qurun

int intTick; // intDelay int intDelay qədər millimləri (döngə başına) sayır; // proqramın millis int intGameSpeed -də növbəti növbəyə qədər gözlədiyi vaxt;

// ayıklama variantları

boolean bolSerialBoard; // nə vaxt doğru lövhəni serial monitorda çap edəcək

// bir dəfə işləyəcək quruluş

void setup () {Serial.begin (9600); // serial monitoru işə salın // dəyişənləri qurun bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin başlayın (16, 2); lcdRight.begin (16, 2); }

// hər 10 milisaniyədə işləyəcək döngə

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// oyunun bir dönüş etməli olub olmadığını yoxlamaq üçün yoxlayın Serial.println ("~~~~~~~ ~~ "); // lövhənin hərəkət etdiyini bildirmək üçün yazmaq // writeSerial (); // seçim aktivdirsə, lövhəni serial düymələrinə yazınGame (); // oyunçu girişlərini yoxlayın playBoard (); // lövhəni hərəkət etdirin və yeni bir kafel əlavə edin clearLcd (); // drawBoard () çəkməzdən əvvəl LCD -ləri təmizləyin; // lövhəni lcd -nin altına çəkinCheck (); intTick = 0; // sıfırla intTick} başqa {buttonGame (); // oyunçu girişlərini yoxlayın clearLcd (); // drawBoard () çəkməzdən əvvəl LCD -ləri təmizləyin; // lövhəni lcd's intTick = intTick + intGameSpeed üzərinə çəkin; // işarəyə əlavə et}} başqa {clearLcd (); // başlıq çəkməzdən əvvəl LCD -ləri təmizləyin (); // başlığı və hesab məlumat düymələrini göstərin Menyu (); // oyunçu girişini oxuyun clearBoard (); // bütün lövhəni təmin edin = 0} gecikmə (10); // arduinonu qısa müddətə təxirə salın}

// lcd -ni təmizləyir, buna görə də daxil edilməmiş hüceyrələr orada qalmır

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

// lövhəni lcd -lərə çəkir

void drawBoard () {for (int i = 1; i <= 15; i ++) {// sol LCD -də 1 və 2 -də collums çəkin // əgər kafel = 0 heç nə yazmırsa, = 1 "#" yazın, = 2 "@" lcdLeft.setCursor yazın (i, 1); // (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight. yazın ("@");}}}

// lövhəni aşağı çəkir və kafel olmaq üçün təsadüfi bir dəyər qoyur

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // üst sıranı sil arrGame [0] [təsadüfi (0, 4)] = 1; // üst sətirdə təsadüfi bir nöqtə qoyun (int i = 15; i> = 1; i-) {// lövhənin altından yuxarıya doğru işləyən (int ii = 0; ii <= 3; ii ++) {// hər collum üçün arrGame [ii] = arrGame [i - 1] [ii]; }}}

// bütün lövhəni 0 olaraq təyin edir və dəyişənləri əvvəlcədən oyuna sıfırlar

void clearBoard () {// işarəni sıfırlayın və intTick = 0 dəyərlərini gecikdirin; intDelay = 1000; // lövhədən keçin və hər şeyi 0 olaraq təyin edin (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// LCD -də Əsas Menyu göstərilir

void title () {// başlığı LCD -yə yazın və lcdRight.setCursor üçün boşluq yazın (0, 0); lcdRight.write ("Piano Fayansları"); lcdRight.setCursor (0, 1); lcdRight.write ("Hesab:"); // skoru simli simlərə çevir StrScore [3]; sprintf (strScore, "%d", intScore); // LCD lcdRight.write üzərində hesab göstər (strScore); // diffictuly lcdRight.setCursor əlavə edin (10, 1); əgər (intDiff == 0) {lcdRight.write ("Asan"); } əgər (intDiff == 1) {lcdRight.write ("Orta"); } əgər (intDiff == 2) {lcdRight.write ("Sərt"); } // lcdLeft.setCursor (0, 0) təlimatını bir az basın; lcdLeft.write ("Enter düyməsini basın"); lcdLeft.setCursor (0, 1); lcdLeft.write ("başlamaq üçün!"); }

// düymələri və oyundan kənarda nə etməli olduqlarını yoxlayır

boş düymələrMenu () {// daxil edildikdə oyuna başlayın və əgər (intEnter == 1) {bolPlay = doğru; intScore = 0; playBoard (); drawBoard (); } // 3 -cü düyməyə basıldıqda lövhəni ardıcıl olaraq çap etmək üçün debug seçimini yandırın (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = doğru; } başqa {Serial.println ("Serial Board Disabled"); bolSerialBoard = yanlış; }} // oyun sürətini asan bir çətinlik olaraq təyin edin (intInput == 0) {Serial.print ("Oyun asan olaraq quruldu ("); Serial.print (intGameSpeedEasy); Serial.println ("ms sürətləndirmə)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // oyun sürətini orta çətinliyə təyin edin, əgər (intInput == 1) {Serial.print ("Oyun orta olaraq ayarlandı ("); Serial.print (intGameSpeedMedium); Serial.println ("ms sürətləndirmə)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // oyun sürətini çətin çətinlik səviyyəsinə təyin edin, əgər (intInput == 2) {Serial.print ("Oyun sərt olaraq ayarlandı ("); Serial.print (intGameSpeedHard); Serial.println ("ms sürətləndirmə)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// düymələri və oyunda onlar üçün nə edəcəyini yoxlayır

void buttonGame () {if (intInput! = 4) {// if but a pressed if if (bolTilePressed == false) {// only if bolTilePressed is not trigger button to check a button to bolTilePressed = true; // sonra yenidən təsadüfən tetiklenmediğinden əmin olmaq üçün bolTilePressed -i true olaraq təyin edin int intLowestTile = 0; // ən aşağı kafel olan kafelə qoyulacaq int intCheckedTile = 15; // (intLowestTile == 0) {// heç bir şey təyin olunmadığı müddətcə plitələrin yoxlanıldığını izləmək üçün (int i = 0; i 100) {// int gecikmə 100 -dən aşağı deyil intDelay = intDelay - 20; // ondan bir dəyər alın}} başqa {Serial.println ("Yanlış düymə basıldı"); oyun bitdi(); // əks halda oyun bitdi}}}}}

boş oyunOver () {

Serial.println ("Oyun bitdi!"); Serial.print ("Hesabınız belə idi:"); Serial.println (intScore); Serial.print ("Sürətiniz belə idi:"); Serial.println (intDelay); bolPlay = yanlış; }

// oyunçu girişini yoxlayır

void input () {intEnter = digitalRead (btnEnter); // oxu daxil edin // digər girişlərdən hansını oxuyun və ya heç biri 4 -ə qoyulmamışdırsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} başqa {əgər (digitalRead (btn3) == YÜKSƏK) {intInput = 2;} başqa {əgər (digitalRead (btn4) == YÜKSƏK) {intInput = 3;} başqa {intInput = 4; }}}} // girişləri ardıcıl olaraq çap edin (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } başqa {// heç bir düyməyə basılmasa sıfırlama bolTilePressed bolTilePressed = false; }}

// lövhənin altındakı uğursuzluğu yoxlayır

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns if if (arrGame [15] == 1) {// bir kafel Serialın altındadırsa.println ("Çini altda"); arrGame [15] = 2; drawBoard (); gecikmə (400); arrGame [15] = 1; drawBoard (); gecikmə (400); arrGame [15] = 2; drawBoard (); gecikmə (400); arrGame [15] = 1; drawBoard (); gecikmə (400); oyun bitdi(); }}}

// bolSerialBoard doğru olarsa, lövhəni seriyalı monitora 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]); Serial.print (","); } Serial.println (""); }}}

Bütün kodu daxil etdikdən sonra arduino -ya yükləyin və zövq alın!

Tövsiyə: