Sadržaj:
- Korak 1: Ožičenje
- Korak 2: Izjave o deklaraciji
- Korak 3: Funkcija postavljanja
- Korak 4: Funkcija petlje
- Korak 5: Funkcija ClearLCD
- Korak 6: Funkcija DrawBoard
- Korak 7: Funkcija PlayBoard
- Korak 8: Funkcija ClearBoard
- Korak 9: Naslovna funkcija
- Korak 10: Funkcija menija Buttons
- Korak 11: Funkcija ButtonsGame
- Korak 12: Funkcija GameOver
- Korak 13: Ulazna funkcija
- Korak 14: Funkcija BottomCheck
- Korak 15: Funkcija WriteSerial
- Korak 16: Završetak
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
Pozdrav internet ljudi, ovo će biti o tome kako napraviti ono što DEFINITIVNO nije otmica mobilne igre na arduino uno r3.
pa za početak trebat će vam svi dijelovi koji su sljedeći! 1x Arduino Uno r3 (42 USD)
2x štitnik za LCD tastaturu (19 USD svaki)
Dugmad 5x
5x 220Ω otpornika
28x žice
U redu, kad dobijete sve dijelove, vrijeme je za početak!
Korak 1: Ožičenje
Počnite povezivanjem arduina i prijatelja kako je prikazano na dijagramu, Uvjerite se da su gumbi pravilno povezani, s utorima A0-4 na prizemnoj strani držača za gumbe, ili će arduino umjesto toga pomisliti da se tipke drže pritisnute, a ne samo pritiskom.
Korak 2: Izjave o deklaraciji
Sav kôd ovdje bi trebao proći prije vašeg void postavljanja i void petlje, to je zato što se sve ove varijable i objekti koriste u nekoliko funkcija koje ćemo postaviti.
Započnite stavljanjem:
#include
na vrhu vašeg koda, ovo govori arduinu da koristi biblioteku "LiquidCrystal.h" i funkcije koje su njen dio.
Sljedeći korak je definiranje pinova koje koristimo za naše tipke stavljanjem ovog koda ispod našeg #include:
#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
Definiramo pojmove btnEnter i btn1 do btn 4 kako bismo olakšali čitanje koda ili ga po potrebi promijenili. To znači da kada unesemo btn1 arduino će znati da zapravo mislimo na gumb 15. Iako portove nazivamo portima 15, 16, 17 i 18, oni su na arduinu označeni kao A1 A2 A3 i A4, to je zato što to su portovi koji se koriste posebno za analogne ulaze, iako ih koristimo samo za digitalne ulaze.
Zatim ćemo stvoriti objekte koji će kontrolirati zaslone s tekućim kristalima. Da biste to učinili, stavite ovaj kôd ispod naših definicija
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdLight (2, 3, 4, 5, 6, 7);
Ono što ovo radi govori arduinu da kada pozovemo lcdLeft ili lcdRight mislimo na objekt LiquidCrystal. Brojevi u zagradama govore arduinu koji portovi objekt treba koristiti za slanje poruka na LCD kada koristimo njihove funkcije.
Sada moramo deklarirati varijable stavljanjem sljedećeg bita koda ispod deklaracija objekta:
// ove varijable su opcije koje možete promijeniti - veći brojevi = veća brzina igre upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// postavljanje varijabli za gameboolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar koja govori na kakvim je poteškoćama igra // postavlja varijable za unos int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne dugme 5x i izgubi // postaviti varijable za turn int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zaokreta u milisima int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kada je true, štampaće ploču na serijskom monitoru
Deklariramo varijablu navodeći tip podataka, a zatim ime varijable, npr. int thisIsAnInteger
Logičke varijable, poput bolSerialBoard i bolPlay, mogu imati samo jednu od dvije vrijednosti, true ili false.
Cijela varijabla (int) kao što su intScore i intInput mogu uzeti cijele brojeve kao vrijednosti, poput 1, 5 ili 100.
Neki drugi značajni tipovi podataka koje ovdje ne koristimo su niz, koji je komad teksta, i float, koji je decimalni broj.
Svaka od varijabli ovdje se koristi na nekoliko različitih mjesta u programu, evo sinopsisa onoga što svaka od njih radi
bolPlay govori programu da li treba da se prikaže meni ili da se igra pokrene.
intScore prati rezultat igrača dok je pogađao pločice, intDiff se koristi u glavnom meniju kako bi rekao programu koji dio teksta treba odštampati na LCD -u, intEnter se koristi za obaveštavanje programa ako je pritisnuto dugme za unos (krajnje levo), intInput se koristi da kaže programu koje od ostala 4 dugmeta je pritisnuto.
bolTilePressed se koristi da bi se osiguralo da program čita samo kada je dugme pritisnuto, a ne i kada ga držite.
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium i intGameSpeedHard se koriste za kontrolu brzine igre koja bi se trebala ubrzati na osnovu odabrane težine.
intTick i intDelay se koriste za zaustavljanje programa pri pomicanju ploče svaki put kada se petlja.
bolSerialBoard se koristi da bi vam omogućio da program pošalje ploču na arduino serijski monitor kao niz brojeva za potrebe testiranja.
Konačno je vrijeme da našu ploču proglasimo za niz pomoću ovog koda:
// postavljanje niza igara 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, 0, 0}};
Niz je matrica koja označava bilo koju tačku na kojoj se može pozvati radi matematike ili se može promeniti.
Vaš kôd bi sada trebao izgledati otprilike ovako;
// uključuje biblioteke#include
// ove varijable su opcije koje možete promijeniti - veći brojevi = brže ubrzanje igre
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Definiranje pinova
#define btnUnesite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// kreiranje LCD objekata (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// postavljanje niza igara
int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {101} {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
// postavljanje varijabli za igru
boolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar koja govori na kakvoj je poteškoći igra
// postavljanje varijabli za unos
int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne dugme 5x i izgubi
// postavljanje varijabli za turn
int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zaokreta u milisima int intGameSpeed;
// abit opcija za otklanjanje grešaka
boolean bolSerialBoard; // kada je true, štampaće ploču na serijskom monitoru
Korak 3: Funkcija postavljanja
Petlja za postavljanje je funkcija koju arduino čita samo jednom pri pokretanju.
U petlji za postavljanje samo postavljamo vrijednosti nekoliko naših varijabli jer umjesto da ih postavljamo kao vrijednost prilikom njihovog objavljivanja, to radimo ovdje.
Započnite stavljanjem ovog koda u svoj Void Setup.
bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
Svaka linija samo postavlja varijablu na vrijednost.
bolPlay je postavljen na false tako da igra ne počinje igrati.
intScore je postavljen na 0, jer prirodno vaš rezultat počinje s 0.
intTick počinje na 0 jer program trenutno ne broji ništa.
intDelay je postavljeno na 1000 jer je to stopa kojom pločice počinju.
intDiff je samo asketska stvar tako da program zna šta treba napisati za poteškoće u igri.
intGameSpeed je postavljen na bilo koji intGameSpeedMedium, što znači da je postavljen na srednjoj težini.
Zatim stavite ovaj kôd u Postavljanje praznina ispod koda koji ste upravo unijeli.
lcdLeft.begin (16, 2); lcdRight.begin (16, 2);
Serial.begin (9600);
Ovo govori arduinu da započne komunikaciju s računarom putem serijskog monitora (vidljivo klikom na gumb u gornjem desnom kutu arduino IDE -a).
Vaša postavka Void sada bi trebala izgledati otprilike ovako!
void setup () {Serial.begin (9600); // pokretanje serijskog monitora // postavljanje varijabli bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // započinjemo lcd -ov lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
Korak 4: Funkcija petlje
Funkciju petlje arduino pokreće svaku iteraciju arduina.
Kopirajte sljedeći kôd u svoju Void petlju.
void loop () {input (); // provjeravamo da li se igra unos if (bolPlay == true) {if (intTick> = intDelay) {// provjeravamo treba li igra odigrati potez ili nastaviti čekati Serial.println ("~~~~~~~ ~~ "); // ispis za označavanje kretanja ploče // writeSerial (); // ako je opcija omogućena, upišite ploču u serijske dugmadGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistiti LCD -ove prije crtanja drawBoard (); // iscrtajte ploču na dc -u bottomCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo ima li ulaza igrača clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj u oznaku}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i info dugmadiMenu (); // čita unos playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgodimo arduino za kratki trenutak}
kada je bolPlay jednako true, to znači da se igra i svi kodovi za vrijeme igranja trebaju biti pokrenuti, ali samo želimo da ploča doda novu pločicu i pomakne se prema dolje kada je intTick veći od našeg intDelay, u protivnom i dalje želimo dopustiti korisniku da pritisne dugme da udari u pločicu i da intTick poveća brzinu.
Većina ovog koda koristi funkcije koje tek trebamo izraditi, a mi ćemo ih napraviti u sljedećim koracima. Svrha ovih funkcija je sljedeća.
Unos čita tipke koje je korisnik pritisnuo.
buttonGame kontroliše šta tasteri rade dok su u igri, a ne u meniju
playBoard dodaje novu ploču na ploču, a zatim pomiče sve na ploči za jedan razmak
clearLCD čisti LCD -e kako bi se pobrinuo da ne ostanu duhovi iza pločica
drawBoard prolazi kroz arrGame i ispisuje ga na LCD -u
clearBoard briše cijelu arrGame kada igra nije u igri
bottomCheck provjerava da li je dno arrGame u kvaru
title prikazuje naslov igre i podatke o rezultatima kada se nalazi na meniju
Meni dugmadi kontroliše šta unosi korisnika rade u meniju.
gameOver je još jedna funkcija, iako se ovdje ne poziva jer se umjesto toga poziva u funkcijama bottomCheck i buttonsGame.
Korak 5: Funkcija ClearLCD
da bismo stvorili funkciju započinjemo dodavanjem ovoga kodu
void functionName () {
}
"functionName" može biti bilo što, sve dok već ne postoji.
Kopirajte ovaj kôd u svoj 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 (""); }}}
ovo prolazi kroz cijeli niz koristeći 2 odbrojane petlje za prolazak kroz svaku točku na LCD -ima i upis razmaka.
Bez vraćanja na ništa, LCD -i će zadržati sve što je prethodno napisano
Korak 6: Funkcija DrawBoard
kopirajte ovaj kôd u svoj program
void drawBoard () {for (int i = 1; i <= 15; i ++) {// nacrtajte dogovore 1 i 2 na lijevom LCD -u // ako je pločica = 0 ništa ne napišite, = 1 upišite "#", = 2 upišite "@" lcdLeft.setCursor (i, 1); // postavljeno na prvi stupac (krajnje lijevo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // postavlja se na drugi stupac (lijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno desno) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // postavljeno na četvrti stupac (najdalje desno) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.pisati("@");} } }
ovo koristi petlju za prolazak kroz svaki red ploče, a zatim provjerava je li bilo koji stupac u retku jednak 1 ili 2, na temelju toga zatim ispisuje na LCD -u ili hashtag, za pločicu koja tek treba biti hit, ili @ za pločicu pogotka.
Korak 7: Funkcija PlayBoard
kopirajte ovaj kôd u svoj program.
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // obriši gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu tačku u gornjem redu za pločicu (int i = 15; i> = 1; i-) {// koja radi od dna ploče do vrha za (int ii = 0; ii <= 3; ii ++) {// za svaki collum arrGame [ii] = arrGame [i - 1] [ii]; }}}
ovaj kôd započinje brisanjem cijelog gornjeg reda na 0 ili bez pločice, a zatim postavlja jednu slučajnu pločicu na 1 i poništava pločicu.
Zatim prolazi kroz prebrojanu petlju u obrnutom smjeru, od 15 do 1, postavljajući red na jednako onoliko koliko je redak iznad njega jednak, čineći da se ploča pomakne prema dolje LCD -a
Korak 8: Funkcija ClearBoard
kopirajte ovaj kôd u svoj program.
void clearBoard () {// resetiranje vrijednosti klika i kašnjenja intTick = 0; intDelay = 1000; // prođite kroz ploču i postavite sve na 0 za (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
Ovaj kôd se pokreće kada se igra ne igra kako bi se osiguralo da je cijela arrGame postavljena na 0 ili bez pločica, koristeći prebrojane petlje za prolazak kroz niz.
Kod također resetira vrijednosti intDelay i intTick.
Korak 9: Naslovna funkcija
kopirajte sljedeći kôd u svoj program
void title () {// upis naslova na LCD i prostor za rezultat lcdRight.setCursor (0, 0); lcdRight.write ("Piano Tiles"); lcdRight.setCursor (0, 1); lcdRight.write ("Score:"); // pretvara rezultat u niz char strScore [3]; sprintf (strScore, "%d", intScore); // prikaz rezultata na LCD -u lcdRight.write (strScore); // dodamo teškoće lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lako"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Pritisnite malo instrukcije lcdLeft.setCursor (0, 0); lcdLeft.write ("Pritisnite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("za početak!"); }
Ovaj kôd zapisuje naslov igre i rezultat na LCD -e, to radi govoreći LCD -u gdje da počne pisati pomoću LCD.setCursor, a zatim upisuje niz u LCD.write.
Nova varijabla je također stvorena ovdje, strScore, koristi se za pretvaranje intScore u niz podataka ili niz podataka pomoću funkcije sprintf.
ovdje se koristi i intDiff, na osnovu svojih vrijednosti ispisuje različite opcije težine.
Korak 10: Funkcija menija Buttons
umetnite sljedeći kôd u svoj program
void buttonsMenu () {// kada se pritisne enter započne igru i poništi vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne dugme 3, uključite opciju otklanjanja grešaka za štampanje ploče serijski if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serijska ploča aktivna"); bolSerialBoard = true; } else {Serial.println ("Serijska ploča onemogućena"); bolSerialBoard = false; }} // brzinu igre postavite na laku poteškoću if (intInput == 0) {Serial.print ("Igra je postavljena na easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ubrzanje)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // postavite brzinu igre na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // postavite brzinu igre na tešku poteškoću if (intInput == 2) {Serial.print ("Igra je postavljena na tvrdu ("); Serial.print (intGameSpeedHard); Serial.println ("ms ubrzanje)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
ovaj kôd se pokreće samo ako je bolPlay jednako false u void petlji
ako je intEnter postavljeno na 1, to znači da je tipka enter pritisnuta, ako je pritisnuta, program postavlja bolPlay na true i igra počinje.
Program tada čita čemu je intInput jednak. ako je jednako 0, prvo dugme s lijeve strane se pritisne, ide gore do 3. Ako je intInput jednako 4, ne pritiska se dugme.
ako se pritisnu gumbi 0-2 igra mijenja težinu, također prilagođavajući vrijednost brzine igre, što znači da će se ubrzati brže.
ako se pritisne tipka 3 igra će aktivirati ili deaktivirati način otklanjanja grešaka gdje se cijela ploča ispisuje na serijskom monitoru radi lakšeg pronalaženja problema u programu.
Korak 11: Funkcija ButtonsGame
kopirajte sljedeći kôd u svoj program
void buttonsGame () {if (intInput! = 4) {// ako je dugme pritisnuto if (bolTilePressed == false) {// samo ako je bolTilePressed lažna radnja okidača za proveru dugmeta pritisnite bolTilePressed = true; // zatim postavite bolTilePressed na true kako biste bili sigurni da se ne aktivira ponovo akcidilly int intLowestTile = 0; // postavlja se na pločicu sa najnižom pločicom int intCheckedTile = 15; // da pratimo koje su pločice provjerene dok (intLowestTile == 0) {// sve dok nije postavljeno na bilo šta provjerava pločice (int i = 0; i 100) {// sve dok je int kašnjenje nije manje od 100 intDelay = intDelay - 20; // preuzimamo vrijednost iz nje}} else {Serial.println ("Pogrešno pritisnuto dugme"); gameOver (); // u protivnom igra je gotova}}}}}
Kôd se pokreće samo ako je bolPlay jednako true u void petlji.
Kao i gumbiMenu na osnovu vrijednosti intInput provjerava je li igrač pogodio pločicu ili je promašio.
To se postiže prolaskom kroz arrGame odozdo prema gore pomoću while petlje za traženje reda koji je najniži sa unhit pločicom. Zatim provjerava je li mjesto u tom retku koje odgovara pritisnutom gumbu unhit tile ili nije, ako je unhit postavlja ga na jednako 2 umjesto 1, što znači da će se prikazati kao @, u protivnom pokreće igru Over funkciju koju tek trebamo stvoriti.
Ova funkcija također koristi varijablu bolTilePressed postavljajući je na true kada je dugme pritisnuto i false ako nijedno dugme nije pritisnuto. Ovo služi kako bi se osiguralo da korisnik slučajno ne izgubi igru jer je program mislio da su pritisnuli dugme više puta kada su ga držali pritisnutog.
Korak 12: Funkcija GameOver
Kopirajte sljedeći kôd u svoj program
void gameOver () {Serial.println ("Igra je završena!"); Serial.print ("Vaš rezultat je bio:"); Serial.println (intScore); Serial.print ("Vaša brzina je bila:"); Serial.println (intDelay); bolPlay = false; }
Ovo se pokreće funkcijama checkBottom ili buttonGame i pokreće kraj igre postavljanjem bolPlay na false.
On također ispisuje poruku na serijskom monitoru radi ocjene korisnika, a brzinske pločice dodane su u milisekundama.
Korak 13: Ulazna funkcija
Kopirajte sljedeći kôd u svoj program.
void input () {intEnter = digitalRead (btnEnter); // čitaj enter // čita koji od ostalih ulaza, ili ako nijedan nije postavljen 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; }}}} // serijski ispis ulaza if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedno dugme reset bolTilePressed bolTilePressed = false; }}
Ovaj kôd se koristi sa funkcijama tasteraIgra i dugmićiMeni. na osnovu dugmadi koje je korisnik pritisnuo postavlja vrijednost intInput ili ako nije pritisnuto nijedno dugme postavlja intInput na 4.
Ako se ne pritisne nijedno dugme, ovdje se bolTilePressed resetira za funkciju dugmeta Igra.
Takođe štampa poruku na serijskom monitoru na kojem je pritisnuto dugme.
Korak 14: Funkcija BottomCheck
kopirajte sljedeći kôd u svoj program.
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// za 4 stupca if (arrGame [15] == 1) {// ako je pločica na dnu Serial.println ("Pločica na dnu"); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); gameOver (); }}}
pomoću petlje ovaj kôd provjerava ima li donji red arrGame -a ima li nepokrivenih pločica (pločice jednake 1), ako postoji unhit pločica pri dnu ekrana, bljeskat će pločicu, a zatim pokrenuti funkciju preko igre.
Korak 15: Funkcija WriteSerial
kopirajte sljedeći kôd u svoj 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 (""); }}}
Ovo je funkcija koju prati opcija otklanjanja grešaka koja se može omogućiti u funkciji dugmićiMeni. Ako je bolSerialBoard postavljen na true u toj funkciji, on će proći kroz arrGame i ispisati cijelu ploču u serijski monitor radi testiranja pomoću niza.
Korak 16: Završetak
Sav vaš kôd ne bi trebao biti potpun i izgledati ovako!
/ * * Naziv - Piano Tiles; Arduino * Autor - Domenic Marulli * Datum - 11/ *
/ uključi biblioteke
#include
// ove varijable su opcije koje možete promijeniti - veći brojevi = brže ubrzanje igre
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Definiranje pinova
#define btnUnesite A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// kreiranje LCD objekata (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// postavljanje niza igara
int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {101} {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
// postavljanje varijabli za igru
boolean bolPlay; // prati ako je igrač int intScore; // prati rezultat igrača int intDiff; // samo estetska stvar koja govori na kakvoj je poteškoći igra
// postavljanje varijabli za unos
int intEnter; // prati ako korisnik pritisne tipku enter int intInput; // prati koje tipke korisnik pritisne boolean bolTilePressed; // osigurati da igrač slučajno ne pritisne dugme 5x i izgubi
// postavljanje varijabli za turn
int intTick; // broji milione (po petlji) do intDelay int intDelay; // vrijeme čekanja programa do sljedećeg zaokreta u milisima int intGameSpeed;
// abit opcija za otklanjanje grešaka
boolean bolSerialBoard; // kada je true, štampaće ploču na serijskom monitoru
// postavljanje koje će se jednom pokrenuti
void setup () {Serial.begin (9600); // pokretanje serijskog monitora // postavljanje varijabli bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // započinjemo lcd -ov lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
// petlja koja će se izvoditi svakih 10 milisekona
void loop () {input (); // provjeravamo da li se igra unos if (bolPlay == true) {if (intTick> = intDelay) {// provjeravamo treba li igra odigrati potez ili nastaviti čekati Serial.println ("~~~~~~~ ~~ "); // ispis za označavanje kretanja ploče // writeSerial (); // ako je opcija omogućena, upišite ploču u serijske dugmadGame (); // provjeravamo unose igrača playBoard (); // premjestiti ploču i dodati novu pločicu clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // iscrtajte ploču na dc -u bottomCheck (); intTick = 0; // resetiranje intTick} else {buttonsGame (); // provjeravamo ima li ulaza igrača clearLcd (); // očistite LCD -ove prije crtanja drawBoard (); // nacrtajte ploču na lcd -ovom intTick = intTick + intGameSpeed; // dodaj u oznaku}} else {clearLcd (); // očistiti LCD -ove prije iscrtavanja naslova (); // prikaz naslova i info dugmadiMenu (); // čita unos playera clearBoard (); // osigurati cijelu ploču = 0} kašnjenje (10); // odgodimo arduino za kratki trenutak}
// čisti LCD, tako da sve unete ćelije nisu ostavljene tamo
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 (""); }}}
// izvlači ploču na lcd -ove
void drawBoard () {for (int i = 1; i <= 15; i ++) {// nacrtajte dogovore 1 i 2 na lijevom LCD -u // ako je pločica = 0 ništa ne napišite, = 1 upišite "#", = 2 upišite "@" lcdLeft.setCursor (i, 1); // postavljeno na prvi stupac (krajnje lijevo) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // postavlja se na drugi stupac (lijevo u sredini) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // postavljeno na treći stupac (desno desno) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // postavljeno na četvrti stupac (najdalje desno) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.pisati("@");} } }
// pomiče ploču prema dolje i postavlja slučajnu vrijednost kao pločicu
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // obriši gornji red arrGame [0] [random (0, 4)] = 1; // postavljamo slučajnu tačku u gornjem redu za pločicu (int i = 15; i> = 1; i-) {// koja radi od dna ploče do vrha za (int ii = 0; ii <= 3; ii ++) {// za svaki collum arrGame [ii] = arrGame [i - 1] [ii]; }}}
// postavlja cijelu ploču na 0 i vraća varijable na predigru
void clearBoard () {// resetiranje vrijednosti klika i kašnjenja intTick = 0; intDelay = 1000; // prođite kroz ploču i postavite sve na 0 za (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
// prikazuje glavni meni na LCD -u
void title () {// upis naslova na LCD i prostor za rezultat lcdRight.setCursor (0, 0); lcdRight.write ("Piano Tiles"); lcdRight.setCursor (0, 1); lcdRight.write ("Score:"); // pretvara rezultat u niz char strScore [3]; sprintf (strScore, "%d", intScore); // prikaz rezultata na LCD -u lcdRight.write (strScore); // dodamo teškoće lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Lako"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Pritisnite malo instrukcije lcdLeft.setCursor (0, 0); lcdLeft.write ("Pritisnite Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("za početak!"); }
// provjerava gumbe i što učiniti s njima dok je izvan igre
void buttonsMenu () {// kada se pritisne enter započne igru i poništi vrijednost rezultata ako (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kada se pritisne dugme 3, uključite opciju otklanjanja grešaka za štampanje ploče serijski if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serijska ploča aktivna"); bolSerialBoard = true; } else {Serial.println ("Serijska ploča onemogućena"); bolSerialBoard = false; }} // brzinu igre postavite na laku poteškoću if (intInput == 0) {Serial.print ("Igra je postavljena na easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ubrzanje)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // postavite brzinu igre na srednju težinu if (intInput == 1) {Serial.print ("Igra je postavljena na medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ubrzanje)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // postavite brzinu igre na tešku poteškoću if (intInput == 2) {Serial.print ("Igra je postavljena na tvrdu ("); Serial.print (intGameSpeedHard); Serial.println ("ms ubrzanje)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
// provjerava gumbe i što učiniti s njima dok ste u igri
void buttonsGame () {if (intInput! = 4) {// ako je dugme pritisnuto if (bolTilePressed == false) {// samo ako je bolTilePressed lažna radnja okidača za proveru dugmeta pritisnite bolTilePressed = true; // zatim postavite bolTilePressed na true kako biste bili sigurni da se ne aktivira ponovo akcidilly int intLowestTile = 0; // postavlja se na pločicu sa najnižom pločicom int intCheckedTile = 15; // da pratimo koje su pločice provjerene dok (intLowestTile == 0) {// sve dok nije postavljeno na bilo šta provjerava pločice (int i = 0; i 100) {// sve dok je int kašnjenje nije manje od 100 intDelay = intDelay - 20; // preuzimamo vrijednost iz nje}} else {Serial.println ("Pogrešno pritisnuto dugme"); gameOver (); // u protivnom igra je gotova}}}}}
void gameOver () {
Serial.println ("Igra je završena!"); Serial.print ("Vaš rezultat je bio:"); Serial.println (intScore); Serial.print ("Vaša brzina je bila:"); Serial.println (intDelay); bolPlay = false; }
// provjerava unos igrača
void input () {intEnter = digitalRead (btnEnter); // čitaj enter // čita koji od ostalih ulaza, ili ako nijedan nije postavljen 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; }}}} // serijski ispis ulaza if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ako se ne pritisne nijedno dugme reset bolTilePressed bolTilePressed = false; }}
// provjerava greške na dnu ploče
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// za 4 stupca if (arrGame [15] == 1) {// ako je pločica na dnu Serial.println ("Pločica na dnu"); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); arrGame [15] = 2; drawBoard (); kašnjenje (400); arrGame [15] = 1; drawBoard (); kašnjenje (400); gameOver (); }}}
// štampa ploču u serijski monitor ako je bolSerialBoard istina
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 (""); }}}
Nakon što unesete sav kôd, postavite ga na svoj arduino i uživajte!