Turinys:

„Arduino OLED Snake“žaidimas: 3 žingsniai
„Arduino OLED Snake“žaidimas: 3 žingsniai

Video: „Arduino OLED Snake“žaidimas: 3 žingsniai

Video: „Arduino OLED Snake“žaidimas: 3 žingsniai
Video: Coding@home - 11 The Snake 2024, Liepa
Anonim
Arduino OLED gyvatės žaidimas
Arduino OLED gyvatės žaidimas

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ė

Circuit
Circuit

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: