Obsah:

Arduino - klavírne dlaždice: 16 krokov (s obrázkami)
Arduino - klavírne dlaždice: 16 krokov (s obrázkami)

Video: Arduino - klavírne dlaždice: 16 krokov (s obrázkami)

Video: Arduino - klavírne dlaždice: 16 krokov (s obrázkami)
Video: Уроки Ардуино #0 - что такое Arduino, куда подключаются датчики и как питать Ардуино 2024, Júl
Anonim
Arduino - klavírne dlaždice
Arduino - klavírne dlaždice

Ahojte internetoví ľudia, toto bude o tom, ako DEFINITÍVNE vytvoriť rip z mobilnej hry na arduino uno r3.

takže na začiatok budete potrebovať všetky diely, ktoré sú nasledujúce! 1x Arduino Uno r3 (42 dolárov)

2x štít LCD klávesnice (19 dolárov za kus)

5x tlačidlá

Rezistory 5x 220Ω

28x drôty

Dobre, akonáhle máte všetky diely, je čas začať!

Krok 1: Zapojenie

Elektrické vedenie
Elektrické vedenie
Elektrické vedenie
Elektrické vedenie
Elektrické vedenie
Elektrické vedenie

Začnite zapojením arduina a priateľov podľa schémy, Uistite sa, že sú tlačidlá prepojené správnym smerom, so štrbinami A0-4 na spodnej strane koľajničiek na tlačidlá, alebo si arduino bude namiesto toho myslieť, že tlačidlá sú stále držané, a nie iba stlačením.

Krok 2: Vyhlásenia

Celý kód by tu mal byť pred nastavením prázdnoty a prázdnou slučkou, pretože všetky tieto premenné a objekty sa používajú v niekoľkých funkciách, ktoré nastavíme.

Začnite zadaním:

#zahrnúť

v hornej časti kódu to znamená, že arduino má používať knižnicu „LiquidCrystal.h“a funkcie, ktoré sú jej súčasťou.

Ďalším krokom je definovanie pinov, ktoré používame pre naše tlačidlá, vložením tohto kódu pod naše #include:

#define btnZadajte A0 #definujte btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Pojmy btnEnter a btn1 až btn 4 definujeme, aby sa nám kód ľahšie čítal, alebo v prípade potreby zmeníme. Znamená to, že keď napíšeme btn1, arduino bude vedieť, že v skutočnosti máme na mysli tlačidlo 15. Napriek tomu, že porty voláme porty 15, 16, 17 a 18, na arduine sú označené ako A1 A2 A3 a A4, je to preto, že sú to porty používané špeciálne pre analógové vstupy, aj keď ich používame iba pre digitálne vstupy.

Ďalej vytvoríme objekty, ktoré budú ovládať displeje z tekutých kryštálov. Za týmto účelom vložte tento kód pod naše definície

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

Čo to robí, je arduino, že keď voláme lcdLeft alebo lcdRight, máme na mysli objekt LiquidCrystal. Čísla v priložených zátvorkách informujú arduino, ktoré porty by mal objekt používať na odosielanie správ na LCD displej, keď používame ich funkcie.

Teraz musíme deklarovať premenné vložením nasledujúceho kódu pod deklarácie objektov:

// tieto premenné sú možnosti, ktoré môžete zmeniť - vyššie čísla = rýchlejšie zrýchlenie hry intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// nastavenie premenných pre gameboolean bolPlay; // sleduje, ak prehrávač int intScore; // sleduje skóre hráča int intDiff; // len estetická vec, ktorá hovorí, na akej obtiažnosti je hra // nastavenie premenných pre vstup int intEnter; // sleduje, ak užívateľ stlačí tlačidlo enter int intInput; // sleduje, ktoré tlačidlá používateľ stlačí boolean bolTilePressed; // zaistite, aby hráč omylom nestlačil tlačidlo 5x a prehral // nastavenie premenných pre turn int intTick; // počíta počítadlá (na slučku) do intDelay int intDelay; // čas, ktorý program čaká na ďalšie otočenie v milis int intGameSpeed; // zrušenie možností ladenia boolean bolSerialBoard; // keď true, doska sa vytlačí v sériovom monitore

Proměnnú deklarujeme uvedením dátového typu a potom názvu premennej, napr. int thisIsAnInteger

Booleovské premenné, ako napríklad bolSerialBoard a bolPlay, môžu mať iba jednu z dvoch hodnôt, true alebo false.

Celočíselná premenná (int), ako napríklad intScore a intInput, môže mať hodnotu ako celé číslo, napríklad 1, 5 alebo 100.

Niektoré ďalšie pozoruhodné typy údajov, ktoré tu nepoužívame, sú reťazec, ktorý je kusom textu, a float, čo je desatinné číslo.

Každá z premenných tu program používa na niekoľkých rôznych miestach. Tu je prehľad toho, čo každá z nich robí

bolPlay informuje program, či sa má zobraziť ponuka alebo či má byť spustená skutočná hra.

intScore sleduje skóre hráča po dopade na dlaždice, intDiff sa používa v hlavnej ponuke na informovanie programu, aký kúsok textu má vytlačiť na LCD, intEnter slúži na informovanie programu, či je stlačené tlačidlo Enter (úplne vľavo), intInput slúži na informovanie programu, ktoré z ďalších 4 tlačidiel je stlačené.

bolTilePressed sa používa na zaistenie toho, aby sa program čítal iba pri stlačení tlačidla, a nie pri jeho podržaní.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium a intGameSpeedHard slúžia na ovládanie toho, ako rýchlo sa má hra zrýchliť podľa toho, aká obtiažnosť je zvolená.

intTick a intDelay sa používajú na zastavenie programu v pohybe po doske vždy, keď sa zacyklí.

BolSerialBoard sa používa na to, aby vám umožnil program odoslať dosku na sériový monitor arduina ako sériu čísel na testovacie účely.

Nakoniec je načase deklarovať našu dosku ako pole pomocou tohto kódu:

// nastavenie poľa hry 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}};

Pole je matica, v ktorej je možné pre matematiku vyvolať alebo zmeniť ľubovoľný bod.

Váš kód by teraz mal vyzerať asi takto;

// zahrnutie knižníc#zahrnúť

// tieto premenné sú možnosti, ktoré môžete zmeniť - vyššie čísla = rýchlejšie zrýchlenie hry

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

// Definujte piny

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

// vytváranie objektov LCD (n, ~, n, ~, ~, n)

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

// nastavenie herného poľa

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

// nastavenie premenných pre hru

booleovský bolPlay; // sleduje, ak prehrávač int intScore; // sleduje skóre hráča int intDiff; // len estetická vec, ktorá hovorí, na akej obtiažnosti je hra

// nastavenie premenných pre vstup

int intEnter; // sleduje, ak užívateľ stlačí tlačidlo enter int intInput; // sleduje, ktoré tlačidlá používateľ stlačí boolean bolTilePressed; // zaistite, aby hráč omylom nestlačil tlačidlo 5x a prehral

// nastavenie premenných pre turn

int intTick; // počíta počítadlá (na slučku) do intDelay int intDelay; // čas, ktorý program čaká na ďalšie otočenie v milis int intGameSpeed;

// ukončenie možností ladenia

booleovský bolSerialBoard; // keď true, doska sa vytlačí v sériovom monitore

Krok 3: Funkcia nastavenia

Nastavovacia slučka je funkcia, ktorú arduino číta iba raz, keď sa pôvodne spustí.

V nastavovacej slučke práve nastavujeme hodnoty niekoľkých našich premenných, pretože namiesto toho, aby sme im pri deklarácii nastavovali hodnotu, robíme to tu.

Začnite vložením tohto kódu do nastavenia prázdnoty.

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

Každý riadok iba nastavuje premennú na hodnotu.

BolPlay je nastavený na hodnotu false, aby sa hra nezačala hrať.

intScore je nastavený na 0, pretože vaše skóre prirodzene začína na 0.

intTick začína na 0, pretože program momentálne nič nepočíta.

intDelay je nastavený na 1000, pretože to je rýchlosť, ktorou dlaždice začínajú.

intDiff je len asketická vec, aby program podľa náročnosti hry vedel, čo napísať.

intGameSpeed je nastavený na čokoľvek, čo je intGameSpeedMedium, čo znamená, že je nastavený na strednú obtiažnosť.

Potom tento kód vložte do nastavenia prázdnoty pod kód, ktorý ste práve vložili.

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

Serial.begin (9600);

To oznámi Arduinu, aby začalo komunikovať s počítačom prostredníctvom sériového monitora (viditeľné kliknutím na tlačidlo v pravom hornom rohu IDE arduina).

Vaše nastavenie prázdnoty by teraz malo vyzerať asi takto!

void setup () {Serial.begin (9600); // spustenie sériového monitora // nastavenie premenných bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

Krok 4: Funkcia slučky

Funkciu slučky spúšťa arduino pri každej iterácii arduina.

Skopírujte nasledujúci kód do prázdnej slučky.

void loop () {vstup (); // skontrolujte, či sa prehráva vstup, ak (bolPlay == true) {if (intTick> = intDelay) {// skontrolujte, či sa má hra hrať na ťah alebo pokračovať v čakaní Serial.println ("~~~~~~~ ~~ "); // tlač na označenie dosky pohybujúcej sa na // writeSerial (); // ak je možnosť zapnutá, zapíšte dosku do sériových tlačidielGame (); // kontrola vstupov hráča playBoard (); // presuňte dosku a pridajte novú dlaždicu clearLcd (); // vyčistite LCD pred kreslením drawBoard (); // nakreslite dosku na lcd's bottomCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // kontrola vstupov hráča clearLcd (); // vyčistite LCD pred kreslením drawBoard (); // nakreslite dosku na lcd's intTick = intTick + intGameSpeed; // pridať do kliešťa}} else {clearLcd (); // vyčistite LCD pred kreslením title (); // zobrazenie tlačidiel informácií o názve a skóreMenu (); // čítať vstup prehrávača clearBoard (); // zaistenie celej dosky = 0} zdržanie (10); // oneskorenie arduina o malú chvíľu}

keď sa bolPlay rovná true, znamená to, že sa hra hrá a mal by byť spustený všetok kód, ktorý hra hrá, ale chceme, aby doska pridala novú dlaždicu a posunula sa nadol, keď je hodnota intTick väčšia ako naša hodnota intDelay, v opačnom prípade chceme používateľovi umožniť stlačením tlačidla zasiahnuť dlaždicu a zvýšiť rýchlosť intTick.

Väčšina tohto kódu používa funkcie, ktoré ešte musíme vykonať, a urobíme ich v ďalších krokoch. Účel týchto funkcií je nasledujúci.

Vstup číta, ktoré tlačidlá používateľ stlačil.

buttonsGame ovláda, čo tlačidlá robia v hre, a nie v ponuke

PlayBoard pridá na hraciu plochu novú dlaždicu a potom presunie všetko na doske o jedno miesto nižšie

clearLCD čistí LCD displeje a zaisťuje, že za dlaždicami nezostanú žiadni duchovia

DrawBoard prejde cez arrGame a vytlačí ho na LCD

clearBoard vymaže celý arrGame, keď hra nie je v hre

bottomCheck kontroluje v spodnej časti arrGame stav poruchy

titul zobrazuje v hre názov hry a skóre

ponuka tlačidiel ovláda, čo robia vstupy používateľa, keď sú v ponuke.

gameOver je ďalšou funkciou, aj keď sa tu nevolá, ale namiesto toho sa nazýva funkciami bottomCheck a buttonsGame.

Krok 5: Funkcia ClearLCD

na vytvorenie funkcie začneme jej pridaním do kódu

void functionName () {

}

„názov funkcie“môže byť čokoľvek, pokiaľ ešte neexistuje.

Skopírujte tento kód do svojho programu:

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

toto beží celým poľom pomocou 2 spočítaných slučiek, ktoré prejdú každým bodom na LCD a napíšu medzeru.

Bez toho, aby sa LCD displej resetoval na nič, zachová všetko, čo bolo predtým napísané

Krok 6: Funkcia DrawBoard

skopírujte tento kód do svojho programu

void drawBoard () {for (int i = 1; i <= 15; i ++) {// nakreslite naľavo LCD stĺpce 1 a 2 // ak dlaždica = 0 nenapíše nič, = 1 napíše „#“, = 2 napísať "@" lcdLeft.setCursor (i, 1); // nastavený na prvý stĺpček (najviac vľavo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // nastavený na druhý stĺpček (vľavo v strede) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // nastavený na tretí stĺpček (v strede vpravo) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // nastavený na štvrtý stĺpček (úplne vpravo) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

toto používa slučku na prechádzanie každým riadkom dosky, potom skontroluje, či sa niektorý stĺpec v riadku rovná 1 alebo 2, na základe toho potom vytlačí na LCD displej buď hashtag, zatiaľ čo dlaždica ešte nie je hit, alebo @ pre dlaždicu zásahu.

Krok 7: Funkcia PlayBoard

skopírujte tento kód do svojho programu.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // vymazanie horného riadku arrGame [0] [náhodný (0, 4)] = 1; // nastavenie náhodného bodu v hornom riadku ako dlaždice (int i = 15; i> = 1; i-) {// práca od spodnej časti dosky po vrchol pre (int ii = 0; ii <= 3; ii ++) {// pre každú kolóniu arrGame [ii] = arrGame [i - 1] [ii]; }}}

tento kód začína vymazaním celého horného riadka na 0 alebo žiadna dlaždica a potom nastaví jednu náhodnú dlaždicu na 1 a dlaždicu zruší.

Potom prejde počítanou slučkou v opačnom poradí, od 15 do 1, pričom riadok sa nastaví na rovnaký, ako sa rovná riadku nad ním, čím sa doska posunie nadol po displeji LCD.

Krok 8: Funkcia ClearBoard

skopírujte tento kód do svojho programu.

void clearBoard () {// reset hodnôt tick a delay intTick = 0; intDelay = 1000; // prejdi doskou a nastav všetko na 0 pre (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Tento kód sa spustí, keď sa hra nehrá, aby ste sa presvedčili, že celý arrGame je nastavený na 0 alebo žiadne dlaždice pomocou spočítaných slučiek na prechádzanie poľom.

Kód tiež vynuluje hodnoty intDelay a intTick.

Krok 9: Funkcia názvu

skopírujte nasledujúci kód do svojho programu

neplatný názov () {// napíšte názov na LCD a miesto pre skóre lcdRight.setCursor (0, 0); lcdRight.write ("Klavírne dlaždice"); lcdRight.setCursor (0, 1); lcdRight.write ("Skóre:"); // preveďte skóre na reťazec char strScore [3]; sprintf (strScore, "%d", intScore); // zobrazenie skóre na LCD lcdRight.write (strScore); // pridajte diffictuly lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Jednoduché"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Trochu stlačte príkaz lcdLeft.setCursor (0, 0); lcdLeft.write ("stlačte Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write („začať!“); }

Tento kód napíše na LCD obrazovku názov hry a skóre, a to tak, že pomocou LCD.setCursor oznámi LCD, kde má začať písať, a potom napíše reťazec do LCD.write.

Tu sa tiež vytvorí nová premenná strScore, ktorá sa používa na konverziu intScore na dátový typ reťazec alebo char pomocou funkcie sprintf.

Tu sa používa aj intDiff, na základe svojich hodnôt vytlačí rôzne možnosti obtiažnosti.

Krok 10: Funkcia ponuky Buttons

vložte do programu nasledujúci kód

neplatné tlačidláMenu () {// po stlačení klávesu Enter spustíte hru a vynulujete hodnotu skóre, ak (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // keď je stlačené tlačidlo 3 zapnúť ladenie možnosť tlače dosky na sériovú linku if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = false; }} // nastavte rýchlosť hry na jednoduchú obtiažnosť, ak (intInput == 0) {Serial.print ("Hra je nastavená na ľahkú ("); Serial.print (intGameSpeedEasy); Serial.println ("akcelerácia ms)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // nastavte rýchlosť hry na strednú obtiažnosť, ak (intInput == 1) {Serial.print ("hra nastavená na strednú ("); Serial.print (intGameSpeedMedium); Serial.println ("akcelerácia ms)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // nastavte rýchlosť hry na ťažkú obtiažnosť, ak (intInput == 2) {Serial.print ("Hra je nastavená na tvrdú ("); Serial.print (intGameSpeedHard); Serial.println ("akcelerácia ms)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

tento kód sa spustí iba vtedy, keď sa bolPlay v neplatnej slučke rovná false

ak je intEnter nastavený na 1, znamená to, že bolo stlačené tlačidlo Enter, ak je stlačené, program nastaví bolPlay na true a hra sa spustí.

Program potom prečíta, čomu sa rovná intInput. ak sa rovná 0, stlačí sa prvé tlačidlo zľava, pričom sa prejde doprava až na 3. Ak sa intInput rovná 4, nestlačí sa žiadne tlačidlo.

ak sú stlačené tlačidlá 0-2, hra zmení obtiažnosť a upraví aj hodnotu rýchlosti hry, čo znamená, že sa bude zrýchľovať rýchlejšie.

ak je stlačené tlačidlo 3, hra aktivuje alebo deaktivuje režim ladenia, kde sa celá doska vytlačí na sériovom monitore, aby pomohla pri hľadaní problémov v programe.

Krok 11: Funkcia ButtonsGame

skopírujte nasledujúci kód do svojho programu

neplatné buttonsGame () {if (intInput! = 4) {// ak je stlačené tlačidlo, ak (bolTilePressed == false) {// iba ak bolTilePressed je falošná spúšťacia akcia na kontrolu stlačenia tlačidla bolTilePressed = true; // potom nastavte bolTilePressed na true, aby ste sa uistili, že nie je kyslo spustený znova int intLowestTile = 0; // nastaví sa na dlaždicu s najnižšou dlaždicou int intCheckedTile = 15; // ak chcete sledovať, ktoré dlaždice boli skontrolované, kým (intLowestTile == 0) {// pokiaľ nie je nastavené nič, kontrolujte dlaždice (int i = 0; i 100) {// tak dlho, ako int oneskorenie nie je nižšie ako 100 intDelay = intDelay - 20; // z toho vezmite hodnotu}} else {Serial.println ("Je stlačené nesprávne tlačidlo"); koniec hry(); // inak koniec hry}}}}}

Kód sa spustí iba vtedy, ak sa bolPlay v neplatnej slučke rovná true.

Rovnako ako tlačidláMenu na základe hodnoty intInput kontroluje, či hráč narazil na dlaždicu alebo ju minul.

To sa deje tak, že prejdete arrGame zdola nahor pomocou slučky while a pomocou dlaždice Unit vyhľadáte, ktorý riadok je najnižší. Potom skontroluje, či miesto v tomto riadku zodpovedajúce stlačenému tlačidlu je dlaždica zrušiť alebo nie, ak nie je, nastaví ju na hodnotu 2 namiesto 1, čo znamená, že sa zobrazí ako @, v opačnom prípade spustí hru. funkciu, ktorú ešte len vytvoríme.

Táto funkcia tiež používa premennú bolTilePressed tak, že ju nastaví na hodnotu true pri stlačení tlačidla a na hodnotu false, ak nestlačíte žiadne tlačidlo. To má zaistiť, aby používateľ omylom neprišiel o hru, pretože si program myslel, že stlačili tlačidlo viackrát, keď ho podržali.

Krok 12: Funkcia GameOver

Skopírujte nasledujúci kód do svojho programu

void gameOver () {Serial.println ("Game Over!"); Serial.print ("Vaše skóre bolo:"); Serial.println (intScore); Serial.print ("Vaša rýchlosť bola:"); Serial.println (intDelay); bolPlay = false; }

Toto je spustené funkciami checkBottom alebo buttonsGame a spustí sa koniec hry nastavením bolPlay na hodnotu false.

Tiež vytlačí správu na sériový monitor pre skóre používateľov a dlaždice rýchlosti boli pridané v milisekundách.

Krok 13: Vstupná funkcia

Skopírujte nasledujúci kód do svojho programu.

neplatný vstup () {intEnter = digitalRead (btnEnter); // read enter // prečítaj, ktorý z ostatných vstupov, alebo ak žiadny nie je nastavený na 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; }}}} // sériová tlač vstupov if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ak nie je stlačené žiadne tlačidlo reset bolTilePressed bolTilePressed = false; }}

Tento kód sa používa s funkciami buttonsGame a buttonsMenu. na základe tlačidiel, ktoré používateľ stlačil, nastaví hodnotu intInput, alebo ak nie je stlačené žiadne tlačidlo, nastaví intInput na hodnotu 4.

Ak nie je stlačené žiadne tlačidlo, bolTilePressed sa resetuje pre funkciu buttonsGame.

Tiež vytlačí správu na sériový monitor, na ktorom je stlačené tlačidlo.

Krok 14: Funkcia BottomCheck

skopírujte nasledujúci kód do svojho programu.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for the 4 columns if (arrGame [15] == 1) {// if a tile is at the bottom Serial.println („Dlaždica v spodnej časti“); arrGame [15] = 2; drawBoard (); oneskorenie (400); arrGame [15] = 1; drawBoard (); oneskorenie (400); arrGame [15] = 2; drawBoard (); oneskorenie (400); arrGame [15] = 1; drawBoard (); oneskorenie (400); koniec hry(); }}}

pomocou slučky tento kód skontroluje v dolnom rade arrGame, či neobsahuje dlaždice bez úprav (dlaždice rovnajúce sa 1), ak je v spodnej časti obrazovky dlaždica bez ignorovania, dlaždica bliká a potom spustí funkciu over -game.

Krok 15: Funkcia WriteSerial

skopírujte nasledujúci kód do svojho programu

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

Toto je funkcia, po ktorej nasleduje možnosť ladenia, ktorú je možné povoliť vo funkcii buttonsMenu. Ak je bolSerialBoard v tejto funkcii nastavený na hodnotu true, prejde cez arrGame a vytlačí celú dosku na sériový monitor na testovacie účely pomocou poľa.

Krok 16: Dokončenie

Dokončenie!
Dokončenie!

Celý váš kód by nemal byť úplný a mal by vyzerať asi takto!

/ * * Názov - Klavírne dlaždice; Arduino * Od - Domenic Marulli * Dátum - 11/ *

/ zahŕňajú knižnice

#zahrnúť

// tieto premenné sú možnosti, ktoré môžete zmeniť - vyššie čísla = rýchlejšie zrýchlenie hry

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

// Definujte piny

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

// vytváranie objektov LCD (n, ~, n, ~, ~, n)

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

// nastavenie herného poľa

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

// nastavenie premenných pre hru

booleovský bolPlay; // sleduje, ak prehrávač int intScore; // sleduje skóre hráča int intDiff; // len estetická vec, ktorá hovorí, na akej obtiažnosti je hra

// nastavenie premenných pre vstup

int intEnter; // sleduje, ak užívateľ stlačí tlačidlo enter int intInput; // sleduje, ktoré tlačidlá používateľ stlačí boolean bolTilePressed; // zaistite, aby hráč omylom nestlačil tlačidlo 5x a prehral

// nastavenie premenných pre turn

int intTick; // počíta počítadlá (na slučku) do intDelay int intDelay; // čas, ktorý program čaká na ďalšie otočenie v milis int intGameSpeed;

// ukončenie možností ladenia

booleovský bolSerialBoard; // keď true, doska sa vytlačí v sériovom monitore

// nastavenie, ktoré sa spustí raz

void setup () {Serial.begin (9600); // spustenie sériového monitora // nastavenie premenných bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// cyklus, ktorý sa spustí každých 10 milisekúnd

void loop () {vstup (); // skontrolujte, či sa prehráva vstup, ak (bolPlay == true) {if (intTick> = intDelay) {// skontrolujte, či sa má hra hrať na ťah alebo pokračovať v čakaní Serial.println ("~~~~~~~ ~~ "); // tlač na označenie dosky pohybujúcej sa na // writeSerial (); // ak je možnosť zapnutá, zapíšte dosku do sériových tlačidielGame (); // kontrola vstupov hráča playBoard (); // presuňte dosku a pridajte novú dlaždicu clearLcd (); // vyčistite LCD pred kreslením drawBoard (); // nakreslite dosku na lcd's bottomCheck (); intTick = 0; // reset intTick} else {buttonsGame (); // kontrola vstupov hráča clearLcd (); // vyčistite LCD pred kreslením drawBoard (); // nakreslite dosku na lcd's intTick = intTick + intGameSpeed; // pridať do kliešťa}} else {clearLcd (); // vyčistite LCD pred kreslením title (); // zobrazenie tlačidiel informácií o názve a skóreMenu (); // čítať vstup prehrávača clearBoard (); // zaistenie celej dosky = 0} zdržanie (10); // oneskorenie arduina o malú chvíľu}

// vyčistí LCD, takže v ňom nezostanú žiadne nezadané bunky

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

// nakreslí tabuľu na LCD

void drawBoard () {for (int i = 1; i <= 15; i ++) {// nakreslite naľavo LCD stĺpce 1 a 2 // ak dlaždica = 0 nenapíše nič, = 1 napíše „#“, = 2 napísať "@" lcdLeft.setCursor (i, 1); // nastavený na prvý stĺpček (najviac vľavo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // nastavený na druhý stĺpček (vľavo v strede) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // nastavený na tretí stĺpček (v strede vpravo) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // nastavený na štvrtý stĺpček (úplne vpravo) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// posunie dosku nadol a umiestni náhodnú hodnotu ako dlaždicu

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // vymazanie horného riadku arrGame [0] [náhodný (0, 4)] = 1; // nastavenie náhodného bodu v hornom riadku ako dlaždice (int i = 15; i> = 1; i-) {// práca od spodnej časti dosky po vrchol pre (int ii = 0; ii <= 3; ii ++) {// pre každú kolóniu arrGame [ii] = arrGame [i - 1] [ii]; }}}

// nastaví celú dosku na 0 a resetuje premenné na predohru

void clearBoard () {// reset hodnôt tick a delay intTick = 0; intDelay = 1000; // prejdi doskou a nastav všetko na 0 pre (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// zobrazí hlavnú ponuku na LCD displejoch

neplatný názov () {// napíšte názov na LCD a miesto pre skóre lcdRight.setCursor (0, 0); lcdRight.write ("Klavírne dlaždice"); lcdRight.setCursor (0, 1); lcdRight.write ("Skóre:"); // preveďte skóre na reťazec char strScore [3]; sprintf (strScore, "%d", intScore); // zobrazenie skóre na LCD lcdRight.write (strScore); // pridajte diffictuly lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Jednoduché"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Trochu stlačte príkaz lcdLeft.setCursor (0, 0); lcdLeft.write ("stlačte Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write („začať!“); }

// kontroluje tlačidlá a čo majú robiť, keď sú mimo hry

neplatné tlačidláMenu () {// po stlačení klávesu Enter spustíte hru a vynulujete hodnotu skóre, ak (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // keď je stlačené tlačidlo 3 zapnúť ladenie možnosť tlače dosky na sériovú linku if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = true; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = false; }} // nastavte rýchlosť hry na jednoduchú obtiažnosť, ak (intInput == 0) {Serial.print ("Hra je nastavená na ľahkú ("); Serial.print (intGameSpeedEasy); Serial.println ("akcelerácia ms)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // nastavte rýchlosť hry na strednú obtiažnosť, ak (intInput == 1) {Serial.print ("hra nastavená na strednú ("); Serial.print (intGameSpeedMedium); Serial.println ("akcelerácia ms)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // nastavte rýchlosť hry na ťažkú obtiažnosť, ak (intInput == 2) {Serial.print ("Hra je nastavená na tvrdú ("); Serial.print (intGameSpeedHard); Serial.println ("akcelerácia ms)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// kontroluje tlačidlá a čo majú robiť, keď sú v hre

void buttonsGame () {if (intInput! = 4) {// ak je stlačené tlačidlo, ak (bolTilePressed == false) {// iba ak bolTilePressed je falošná spúšťacia akcia na kontrolu stlačenia tlačidla bolTilePressed = true; // potom nastavte bolTilePressed na true, aby ste sa uistili, že nie je kyslo spustený znova int intLowestTile = 0; // nastaví sa na dlaždicu s najnižšou dlaždicou int intCheckedTile = 15; // ak chcete sledovať, ktoré dlaždice boli skontrolované, kým (intLowestTile == 0) {// pokiaľ nie je nastavené nič, kontrolujte dlaždice (int i = 0; i 100) {// tak dlho, ako int oneskorenie nie je nižšie ako 100 intDelay = intDelay - 20; // z toho vezmite hodnotu}} else {Serial.println ("Je stlačené nesprávne tlačidlo"); koniec hry(); // inak koniec hry}}}}}

neplatná hraOver () {

Serial.println („Hra skončila!“); Serial.print ("Vaše skóre bolo:"); Serial.println (intScore); Serial.print ("Vaša rýchlosť bola:"); Serial.println (intDelay); bolPlay = false; }

// kontroluje vstup hráča

neplatný vstup () {intEnter = digitalRead (btnEnter); // read enter // prečítaj, ktorý z ďalších vstupov, alebo ak žiadny nie je nastavený na 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; }}}} // sériová tlač vstupov if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ak nie je stlačené žiadne tlačidlo reset bolTilePressed bolTilePressed = false; }}

// skontroluje zlyhanie spodnej časti dosky

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for the 4 columns if (arrGame [15] == 1) {// if a tile is at the bottom Serial.println („Dlaždica v spodnej časti“); arrGame [15] = 2; drawBoard (); oneskorenie (400); arrGame [15] = 1; drawBoard (); oneskorenie (400); arrGame [15] = 2; drawBoard (); oneskorenie (400); arrGame [15] = 1; drawBoard (); oneskorenie (400); koniec hry(); }}}

// ak je bolSerialBoard pravdivý, vytlačí dosku na sériový monitor

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

Akonáhle je zadaný celý kód, nahrajte ho do svojho arduina a užívajte si!

Odporúča: