Turinys:

„Arduino“- fortepijono plytelės: 16 žingsnių (su paveikslėliais)
„Arduino“- fortepijono plytelės: 16 žingsnių (su paveikslėliais)

Video: „Arduino“- fortepijono plytelės: 16 žingsnių (su paveikslėliais)

Video: „Arduino“- fortepijono plytelės: 16 žingsnių (su paveikslėliais)
Video: Leap Motion SDK 2024, Liepa
Anonim
Arduino - fortepijono plytelės
Arduino - fortepijono plytelės

Sveiki, interneto žmonės, tai bus apie tai, kaip padaryti tai, kas TIKRAI nėra mobiliojo žaidimo „arduino uno r3“atplėšimas.

Taigi, norint pradėti, jums reikės visų dalių, kurios yra tokios! 1x „Arduino Uno r3“(42 USD)

2x LCD klaviatūros skydas (po 19 USD)

5x mygtukai

5x 220Ω rezistoriai

28x laidai

Gerai, kai turite visas dalis, laikas pradėti!

1 žingsnis: laidų prijungimas

Laidai
Laidai
Laidai
Laidai
Laidai
Laidai

Pradėkite prijungdami savo arduino ir draugus, kaip parodyta diagramoje, Įsitikinkite, kad mygtukai yra tinkamai sujungti, o A0-4 lizdai yra žemėje mygtukų bėgelių pusėje, kitaip „arduino“manys, kad mygtukai yra nuolat laikomi, o ne tik paspaudžiami.

2 žingsnis: Deklaracijos pareiškimai

Visas kodas čia turėtų būti pateiktas prieš jūsų tuštumos nustatymą ir tuštumos ciklą, nes visi šie kintamieji ir objektai yra naudojami keliose mūsų nustatytose funkcijose.

Pradėkite dėdami:

#įtraukti

kodo viršuje tai nurodo arduino naudoti biblioteką „LiquidCrystal.h“ir funkcijas, kurios yra jos dalis.

Kitas žingsnis yra apibrėžti kaiščius, kuriuos naudojame savo mygtukams, įterpdami šį kodą po #include:

#define btn Įveskite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Mes apibrėžiame terminus „btnEnter“ir „btn1“- „btn 4“, kad mums būtų lengviau skaityti kodą arba prireikus jį pakeisti. Tai reiškia, kad kai įvedame „btn1“, arduino žinos, kad iš tikrųjų turime omenyje mygtuką 15. Nors mes vadiname uostus 15, 16, 17 ir 18, jie yra pažymėti arduino kaip A1 A2 A3 ir A4, nes jie yra prievadai, naudojami specialiai analoginiams įėjimams, nors mes juos naudojame tik skaitmeninėms įvestims.

Toliau mes sukursime objektus, kurie valdys skystųjų kristalų ekranus. Norėdami tai padaryti, įdėkite šį kodą žemiau mūsų apibrėžimų

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

Tai daro arduino, kad kai vadiname „lcdLeft“arba „lcdRight“, mes kalbame apie „LiquidCrystal“objektą. Skaičiai pridedamuose skliausteliuose nurodo arduino, kokius prievadus objektas turėtų naudoti pranešimams siųsti į LCD, kai naudojame jų funkcijas.

Dabar turime deklaruoti kintamuosius, įdėdami kitą kodo bitą po objektų deklaracijomis:

// šie kintamieji yra parinktys, kurias galite pakeisti - didesni skaičiai = greitesnis žaidimo greitis upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// nustatyti kintamuosius gameboolean bolPlay; // takeliai, jei grotuvas int intScore; // seka žaidėjo rezultatą int intDiff; // tiesiog estetinis dalykas, pasakantis, kokie sunkumai yra žaidime // nustatyti kintamuosius įvesties int intEnter; // seka, jei vartotojas paspaudžia įvesties mygtuką int intInput; // seka, kuriuos mygtukus vartotojas paspaudžia boolean bolTilePressed; // užtikrinti, kad grotuvas netyčia nepaspaustų mygtuko 5x ir neprarastų // nustatyti kintamųjų turn int intTick; // skaičiuoja milijardus (už kilpą) iki intDelay int intDelay; // laikas, per kurį programa laukia kito posūkio milis int intGameSpeed; // abit debug options boolean bolSerialBoard; // kai true, spausdins plokštę nuosekliajame monitoriuje

Mes deklaruojame kintamąjį, nurodydami duomenų tipą ir tada kintamojo pavadinimą, pvz. int thisIsAnInteger

Loginiai kintamieji, tokie kaip „bolSerialBoard“ir „bolPlay“, gali turėti tik vieną iš dviejų reikšmių - teisingą arba klaidingą.

Sveikasis skaičius (int), pvz., „IntScore“ir „intInput“, gali reikšti sveikus skaičius, pvz., 1, 5 arba 100.

Kai kurie kiti pastebimi duomenų tipai, kurių čia nenaudojame, yra eilutė, kuri yra teksto dalis, ir plūdė, kuri yra dešimtainis skaičius.

Kiekviena iš čia esančių kintamųjų yra naudojama programoje keliose skirtingose vietose, čia yra santrauka, ką kiekvienas daro

„bolPlay“nurodo programai, ar turėtų būti rodomas meniu, ar turi būti vykdomas tikrasis žaidimas.

„intScore“seka žaidėjo rezultatą, kai jis pataiko į plyteles, „intDiff“naudojamas pagrindiniame meniu ir nurodo programai, kokį teksto bitą spausdinti LCD ekranuose, „intEnter“naudojamas programai pranešti, jei paspaudžiamas įvesties mygtukas (toliausiai kairėje), „intInput“programai nurodo, kuris iš kitų 4 mygtukų yra paspaustas.

„bolTilePressed“naudojama siekiant įsitikinti, kad programa skaito tik tada, kai mygtukas yra paspaustas, o ne laikant.

„intGameSpeed“, „intGameSpeedEasy“, „intGameSpeedMedium“ir „intGameSpeedHard“naudojami valdyti, kaip greitai žaidimas turėtų paspartėti, atsižvelgiant į tai, koks sunkumas yra pasirinktas.

„intTick“ir „intDelay“naudojami, kad programa nejudėtų lentos kiekvieną kartą, kai ji sukasi.

„bolSerialBoard“naudojama norint priversti programą siųsti plokštę į „arduino“serijinį monitorių kaip skaičių seriją bandymams.

Pagaliau atėjo laikas paskelbti savo lentą kaip masyvą naudojant šį kodą:

// nustatyti žaidimų masyvą 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}};

Masyvas yra matrica, kurią bet kuris taškas gali būti vadinamas matematika arba kurį reikia pakeisti.

Dabar jūsų kodas turėtų atrodyti maždaug taip;

// įtraukti bibliotekas#įtraukti

// šie kintamieji yra parinktys, kurias galite pakeisti - didesni skaičiai = spartesnis žaidimas

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

// Apibrėžkite kaiščius

#define btn Įveskite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// sukurti LCD objektus (n, ~, n, ~, ~, n)

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

// nustatyti žaidimų masyvą

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

// nustatyti žaidimo kintamuosius

loginis „bolPlay“; // takeliai, jei grotuvas int intScore; // seka žaidėjo rezultatą int intDiff; // tiesiog estetinis dalykas, pasakantis, kokie sunkumai yra žaidime

// nustatyti kintamuosius įvedimui

int intEnter; // seka, jei vartotojas paspaudžia įvesties mygtuką int intInput; // seka, kuriuos mygtukus vartotojas paspaudžia boolean bolTilePressed; // įsitikinkite, kad žaidėjas neatsitiktinai 5 kartus nepaspaudžia mygtuko ir nepralaimi

// nustatyti kintamuosius posūkiui

int intTick; // skaičiuoja milijardus (už kilpą) iki intDelay int intDelay; // laikas, per kurį programa laukia kito posūkio milis int intGameSpeed;

// derinimo parinkčių abit

loginis bolSerialBoard; // kai true, spausdins plokštę nuosekliajame monitoriuje

3 žingsnis: sąrankos funkcija

Sąrankos kilpa yra funkcija, kurią arduino skaito tik vieną kartą, kai ji iš pradžių paleidžiama.

Sąrankos cikle mes tik nustatome kelių mūsų kintamųjų reikšmes, nes vietoj jų nustatymo reikšmės deklaruojame, kad tai darome čia.

Pradėkite įdėdami šį kodą į savo „Void“sąranką.

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

Kiekviena eilutė tiesiog nustato kintamąjį į vertę.

„bolPlay“nustatytas kaip klaidingas, kad žaidimas nebūtų pradėtas žaisti.

„intScore“yra nustatytas į 0, nes natūraliai jūsų rezultatas prasideda nuo 0.

„intTick“prasideda nuo 0, nes programa šiuo metu nieko neskaičiuoja.

„intDelay“nustatytas kaip 1000, nes tokiu greičiu prasideda plytelės.

„intDiff“yra tik asketiškas dalykas, kad programa žinotų, ką parašyti dėl žaidimo sunkumų.

„intGameSpeed“nustatytas kaip bet koks „intGameSpeedMedium“, tai reiškia, kad jis nustatytas vidutinio sunkumo.

Tada įdėkite šį kodą į „Void Setup“po ką tik įvestu kodu.

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

Serial.begin (9600);

Tai nurodo arduino pradėti bendrauti su kompiuteriu per nuoseklųjį monitorių (matomas spustelėjus mygtuką viršutiniame dešiniajame arduino IDE).

Dabar jūsų „Void“sąranka turėtų atrodyti maždaug taip!

void setup () {Serial.begin (9600); // paleisti serijinį monitorių // nustatyti kintamuosius bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

4 žingsnis: ciklo funkcija

Ciklo funkciją „arduino“vykdo kiekvieną arduino kartojimą.

Nukopijuokite šį kodą į savo „Void Loop“.

void loop () {input (); // patikrinkite, ar žaidžiamas įvestis, jei (bolPlay == true) {if (intTick> = intDelay) {// patikrinkite, ar žaidimas turėtų suktis ar toliau laukti Serial.println ("~~~~~~~ ~~ "); // spausdinti, kad lenta judėtų toliau // writeSerial (); // jei parinktis įjungta, įrašykite lentą į nuoseklius mygtukusGame (); // patikrinti grotuvo įvestis playBoard (); // perkelkite lentą ir pridėkite naują plytelę clearLcd (); // išvalykite LCD prieš piešdami drawBoard (); // nupieškite lentą ant LCD apačiosCheck (); intTick = 0; // iš naujo nustatyti intTick} else {buttonsGame (); // patikrinti grotuvo įvestis clearLcd (); // išvalykite LCD prieš piešdami drawBoard (); // nupiešti lentą ant LCD intTick = intTick + intGameSpeed; // pridėti prie varnelės}} else {clearLcd (); // išvalykite LCD ekranus prieš piešdami pavadinimą (); // rodyti pavadinimo ir balo informacijos mygtukusMeniu (); // skaityti grotuvo įvestį clearBoard (); // užtikrinti visą lentą = 0} delay (10); // trumpam atidėti arduino}

kai „bolPlay“yra lygus „true“, tai reiškia, kad žaidimas žaidžiamas, ir visas žaidimo kodas turi būti paleistas, tačiau norime, kad lenta pridėtų naują plytelę ir judėtų žemyn, kai „intTick“yra didesnė už mūsų intDelay, priešingu atveju vis tiek norime leisti vartotojui paspausti mygtuką, kad pataikytų į plytelę, ir kad intTick padidintų greitį.

Dauguma šio kodo naudoja funkcijas, kurių dar neturime, ir jas atliksime atlikdami kitus veiksmus. Šių funkcijų tikslas yra toks.

Įvestis nuskaito, kuriuos mygtukus vartotojas paspaudė.

„GamesGame“valdo, ką mygtukai veikia žaidimo metu, o ne meniu

„PlayBoard“prideda naują plytelę prie lentos ir tada perkelia viską, kas yra lentoje, viena vieta žemyn

„clearLCD“valo LCD ekranus, kad įsitikintų, jog po plytelėmis nelieka vaiduoklių

drawBoard eina per arrGame ir spausdina ant LCD

clearBoard išvalo visą arrGame, kai žaidimas nėra žaidžiamas

„bottomCheck“patikrina, ar „arrGame“apačioje nėra gedimo būklės

Pavadinimas meniu rodo žaidimo pavadinimą ir rezultatą

mygtukų meniu valdo, ką vartotojo įvestys veikia meniu.

„gameOver“yra dar viena funkcija, nors čia ji nėra vadinama, kaip vadinama apačioje „Patikrinkite ir mygtukai“Žaidimo funkcijos.

5 veiksmas: „ClearLCD“funkcija

Norėdami sukurti funkciją, mes pradedame ją pridėti prie kodo

void functionName () {

}

„functionName“gali būti bet kas, jei jo dar nėra.

Nukopijuokite šį kodą į savo programą:

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

tai vyksta per visą masyvą, naudojant 2 suskaičiuotas kilpas, einančias per kiekvieną LCD tašką ir parašant tarpą.

Nieko nenustačius iš naujo, LCD išsaugos tai, kas buvo parašyta anksčiau

6 žingsnis: „DrawBoard“funkcija

nukopijuokite šį kodą į savo programą

void drawBoard () {for (int i = 1; i <= 15; i ++) {// piešti 1 ir 2 koliažus kairiajame LCD ekrane // jei plytelė = 0 nieko nerašo, = 1 rašykite „#“, = 2 parašykite „@“lcdLeft.setCursor (i, 1); // nustatyti į pirmą stulpelį (toliausiai kairėje), jei (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // nustatyti į antrąjį stulpelį (centre kairėje) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // nustatyti į trečiąjį stulpelį (centre dešinėje) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // nustatyti į ketvirtą stulpelį (tolimiausioje dešinėje), jei (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

tai naudoja ciklą, kad eitų per kiekvieną lentos eilutę, tada patikrina, ar bet kuris eilutės stulpelis yra lygus 1 arba 2, remdamasis tuo, kad LCD ekrane spausdina žymeklį, kad plytelė dar būtų hitas, arba @ už smūgio plytelę.

7 žingsnis: „PlayBoard“funkcija

nukopijuokite šį kodą į savo programą.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // išvalyti viršutinę eilę arrGame [0] [atsitiktinis (0, 4)] = 1; // nustatykite atsitiktinį tašką viršutinėje eilutėje, kad jis būtų plytelė (int i = 15; i> = 1; i-) {// dirbantis nuo lentos apačios iki viršaus (int ii = 0; ii <= 3; ii ++) {// už kiekvieną kolumą arrGame [ii] = arrGame [i - 1] [ii]; }}}

šis kodas prasideda išvalius visą viršutinę eilutę iki 0 arba be plytelių, tada viena atsitiktinė plytelė nustatoma kaip 1 ir nepastebima plytelė.

Tada ji eina per suskaičiuotą kilpą atvirkščiai, nuo 15 iki 1, nustatydama eilutę lygią bet kokiai eilutei virš jos, todėl lenta juda žemyn LCD

8 žingsnis: „ClearBoard“funkcija

nukopijuokite šį kodą į savo programą.

void clearBoard () {// iš naujo nustatyti erkių ir uždelsimo reikšmes intTick = 0; intDelay = 1000; // eikite per lentą ir nustatykite viską į 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Šis kodas paleidžiamas žaidimo metu, kad įsitikintumėte, jog visa „arrGame“yra nustatyta į 0 arba nėra plytelių, naudojant suskaičiuotas kilpas, kad būtų galima eiti per masyvą.

Kodas taip pat atkuria „intDelay“ir „intTick“reikšmes.

9 veiksmas: pavadinimo funkcija

nukopijuokite šį kodą į savo programą

void title () {// įrašykite pavadinimą į skystųjų kristalų ekraną ir vietą rezultatui lcdRight.setCursor (0, 0); lcdRight.write („Fortepijoninės plytelės“); lcdRight.setCursor (0, 1); lcdRight.write ("Rezultatas:"); // konvertuoti rezultatą į eilutę char strScore [3]; „sprintf“(„strScore“, „%d“, intScore); // rodyti rezultatą ant LCD lcdRight.write (strScore); // pridėti sudėtingai lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lengvas"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kietas"); } // Paspauskite truputį instrukcijos lcdLeft.setCursor (0, 0); lcdLeft.write ("Paspauskite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("pradėti!"); }

Šis kodas įrašo žaidimo pavadinimą ir rezultatą į LCD ekranus, tai nurodydamas LCD, kur pradėti rašyti naudojant LCD.setCursor, o tada įrašant eilutę į LCD.write.

Čia taip pat sukuriamas naujas kintamasis „strScore“, jis naudojamas „intScore“konvertuoti į eilutės arba char duomenų tipą naudojant funkciją „sprintf“.

Čia taip pat naudojamas intDiff, pagal jo vertes jis spausdina skirtingas sudėtingumo parinktis.

10 žingsnis: „ButtonsMenu“funkcija

įveskite šį kodą į savo programą

void buttonsMenu () {// kai paspaudžiamas enter, pradėkite žaidimą ir iš naujo nustatykite rezultato reikšmę, jei (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kai paspaudžiamas 3 mygtukas, įjunkite derinimo parinktį spausdinti plokštę nuosekliai, jei (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tiesa; } else {Serial.println („Serial Board Disabled“); bolSerialBoard = klaidinga; }} // nustatyti žaidimo greitį iki lengvo sunkumo, jei (intInput == 0) {Serial.print ("Žaidimas nustatytas kaip lengvas ("); Serial.print (intGameSpeedEasy); Serial.println ("ms pagreitis)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // nustatykite vidutinio sunkumo žaidimo greitį, jei (intInput == 1) {Serial.print ("Žaidimas nustatytas į vidutinę ("); Serial.print (intGameSpeedMedium); Serial.println ("ms pagreitis)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // nustatykite žaidimo greitį į sunkų sunkumą, jei (intInput == 2) {Serial.print ("Žaidimas nustatytas kaip sunkus ("); Serial.print (intGameSpeedHard); Serial.println ("ms pagreitis)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

šis kodas paleidžiamas tik tada, kai „bolPlay“yra lygus „false“tuštumos cikle

jei „intEnter“nustatytas į 1, tai reiškia, kad įvesties mygtukas buvo paspaustas, o jei jis paspaudžiamas, „bolPlay“nustatoma į „true“ir žaidimas prasideda.

Tada programa nuskaito, kam lygi intInput. jei jis lygus 0, paspaudžiamas pirmasis mygtukas iš kairės, aukštyn į dešinę iki 3. Jei intInput yra lygus 4, mygtukas nespaudžiamas.

Jei paspausite 0-2 mygtukus, žaidimas pakeis sudėtingumą, taip pat pakoreguos žaidimo greičio vertę, o tai reiškia, kad jis įsibėgės greičiau.

Jei paspaudžiamas 3 mygtukas, žaidimas suaktyvins arba išjungs derinimo režimą, kai visa plokštė bus išspausdinta serijiniame monitoriuje, kad būtų lengviau rasti problemų programoje.

11 veiksmas: „ButtonsGame“funkcija

nukopijuokite šį kodą į savo programą

void buttonsGame () {if (intInput! = 4) {// jei paspaudžiamas mygtukas, jei (bolTilePressed == false) {// tik tuo atveju, jei „bolTilePressed“yra klaidingas trigerio veiksmas mygtuko paspaudimui patikrinti bolTilePressed = true; // tada nustatykite „bolTilePressed“į „true“, kad įsitikintumėte, jog jis netyčia nesuaktyvinamas int intLowestTile = 0; // būti nustatytas į plytelę su žemiausia plytele int intCheckedTile = 15; // sekti, kurios plytelės buvo patikrintos, kol (intLowestTile == 0) {// tol, kol nėra nustatyta nieko, patikrinkite plyteles (int i = 0; i 100) {// tol, kol int vėlavimas ne mažesnis kaip 100 intDelay = intDelay - 20; // paimkite iš jo vertę}} else {Serial.println ("Paspaustas neteisingas mygtukas"); žaidimas baigtas(); // kitaip žaidimas baigtas}}}}}

Kodas paleidžiamas tik tada, kai „bolPlay“yra lygus „true“tuštumos cikle.

Panašiai kaip mygtukai Meniu, pagrįstas „intInput“verte, patikrina, ar žaidėjas pataikė į plytelę, ar nepataikė.

Tai daroma einant per arrGame iš apačios į viršų, naudojant ciklo ciklą ir ieškant, kuri eilutė yra žemiausia naudojant nepastebimą plytelę. Tada ji patikrina, ar ta eilutės vieta, atitinkanti paspaustą mygtuką, yra nepastebima plytelė, ar ne, jei ji yra nepastebėta, ji nustato ją lygią 2, o ne 1, o tai reiškia, kad ji bus rodoma kaip @, kitaip ji suaktyvins žaidimą funkcija, kurios dar nesukursime.

Ši funkcija taip pat naudoja kintamąjį „bolTilePressed“, nustatydama jį į „true“, kai paspaudžiamas mygtukas, ir „false“, kai nepaspaudžiamas joks mygtukas. Taip siekiama užtikrinti, kad vartotojas neatsitiktinai neprarastų žaidimo, nes programa manė, kad nuspaudę mygtuką kelis kartus nuspaudė.

12 žingsnis: „GameOver“funkcija

Nukopijuokite šį kodą į savo programą

void gameOver () {Serial.println („Žaidimas baigtas!“); Serial.print ("Jūsų rezultatas buvo:"); Serial.println (intScore); Serial.print ("Jūsų greitis buvo:"); Serial.println (intDelay); bolPlay = klaidinga; }

Tai suaktyvina „checkBottom“arba „buttonsGame“funkcijos ir paleidžia žaidimo pabaigą, nustatant „bolPlay“kaip klaidingą.

Jis taip pat spausdina pranešimą į serijinį monitorių, kuriame pateikiami naudotojų rezultatai, o greičio plytelės buvo pridėtos milisekundėmis.

13 žingsnis: įvesties funkcija

Nukopijuokite šį kodą į savo programą.

void input () {intEnter = digitalRead (btnEnter); // skaityti įveskite // skaitykite, kuris iš kitų įėjimų, arba jei nė vienas nenustatytas į 4, jei (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; }}}}} // serija spausdina įvestis, jei (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// jei nepaspaudžiamas joks mygtukas iš naujo bolTilePressed bolTilePressed = false; }}

Šis kodas naudojamas su mygtukais Žaidimas ir mygtukai Meniu. pagal mygtukus, kuriuos vartotojas paspaudė, nustato „intInput“vertę, arba jei nepaspaudžiamas joks mygtukas, „intInput“nustatoma lygi 4.

Jei nepaspaudžiamas joks mygtukas, „BolTilePressed“iš naujo nustatomas mygtuko „Žaidimas“funkcijai.

Jis taip pat išspausdina pranešimą į serijinį monitorių, kuriame paspaudžiamas mygtukas.

14 žingsnis: „BottomCheck“funkcija

nukopijuokite šį kodą į savo programą.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 stulpeliams if (arrGame [15] == 1) {// jei plytelė yra apačioje Serial.println („Plytelė apačioje“); arrGame [15] = 2; drawBoard (); vėlavimas (400); arrGame [15] = 1; drawBoard (); vėlavimas (400); arrGame [15] = 2; drawBoard (); vėlavimas (400); arrGame [15] = 1; drawBoard (); vėlavimas (400); žaidimas baigtas(); }}}

naudojant kilpą šis kodas tikrina apatinę „arrGame“eilutę, ar nėra bet kokių plyteles (plytelės lygios 1), jei ekrano apačioje yra nepastebima plytelė, ji mirksės ir pradės žaidimą per funkciją.

15 žingsnis: „WriteSerial“funkcija

nukopijuokite šį kodą į savo programą

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

Tai funkcija, po kurios atliekama derinimo parinktis, kurią galima įjungti mygtukais Meniu. Jei „bolSerialBoard“toje funkcijoje nustatyta kaip „true“, ji pereis per „arrGame“ir išspausdins visą plokštę į serijinį monitorių bandymams, naudodama masyvą.

16 žingsnis: užbaigimas

Baigimas!
Baigimas!

Visas jūsų kodas neturėtų būti baigtas ir atrodyti maždaug taip!

/ * * Pavadinimas - fortepijoninės plytelės; Arduino * Iki - Domenic Marulli * Data - 11/ *

/ įtraukti bibliotekas

#įtraukti

// šie kintamieji yra parinktys, kurias galite pakeisti - didesni skaičiai = spartesnis žaidimas

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

// Apibrėžkite kaiščius

#define btn Įveskite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// sukurti LCD objektus (n, ~, n, ~, ~, n)

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

// nustatyti žaidimų masyvą

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

// nustatyti žaidimo kintamuosius

loginis „bolPlay“; // takeliai, jei grotuvas int intScore; // seka žaidėjo rezultatą int intDiff; // tiesiog estetinis dalykas, pasakantis, kokie sunkumai yra žaidime

// nustatyti kintamuosius įvedimui

int intEnter; // seka, jei vartotojas paspaudžia įvesties mygtuką int intInput; // seka, kuriuos mygtukus vartotojas paspaudžia boolean bolTilePressed; // įsitikinkite, kad žaidėjas neatsitiktinai 5 kartus nepaspaudžia mygtuko ir nepralaimi

// nustatyti kintamuosius posūkiui

int intTick; // skaičiuoja milijardus (už kilpą) iki intDelay int intDelay; // laikas, per kurį programa laukia kito posūkio milis int intGameSpeed;

// derinimo parinkčių abit

loginis bolSerialBoard; // kai true, spausdins plokštę nuosekliajame monitoriuje

// sąranka, kuri bus paleista vieną kartą

void setup () {Serial.begin (9600); // paleisti serijinį monitorių // nustatyti kintamuosius bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// kilpa, kuri bus vykdoma kas 10 milisekundžių

void loop () {input (); // patikrinkite, ar žaidžiamas įvestis, jei (bolPlay == true) {if (intTick> = intDelay) {// patikrinkite, ar žaidimas turėtų suktis ar toliau laukti Serial.println ("~~~~~~~ ~~ "); // spausdinti, kad lenta judėtų toliau // writeSerial (); // jei parinktis įjungta, įrašykite lentą į nuoseklius mygtukusGame (); // patikrinti grotuvo įvestis playBoard (); // perkelkite lentą ir pridėkite naują plytelę clearLcd (); // išvalykite LCD prieš piešdami drawBoard (); // nupieškite lentą ant LCD apačiosCheck (); intTick = 0; // iš naujo nustatyti intTick} else {buttonsGame (); // patikrinti grotuvo įvestis clearLcd (); // išvalykite LCD prieš piešdami drawBoard (); // nupiešti lentą ant LCD intTick = intTick + intGameSpeed; // pridėti prie varnelės}} else {clearLcd (); // išvalykite LCD ekranus prieš piešdami pavadinimą (); // rodyti pavadinimo ir balo informacijos mygtukusMeniu (); // skaityti grotuvo įvestį clearBoard (); // užtikrinti visą lentą = 0} delay (10); // trumpam atidėti arduino}

// valo LCD, todėl visos neįvestos ląstelės nebuvo paliktos

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

// piešia lentą ant LCD

void drawBoard () {for (int i = 1; i <= 15; i ++) {// piešti 1 ir 2 koliažus kairiajame LCD ekrane // jei plytelė = 0 nieko nerašo, = 1 rašykite „#“, = 2 parašykite „@“lcdLeft.setCursor (i, 1); // nustatyti į pirmą stulpelį (toliausiai kairėje), jei (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // nustatyti į antrąjį stulpelį (centre kairėje) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // nustatyti į trečiąjį stulpelį (centre dešinėje) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // nustatyti į ketvirtą stulpelį (tolimiausioje dešinėje), jei (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// perkelia lentą žemyn ir pateikia atsitiktinę reikšmę kaip plytelę

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // išvalyti viršutinę eilę arrGame [0] [atsitiktinis (0, 4)] = 1; // nustatykite atsitiktinį tašką viršutinėje eilutėje, kad jis būtų plytelė (int i = 15; i> = 1; i-) {// dirbantis nuo lentos apačios iki viršaus (int ii = 0; ii <= 3; ii ++) {// už kiekvieną kolumą arrGame [ii] = arrGame [i - 1] [ii]; }}}

// nustato visą lentą į 0 ir iš naujo nustato kintamuosius į žaidimą

void clearBoard () {// iš naujo nustatyti erkių ir uždelsimo reikšmes intTick = 0; intDelay = 1000; // eikite per lentą ir nustatykite viską į 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// LCD ekrane rodomas pagrindinis meniu

void title () {// įrašykite pavadinimą į skystųjų kristalų ekraną ir vietą rezultatui lcdRight.setCursor (0, 0); lcdRight.write („Fortepijoninės plytelės“); lcdRight.setCursor (0, 1); lcdRight.write ("Rezultatas:"); // konvertuoti rezultatą į eilutę char strScore [3]; „sprintf“(„strScore“, „%d“, intScore); // rodyti rezultatą ant LCD lcdRight.write (strScore); // pridėti sudėtingai lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lengvas"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kietas"); } // Paspauskite truputį instrukcijos lcdLeft.setCursor (0, 0); lcdLeft.write ("Paspauskite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("pradėti!"); }

// tikrina mygtukus ir ką jiems daryti žaidimo metu

void buttonsMenu () {// kai paspaudžiamas enter, pradėkite žaidimą ir iš naujo nustatykite rezultato reikšmę, jei (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kai paspaudžiamas 3 mygtukas, įjunkite derinimo parinktį spausdinti plokštę nuosekliai, jei (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tiesa; } else {Serial.println („Serial Board Disabled“); bolSerialBoard = klaidinga; }} // nustatyti žaidimo greitį iki lengvo sunkumo, jei (intInput == 0) {Serial.print ("Žaidimas nustatytas kaip lengvas ("); Serial.print (intGameSpeedEasy); Serial.println ("ms pagreitis)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // nustatykite vidutinio sunkumo žaidimo greitį, jei (intInput == 1) {Serial.print ("Žaidimas nustatytas į vidutinę ("); Serial.print (intGameSpeedMedium); Serial.println ("ms pagreitis)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // nustatykite žaidimo greitį į sunkų sunkumą, jei (intInput == 2) {Serial.print ("Žaidimas nustatytas kaip sunkus ("); Serial.print (intGameSpeedHard); Serial.println ("ms pagreitis)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// tikrina mygtukus ir ką jiems daryti žaidimo metu

void buttonsGame () {if (intInput! = 4) {// jei paspaudžiamas mygtukas, jei (bolTilePressed == false) {// tik tuo atveju, jei „bolTilePressed“yra klaidingas trigerio veiksmas mygtuko paspaudimui patikrinti bolTilePressed = true; // tada nustatykite „bolTilePressed“į „true“, kad įsitikintumėte, jog jis netyčia nesuaktyvinamas int intLowestTile = 0; // būti nustatytas į plytelę su žemiausia plytele int intCheckedTile = 15; // sekti, kurios plytelės buvo patikrintos, kol (intLowestTile == 0) {// tol, kol nėra nustatyta nieko, patikrinkite plyteles (int i = 0; i 100) {// tol, kol int vėlavimas ne mažesnis kaip 100 intDelay = intDelay - 20; // paimkite iš jo vertę}} else {Serial.println ("Paspaustas neteisingas mygtukas"); žaidimas baigtas(); // kitaip žaidimas baigtas}}}}}

void gameOver () {

Serial.println („Žaidimas baigtas!“); Serial.print ("Jūsų rezultatas buvo:"); Serial.println (intScore); Serial.print ("Jūsų greitis buvo:"); Serial.println (intDelay); bolPlay = klaidinga; }

// tikrina grotuvo įvestį

void input () {intEnter = digitalRead (btnEnter); // skaityti įveskite // skaitykite, kuris iš kitų įėjimų, arba jei nė vienas nenustatytas į 4, jei (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; }}}}} // serija spausdina įvestis, jei (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// jei nepaspaudžiamas joks mygtukas iš naujo bolTilePressed bolTilePressed = false; }}

// tikrina, ar lentos apačioje nėra gedimo

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 stulpeliams if (arrGame [15] == 1) {// jei plytelė yra apačioje Serial.println („Plytelė apačioje“); arrGame [15] = 2; drawBoard (); vėlavimas (400); arrGame [15] = 1; drawBoard (); vėlavimas (400); arrGame [15] = 2; drawBoard (); vėlavimas (400); arrGame [15] = 1; drawBoard (); vėlavimas (400); žaidimas baigtas(); }}}

// spausdina plokštę į serijinį monitorių, jei „bolSerialBoard“yra teisinga

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

Įvedę visą kodą, įkelkite į savo arduino ir mėgaukitės!

Rekomenduojamas: