Turinys:
Video: „Arduino OLED Snake“žaidimas: 3 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:46
Sveiki ir sveiki, mūsų instrukcijose, kaip sukurti ir arduino OLED žaidimą, šis projektas atsirado, kai mes bandėme surengti pirmąjį savo žaidimą su arduino, taigi, mes galvojome, kur geriau pradėti nei „nokia classic Snake“(gerai bent jau gyvatės klonas:)).
Ko jums reikės
Prekės
Arduino UNO arba klonas
OLED ekranas
4 diodai
500-1k rezistorius
4 valdiklio mygtukai
Pasyvus Piezo garsinis signalas
neprivaloma
Boldlessless BreadBoard
Atminkite, kad šios nuorodos yra tik pavyzdys
1 žingsnis: grandinė
Aukščiau esančiame paveikslėlyje galite pamatyti mūsų grandinę, mes naudojame kaištį d3 ant arduino kaip pertraukos užklausos kaištį, kad arduino pirmenybę teiktų valdiklio įvesties, kurios yra d4 d5 d6 d7, skaitymui. Grandinės pagrindai yra tai, kad paspaudžiamas krypties mygtukas, kuris pakyla aukštai 5v, tai suaktyvina pertraukimo užklausos kaištį (d3 purpurinė viela) ir atitinkamą krypties kaištį, pertraukimo funkcija iškviečia atnaujinimo krypties funkciją ir šis kodas atitinkamai perkelia gyvatę. 9 kaištis naudojamas kaip garso kaištis, nes tai yra PWM (~ impulso pločio moduliacija), kuris yra tiesiogiai prijungtas prie 5 V pjezo ant + kaiščio, o - grįžta į 0 V/įžeminimą.
(FYI ant arduino uno ir tik d2 ir d3 klonai gali veikti kaip pertraukimo užklausos smeigtukai).
Kryptiniai kaiščiai:
d4 AUKŠTYNAS
d5 RAUSVAS žemyn
d6 Kairė MĖLYNA
d7 Dešinė RUDVA
d9 garsas PILKAS
Kiekvienas mygtukas turi 5 V jungties įvestį ir išvestį, kuri pirmiausia yra prijungta prie atitinkamo skaitmeninio įvesties „arduino“, ta pati kiekvieno mygtuko išvestis yra prijungta prie savo diodo, mes naudojame diodus, kad sustabdytume įtampą, kuri grįžta į kitus mygtukus ir juos įjungdami. Visų 4 diodų katodo (-) gale mes sujungiame juos, kad sukurtume išvesties sankryžą, kuri jungiasi prie d3, o paskui per rezistorių į 0v/žemę, kad žemai ištrauktų arduino kaiščius, kad neliktų plaukiojančių kaiščių, kai jų nėra aktyvuota.
(FYI plaukiojantis kaištis gali gauti fantominę įtampą ir sukelti neįprastą elgesį)
Ekranui vairuoti naudojami 2 analoginiai kaiščiai, tai yra „arduino“aparatinės įrangos „i2c“kaiščiai.
A5 yra prijungtas prie SCL YELLOW
A4 yra prijungtas prie SDA GREEN
+5v ir 0v (žemės) išėjimas iš arduino yra naudojamas kaip visos grandinės, kurią galima maitinti naudojant USB arba telefono įkroviklį, energijos šaltinis.
2 žingsnis: kodas
// ------------------------ ANJAWARE SNAKE žaidimai Padedant tinklo tautoms --------------- -------
#įtraukti
#include // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // ekrano rinkinys (plotis, aukštis) Adafruit_SSD1306 ekranas (128, 64); // apibrėžti įvesties kaiščius tai yra arduino kaiščiai, kurių jie niekada nesikeičia, todėl #define #define INTPIN 3 // tik 2 ir 3 kaiščiai gali būti pertraukiami kaiščiai UNO #define UPPIN 4 // tai yra kaiščiai, prijungti prie atitinkamo jungiklio #define DWNPIN 5 #define LFTPIN 6 #define RHTPIN 7 #define SND 9 // apibrėžti kryptis #define DIRUP 1 // šios vertės yra tai, į ką žiūri „gyvatė“, kad nuspręstų- #define DIRDOWN 2 // kryptimi, kuria gyvatė keliaus # apibrėžti DIRLEFT 3 #define DIRRIGHT 4
// nustatyti mygtuko kintamuosius
// volitile cos mums reikia, kad jis būtų atnaujintas su pertrauka, todėl gali būti bet kokia ciklo vertė
// niekada nėra didesnis nei 4, todėl norint išsaugoti išteklius reikia tik 8 bitų int. nepastovus uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // mes naudojame tai, kad nustatytume tiesą "aptikti", kuria kryptimi spaudžiamas bool butleft = 0; bool butright = 0;
// gyvatės ints
baitų gyvatėPosX [30]; // masyvas, skirtas padaryti gyvatės kūną baitu gyvatėPosY [30];
int gyvatėX = 30; // gyvatės galvos padėtis
int gyvatėY = 30; int snakeSize = 1; // gyvatės dydžio skaičius apsiriboja masyvo dydžiu
// pasaulio ints
uint8_t worldMinX = 0; // tai nustato žaidimų zonos ribas
uint8_t worldMaxX = 128; uint8_t worldMinY = 10; uint8_t worldMaxY = 63;
// rinkti skraną (maistą) ir skrano padėtį
bool scranAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;
// balų kintamieji
ilgas žaidimo rezultatas = 0; ilgas rekordas = 30; // nustatyti aukštą rezultatą į 3 surinkti kaip pradinį tašką
// --------------------------- tai pertrauka atlieka padidėjus įtampai ------------ -------------
void interruptpressed () {delay (150); // nedidelis uždelsimas papildomai apsaugai nuo atšokimo atnaujinta kryptis (); } // ------------------ atnaujinkite krypties vertę paspausdami mygtuką ----------------- void updatedirection () { // Serial.println ("atnaujinimo kryptis"); butup = digitalRead (UPPIN); // patikrinkite, kuri įvestis buvo aukšta, ir nustatykite atitinkamą bool true butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // šie, jei teiginiai pažvelgia į tai, kuris įvestis buvo aukštas, ir įveda atitinkamą reikšmę į „kintamąjį paspaudus“//, šis kintamasis diktuoja judėjimo kryptį, jei (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP UP"); // Serial.println (paspaustas mygtukas); butup = klaidingas; tonas (SND, 1500, 10); } if (butdown == true) {mygtuko paspaudimas = DIRDOWN; // Serial.println ("Paspaustas žemyn"); // Serial.println (paspaustas mygtukas); butdown = klaidinga; tonas (SND, 1500, 10); }
jei (butleft == tiesa)
{paspaustas mygtukas = DIRLEFT; // Serial.println ("Paspaustas kairėn"); // Serial.println (paspaustas mygtukas); butleft = klaidinga; tonas (SND, 1500, 10); } if (butright == true) {paspaustas mygtukas = DIRRIGHT; // Serial.println ("Paspausta dešinėn"); // Serial.println (paspaustas mygtukas); butright = klaidingas; tonas (SND, 1500, 10); }}
// -------------------------- nupieškite rodymo tvarką ------------------ -----------------
void updateDisplay () // piešti balus ir kontūrus
{// Serial.println ("Atnaujinti ekraną");
display.fillRect (0, 0, display.width ()-1, 8, BLACK);
display.setTextSize (0); display.setTextColor (BALTA); // piešti taškus display.setCursor (2, 1); display.print ("Rezultatas:"); display.print (Styga (grojimo rezultatas, DEC)); display.setCursor (66, 1); display.print („Didelis:“); display.print (eilutė (aukščiausias rezultatas, DEC)); // piešti žaidimų zoną // poz 1x, 1y, 2x, 2y, spalvotas ekranas.drawLine (0, 0, 127, 0, WHITE); // labai viršutinis ekranas.drawLine (63, 0, 63, 9, WHITE); // taškų atskyrimo ekranas.drawLine (0, 9, 127, 9, BALTA); // po teksto kraštinės ekranu.drawLine (0, 63, 127, 63, WHITE); // apatinio krašto ekranas.drawLine (0, 0, 0, 63, BALTA); // kairiojo krašto ekranas.drawLine (127, 0, 127, 63, WHITE); // dešinė kraštinė
}
// ----------------------------------- atnaujinkite žaidimų zoną ---------- --------------------
void updateGame () // tai atnaujina žaidimo srities vaizdą
{display.clearDisplay ();
display.drawPixel (scranPosX, scranPosY, WHITE);
scranAte = scranFood ();
// patikrinti gyvatės rutiną
if (outOfArea () || selfCollision ())
{ žaidimas baigtas(); }
// rodyti gyvatę
(int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; gyvatėPosY = gyvatėPosY [i-1]; } // prie gyvatės pridėkite papildomą pikselį, jei (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = gyvatėX; snakePosY [snakeSize-1] = gyvatėY; }
jungiklis (nuspaustas mygtukas) // buvo snakeDirection
{atvejis DIRUP: gyvatėY- = 1; pertrauka; atvejis DIRDOWN: gyvatėY+= 1; pertrauka; atvejis DIRLEFT: snakeX- = 1; pertrauka; atvejis TIESIOGINIS: gyvatėX+= 1; pertrauka; } snakePosX [0] = gyvatėX; snakePosY [0] = gyvatėY; updateDisplay (); display.display (); // --------------------- padėkite scraną -------------------
tuščia vietaScran ()
{scranPosX = atsitiktinis (worldMinX+1, worldMaxX-1); scranPosY = atsitiktinis (worldMinY+1, worldMaxY-1); } // ------------------------ SKENAVIMAS ATE POINT UP ---------------- bool scranFood () {if (snakeX == scranPosX && snakeY == scranPosY) {playcore = playcore+10; tonas (SND, 2000, 10); updateDisplay (); placeScran (); grąžinimas 1; } else {return 0; }} // --------------------- ne rajone ---------------------- bool outOfArea () {return snakeX = worldMaxX || gyvatėY = worldMaxY; } //---------------------- žaidimas baigtas----------------------- --- void gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); tonas (SND, 2000, 50); display.print („ŽAIDIMAS“); tonas (SND, 1000, 50); display.print („PABAIGA“); if (playscore> = rekordas) // patikrinkite, ar balas didesnis nei aukštas {highscore = playscore; // single if statment to update high score} (int i = 0; i <= 16; i ++) // tai yra, kad aplink žaidimą būtų rodomi stačiakampiai per {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println ("jei kilpa"); display.display (); rectX1- = 2; // perėjimas 2 pikseliais rectY1- = 2; rectX2+= 4; // perėjimas per 2 pikselius nuo paskutinio taško rectY2+= 4; tonas (SND, i*200, 3); } display.display (); // Ekrano valymas po šlovės per rectX1 = 0; // nustatyti pradinę tiesės tiesinę padėtį1Y1 = 0; rectX2 = 0; rectY2 = 63; už (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); playcore = 0; // iš naujo nustatyti gyvatę ir žaidėjo informaciją snakeSize = 1; gyvatėX = display.width ()/2; gyvatėY = ekranas.aukštis ()/2; waitForPress (); // laukti, kol žaidėjas pradės žaidimą} // ------------------------- laukti spaudos ciklo ---------- --------------- void waitForPress () {bool laukia = 0; // kilpa baigiasi, kai tai yra tikras ekranas.clearDisplay (); while (laukia == 0) {drawALineForMe (BALTAS); // nupiešti atsitiktinę baltą liniją drawALineForMe (BLACK); // nubrėžkite atsitiktinę juodą liniją, kad ekranas neužpildytų visiškai balto ekrano. fillRect (19, 20, 90, 32, BLACK); // tuščias teksto rodymo fonas.setTextColor (BALTA); display.setCursor (35, 25); display.setTextSize (2); // didesnis šrifto ekranas.println ("SNAKE"); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, WHITE); // pasienio gyvatės ekranas.drawRect (19, 20, 90, 32, BALTA); // ribos langelis - 3 ekranas.setCursor (28, 42); display.setTextSize (0); // šriftas atgal į įprastą ekraną.println ("paspauskite bet kurį klavišą"); display.display (); laukia = digitalRead (INTPIN); // patikrinkite, ar paspaudus laukimo klavišą pasikeis į 1 pabaigą, o paspaudus mygtuką = 0; // atstatymo mygtuko paspaudimas}}} // -------------------- NUTRAUKITE atsitiktinės eilutės įvesties spalvą uint8_t -------------- ----- niekinis drawALineForMe (uint8_t clr) {uint8_t line1X, line1Y, line2X, line2Y = 0; // nustatykite linijai atsitiktines koordinates, tada nupieškite ją // kintamasis ne mažiau ne daugiau line1X = atsitiktinis (worldMinX+1, worldMaxX-1); 1 eilutė = atsitiktinė (pasaulisMinY+1, pasaulisMaxY-1); line2X = atsitiktinis (worldMinX+1, worldMaxX-1); 2 eilutė = atsitiktinė (pasaulisMinY+1, pasaulisMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ------------------------------------ susidūrimo aptikimas -------- -----------------------
už (baitas i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {return 1; tonas (SND, 2000, 20); tonas (SND, 1000, 20); } grįžti 0; }
// -------------------------------- SETUP --------------- -------------------------------
void setup () {delay (100); // tiesiog duok daiktams galimybę "paleisti" // Serial.begin (9600); // panaikinkite žymėjimą, jei norite matyti nuosekliųjų išėjimų ekraną.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // pradėti nuo švaraus ekrano. setTextColor (BALTA); // nustatyti teksto spalvų sukimosi dydį ir pan. display.setRotation (0); display.setTextWrap (klaidinga); display.dim (0); // nustatyti ekrano ryškumą pinMode (INTPIN, INPUT); // nustatykite teisingus prievadus įvestims pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // tai yra pertraukos komanda, kuri „sustabdo“arduino, kad nuskaitytų įvestis // komanda- funkcija- kaiščio funkcija vykdyti sąlygą kaiščiui pritvirtintiInterrupt (digitalPinToInterrupt (INTPIN), pertrauktas, RISING); // Serial.println ("Sąranka perduota"); waitForPress (); // rodyti gyvatės pradžios ekraną placeScran (); // padėkite pirmąjį maisto gabalėlį} // --------------------- PAGRINDINIS LOOPAS ----------------- ---------------------- void loop () {updateGame (); // ši funkcija yra pagrindinis kodas}
3 žingsnis:
Rekomenduojamas:
„NeoPixels Matrix“ir „Snake“žaidimas: 4 žingsniai
„NeoPixels Matrix“: Gyvatės žaidimas: Ar dar prisimenate žaidimą su gyvate, kurį vaikystėje žaidėme žaidimo dėžutėje ar mobiliajame telefone? Šiandien mes išmoksime sukurti žaidimą su gyvatėle naudojant 8*8 „NeoPixels Matrix“. Mes pasirenkame „Arduino uno“kaip valdymo centrą ir „Joystick Breakout“modulį, kad galėtume
Neapgalvotas lenktynininkas Arduino OLED žaidimas, „AdafruitGFX“ir „Bitmaps“pagrindai: 6 žingsniai
Neapgalvotas lenktynininkas „Arduino OLED“žaidimas, „AdafruitGFX“ir „Bitmaps“pagrindai: Šioje pamokoje apžvelgsime, kaip naudoti bitų žemėlapius naudojant „Adafruit_GFX.c“biblioteką kaip tam tikrą spritą žaidime. Paprasčiausias žaidimas, kurį galėtume sugalvoti, yra šoninės slinkties juostos keitimo automobilių žaidimas, galų gale mūsų beta testeris ir kodavimo pagalbininkas
Simono žaidimas - įdomus žaidimas!: 5 žingsniai
Simono žaidimas - įdomus žaidimas!: Nuoroda: čia Laikas mums treniruoti smegenis, ar ne? Be tų nuobodžių ir beprasmių žaidimų, yra žaidimas „Simono žaidimas“
„Arduino“pagrindu sukurtas „pasidaryk pats“žaidimų valdiklis - „Arduino PS2“žaidimų valdiklis - Žaidimas „Tekken“naudojant „pasidaryk pats“„Arduino“žaidimų pultą: 7 žingsniai
„Arduino“pagrindu sukurtas „pasidaryk pats“žaidimų valdiklis | „Arduino PS2“žaidimų valdiklis | Žaidimas „Tekken“naudojant „pasidaryk pats“„Arduino Gamepad“: Sveiki, vaikinai, žaisti žaidimus visada smagu, tačiau žaisti su savo „pasidaryk pats“žaidimo valdikliu yra smagiau. Taigi, mes padarysime žaidimų valdiklį naudodami „arduino pro micro“šioje instrukcijoje
„Arduino Snake“VGA monitoriuje: 5 žingsniai
„Arduino Snake“ant VGA monitoriaus: Na … Aš nusipirkau „Arduino“. Iš pradžių investicijos buvo motyvuotos tuo, kas paskatintų mano dukrą domėtis programavimu. Tačiau, kaip paaiškėjo, man buvo įdomiau žaisti su šiuo dalyku. Pažaidus su šviesos diodų gamyba