Բովանդակություն:

Arduino OLED Snake խաղ. 3 քայլ
Arduino OLED Snake խաղ. 3 քայլ

Video: Arduino OLED Snake խաղ. 3 քայլ

Video: Arduino OLED Snake խաղ. 3 քայլ
Video: NOOBS PLAY CLASH ROYALE FROM START LIVE 2024, Հուլիսի
Anonim
Arduino OLED օձի խաղ
Arduino OLED օձի խաղ

Ողջույն, բարի գալուստ, մեր հրահանգներին, թե ինչպես պատրաստել և arduino OLED խաղ, այս նախագիծը ստեղծվեց, երբ մենք փորձում էինք մեր առաջին խաղը կատարել arduino- ով, այնպես որ, մենք մտածեցինք, թե որտեղից ավելի լավ է սկսել, քան nokia դասական Snake- ը (լավ գոնե օձի կլոն:)):

Այն, ինչ ձեզ պետք կգա

Պարագաներ

Arduino UNO կամ կլոն

OLED էկրան

4 դիոդ

500-1k դիմադրություն

4 վերահսկիչ կոճակ

Պասիվ պիեզո ազդանշան

ըստ ցանկության

Solderless BreadBoard

Խնդրում ենք նկատի ունենալ, որ այս հղումները միայն օրինակ են

Քայլ 1: Շղթան

The Circuit
The Circuit

Վերոնշյալ նկարում կարող եք տեսնել մեր սխեման, arduino- ում մենք օգտագործում ենք pin d3- ը որպես ընդհատման հարցման քորոց, որպեսզի arduino- ն առաջնահերթություն տա d4 d5 d6 d7 վերահսկիչի մուտքերին կարդալուն: Շրջանի հիմքում ընկած է այն, որ սեղմվում է ուղղության կոճակը, որը բարձրանում է 5 վ, ինչը ակտիվացնում է ընդհատման պահանջի քորոցը (d3 մանուշակագույն մետաղալար) և համապատասխան ուղղության քորոցը, ընդհատման գործառույթը կանչում է թարմացման ուղղության գործառույթ, և այդ ծածկագիրը համապատասխանաբար տեղափոխում է օձին: Պին 9 -ը օգտագործվում է որպես ձայնային քորոց, քանի որ դա PWM է (~ զարկերակի լայնության մոդուլյացիա), որն ուղղակիորեն միացված է + քորոցով 5 վ պիեզոյին, և - - վերադառնալ 0v/հող:

(Տվյալները arduino uno- ում և կլոններում միայն d2 և d3- ը կարող են հանդես գալ որպես ընդհատման հարցման կապում):

Ուղղության քորոցներ.

d4 Մինչև Նարնջագույն

d5 Down PINK

d6 Ձախ Կապույտ

d7 Աջ BROWN

d9 հնչում է Մոխրագույն

Յուրաքանչյուր կոճակ ունի 5 վ միացման մուտք և ելք, որն առաջին հերթին միացված է arduino- ի համապատասխան թվային մուտքին, յուրաքանչյուր կոճակի այս նույն ելքը միացված է իր սեփական դիոդին, մենք օգտագործում ենք դիոդները ՝ լարման սնուցումը դադարեցնելու համար այլ կոճակներ և դրանք ակտիվացնելը: Բոլոր 4 դիոդների կաթոդի (-) վերջում մենք դրանք միացնում ենք ՝ ստեղծելով ելքային հանգույց, որը միանում է d3- ին, այնուհետև դիմադրության միջոցով 0v/երկրի վրա, որպեսզի arduino- ի կապումներն իջեցնեն, որպեսզի չթողնեն լողացող կապում, երբ չլինեն: ակտիվացված է:

(FYI լողացող քորոցը կարող է ստանալ ֆանտոմային լարման և առաջացնել անսովոր պահվածք)

2 անալոգային կապում օգտագործվում են էկրանը քշելու համար, դրանք arduino ապարատային i2c կապում են:

A5- ը միացված է SCL YELLOW- ին

A4- ը միացված է SDA GREEN- ին

Արդուինոյից +5v և 0v (երկիր) ելքերը օգտագործվում են որպես ամբողջ հոսանքի էներգիայի աղբյուր, որը կարող է սնուցվել USB- ով կամ հեռախոսի լիցքավորիչով:

Քայլ 2: Կոդ

// ------------------------ ANJAWARE Օձի խաղեր peoplesուտ ժողովուրդների օգնությամբ --------------- -------

#ներառում

#ներառել // https://github.com/adafruit/Adafruit-GFX-Library #include // https://github.com/adafruit/Adafruit-GFX-Library // ցուցադրման հավաքածու (լայնություն, բարձրություն) Adafruit_SSD1306 ցուցադրում (128, 64); // սահմանել մուտքային կապեր դրանք arduino- ի կապումներն են, որոնք երբեք չեն փոխվում, այնպես որ #սահմանեք #սահմանեք INTPIN 3 // միայն 2 -րդ և 3 -րդ կապերը կարող են ընդհատվել UNO #define UPPIN 4 -ի // դրանք կապեր են tp համապատասխան անջատիչ #սահմանել DWNPIN 5 #սահմանել LFTPIN 6 #սահմանել RHTPIN 7 #սահմանել SND 9 // ուղղություններ սահմանել #սահմանել DIRUP 1 // այս արժեքներն են «օձը» նայում որոշելու համար- #սահմանի IRԱՄԱՆԱԿԸ 2 // ուղղությունը, որով կանցնի օձը # սահմանել DIRLEFT 3 #սահմանել DIRRIGHT 4

// սահմանել կոճակի փոփոխականներ

// volilile cos մեզ անհրաժեշտ է, որ այն թարմացվի interupt- ով, այնպես որ կարող է լինել ցիկլի արժեքի ցանկացած բիթ

// երբեք 4 -ից բարձր չէ, այնպես որ անհրաժեշտ է ընդամենը 8bit int ՝ ռեսուրսներ խնայելու համար uint8_t buttonpressed = 0; bool butup = 0; bool butdown = 0; // մենք սա օգտագործում ենք true- ի համար `« հայտնաբերելու »համար, թե որ ուղղությամբ է սեղմված bool butleft = 0; bool butright = 0;

// օձի միջ

բայթ snakePosX [30]; // զանգված ՝ օձի բայթ մարմինը դարձնելու համար snakePosY [30];

int snakeX = 30; // օձի գլխի դիրքը

int օձ Y = 30; int snakeSize = 1; // օձերի չափերի քանակը սահմանափակվում է զանգվածի չափսերով

// աշխարհի միջն

uint8_t worldMinX = 0; // սրանք սահմանում են խաղային տարածքի սահմանները

uint8_t worldMaxX = 128; uint8_t worldMinY = 10; uint8_t worldMaxY = 63;

// հավաքել սկրան (սնունդ) և սկրանի դիրքը

bool scranAte = 0; uint8_t scranPosX = 0; uint8_t scranPosY = 0;

// գնահատում է փոփոխականները

երկար խաղացանկ = 0; երկար բարձր գնահատական = 30; // սահմանել բարձր միավոր 3 հավաքել որպես ելակետ

// --------------------------- ահա թե ինչ է կատարում ընդհատումը լարման բարձրացման ժամանակ ------------ -------------

void interruptpressed () {հետաձգում (150); // մի փոքր ուշացում ավելացված «վերադարձի» պաշտպանության նորացված ուղղության համար (); } // ------------------ թարմացնել ուղղության արժեքը կոճակի սեղմումից ----------------- անվավեր թարմացված ուղղություն () { // Serial.println ("Updatingdirection"); butup = digitalRead (UPPIN); // ստուգեք, թե որ մուտքն է բարձրացել և համապատասխան բուլ ճշմարիտ butdown = digitalRead (DWNPIN); butleft = digitalRead (LFTPIN); butright = digitalRead (RHTPIN); // սրանք, եթե հայտատուները նայում են, թե որ մուտքն է բարձրացել և մուտքագրում է համապատասխան արժեքը «սեղմված» // փոփոխականում, այս փոփոխականը թելադրում է շարժման ուղղությունը, եթե (butup == true) {buttonpressed = DIRUP; // Serial.println ("UP սեղմված"); // Serial.println (սեղմված); butup = կեղծ; տոնայնություն (SND, 1500, 10); } if (butdown == true) {buttonpressed = DIRDOWN; // Serial.println ("DOWN սեղմված"); // Serial.println (սեղմված); butdown = կեղծ; տոնայնություն (SND, 1500, 10); }

եթե (butleft == ճշմարիտ)

{կոճակը սեղմված = ՇԱՀԱՎՈՐ; // Serial.println («ՁԱՅՆ սեղմված»); // Serial.println (սեղմված); բութլեթ = կեղծ; տոնայնություն (SND, 1500, 10); } if (butright == true) {buttonpressed = DIRRIGHT; // Serial.println («IGHԻՇՏ սեղմված է»); // Serial.println (սեղմված); բութ = կեղծ; տոնայնություն (SND, 1500, 10); }}

// -------------------------- նկարեք ցուցադրման ռեժիմները ------------------ -----------------

void updateDisplay () // նկարել միավորներ և ուրվագծեր

{// Serial.println ("Թարմացնել ցուցադրումը");

display.fillRect (0, 0, display.width ()-1, 8, ՍԵՎ);

display.setTextSize (0); display.setTextColor (ՍՊԻՏԱԿ); // նկարել արդյունքները display.setCursor (2, 1); display.print ("Հաշիվ."); display.print (Լար (նվագարկիչ, DEC)); display.setCursor (66, 1); display.print ("Բարձր."); display.print (Լարային (բարձր գնահատական, DEC)); // նկարել խաղային տարածք // pos 1x, 1y, 2x, 2y, գունավոր display.drawLine (0, 0, 127, 0, WHITE); // շատ վերին եզրագիծ display.drawLine (63, 0, 63, 9, WHITE); // միավոր անջատիչ display.drawLine (0, 9, 127, 9, ՍՊԻՏԱԿ); // տեքստի եզրագծի ներքևում display.drawLine (0, 63, 127, 63, WHITE); // ներքեւի եզրագիծ display.drawLine (0, 0, 0, 63, WHITE); // ձախ եզրագիծ display.drawLine (127, 0, 127, 63, WHITE); // աջ եզրագիծ

}

// --------------------------------------- թարմացնել խաղային տարածքը ---------- --------------------

void updateGame () // սա թարմացնում է խաղի տարածքի ցուցադրումը

{display.clearDisplay ();

display.drawPixel (scranPosX, scranPosY, WHITE);

scranAte = scranFood ();

// ստուգեք օձի ռեժիմը

եթե (outOfArea () || selfCollision ())

{ խաղն ավարտված է(); }

// ցուցադրել օձը

(int i = 0; i0; i--) {snakePosX = snakePosX [i-1]; snakePosY = օձPosY [i-1]; } // օձին ավելացրեք լրացուցիչ պիքսել, եթե (scranAte) {snakeSize+= 1; snakePosX [snakeSize-1] = օձ X; snakePosY [snakeSize-1] = օձY; }

անջատիչ (կոճակով սեղմված) // snakeDirection էր

{դեպքի ԴԻՌՈPՊ. օձՅ- = 1; ընդմիջում; պատյան DIRDOWN: snakeY+= 1; ընդմիջում; պատյան DIRLEFT: snakeX- = 1; ընդմիջում; պատյան DIRRIGHT: snakeX+= 1; ընդմիջում; } snakePosX [0] = օձX; snakePosY [0] = օձY; updateDisplay (); display.display (); // --------------------- տեղադրել սկրանը -------------------

դատարկ տեղ Scran ()

{scranPosX = պատահական (worldMinX+1, worldMaxX-1); scranPosY = պատահական (worldMinY+1, worldMaxY-1); } // ------------------------ ՄԵԿՆԵԼ ՄՏՈՄ) {if (snakeX == scranPosX && snakeY == scranPosY) {խաղացանկ = խաղացանկ+10; տոնայնություն (SND, 2000, 10); updateDisplay (); placeScran (); վերադարձ 1; } else {վերադարձ 0; }} // --------------------- տարածքից դուրս ---------------------- bool outOfArea () {վերադարձ օձ x = worldMaxX || օձY = worldMaxY; } //---------------------- խաղն ավարտված է----------------------- --- անվավեր gameOver () {uint8_t rectX1, rectY1, rectX2, rectY2; rectX1 = 38; rectY1 = 28; rectX2 = 58; rectY2 = 12; display.clearDisplay (); display.setCursor (40, 30); display.setTextSize (1); տոնայնություն (SND, 2000, 50); display.print («ԽԱAME»); տոնայնություն (SND, 1000, 50); display.print ("OVER"); եթե (խաղային հաշիվ> = ամենաբարձր գնահատական) // ստուգեք ՝ տեսնելու, թե արդյոք բարձր միավորը բարձր է, քան բարձր գնահատականը {ամենաբարձր գնահատական = խաղային հաշիվ; // միայնակ if statment to update high score} for (int i = 0; i <= 16; i ++) // սա պետք է ուղղանկյուններ քաշի խաղի շուրջ {display.drawRect (rectX1, rectY1, rectX2, rectY2, WHITE); Serial.println («եթե հանգույց»); display.display (); rectX1- = 2; // անցնել 2 պիքսելով rectY1- = 2; rectX2+= 4; // անցնել 2 պիքսել ավելի քան վերջին կետից rectY2+= 4; տոնայնություն (SND, i*200, 3); } display.display (); // Էկրանի սրբում փառքից հետո rectX1 = 0; // սահմանել rectY1 գծի մեկնարկային դիրքը; rectX2 = 0; rectY2 = 63; համար (int i = 0; i <= 127; i ++) {uint8_t cnt = 0; display.drawLine (rectX1, rectY1, rectX2, rectY2, BLACK); rectX1 ++; rectX2 ++; display.display (); } display.clearDisplay (); խաղային միավոր = 0; // վերականգնել օձի և խաղացողի տվյալները snakeSize = 1; snakeX = display.width ()/2; snakeY = display.height ()/2; waitForPress (); // սպասեք խաղացողի խաղը սկսելու համար} // ------------------------- սպասեք սեղմումների հանգույցին ---------- --------------- անվավեր waitForPress () {bool սպասում = 0; // հանգույցն ավարտվում է, եթե սա իսկական display.clearDisplay (); while (սպասում == 0) {drawALineForMe (ՍՊԻՏԱԿ); // նկարել պատահական սպիտակ գիծ drawALineForMe (Սև); // նկարել պատահական սև գիծ, որպեսզի էկրանը ամբողջությամբ չլցնի սպիտակ էկրանը: fill.fillRect (19, 20, 90, 32, Սև); // դատարկ ֆոն տեքստի ցուցադրման համար: setTextColor (WHITE); display.setCursor (35, 25); display.setTextSize (2); // ավելի մեծ տառատեսակ display.println («Օձ»); // x y w h r col display.drawRoundRect (33, 22, 62, 20, 4, ՍՊԻՏԱԿ); // եզրագիծ Snake display.drawRect (19, 20, 90, 32, WHITE); // սահմանային տուփ - 3 display.setCursor (28, 42); display.setTextSize (0); // տառատեսակը վերադառնալ նորմալ ցուցադրման: println («սեղմել ցանկացած ստեղն»); display.display (); սպասում = digitalRead (INTPIN); // ստուգեք ՝ արդյոք ստեղնը սեղմած սպասումը կփոխվի 1 ավարտի, երբ կոճակը սեղմված է = 0; // վերականգնել կոճակը սեղմել}} // -------------------- Գծել պատահական տողի մուտքագրման գույն uint8_t -------------- ----- անվավեր drawALineForMe (uint8_t clr) {uint8_t տող 1X, տող 1Y, տող 2X, տող 2Y = 0; // գծի համար սահմանել պատահական կոորդինատներ, այնուհետև գծել այն // փոփոխական ոչ պակաս ոչ ավել ոչ պակաս տող 1X = պատահական (worldMinX+1, worldMaxX-1); line1Y = պատահական (worldMinY+1, worldMaxY-1); line2X = պատահական (worldMinX+1, worldMaxX-1); line2Y = պատահական (worldMinY+1, worldMaxY-1); display.drawLine (line1X, line1Y, line2X, line2Y, clr); } // ----------------------------------------- բախման հայտնաբերում -------- ---------------------------

համար (բայթ i = 4; i <snakeSize; i ++) {if (snakeX == snakePosX && snakeY == snakePosy ) {վերադարձ 1; տոնայնություն (SND, 2000, 20); տոնայնություն (SND, 1000, 20); } վերադարձ 0; }

// ------------------------------------ ԿԱՐԳԱՎՈՐՈՄ --------------- -----------------------------------

void setup () {հետաձգում (100); // պարզապես հնարավորություն տվեք իրերին «գործարկել» // Serial.begin (9600); // հեռացրեք այս նշումը, եթե ցանկանում եք տեսնել սերիական արդյունքները display.begin (SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay (); // սկսել մաքուր ցուցադրման display.setTextColor (WHITE); // կարգավորել տեքստի գույնի ռոտացիայի չափը և այլն display.setRotation (0); display.setTextWrap (կեղծ); display.dim (0); // սահմանել ցուցադրման brighness pinMode (INTPIN, INPUT); // ճշգրիտ նավահանգիստները սահմանել մուտքերի pinMode (UPPIN, INPUT); pinMode (DWNPIN, INPUT); pinMode (LFTPIN, INPUT); pinMode (RHTPIN, INPUT); // սա միջակողմանի հրաման է, որը «կանգնեցնում» է arduino- ին ՝ մուտքերը կարդալու համար // command- function- pin-function to execute-condition on pin attachInterrupt (digitalPinToInterrupt (INTPIN), interruptpressed, RISING); // Serial.println («Կարգավորումն անցավ»); waitForPress (); // ցուցադրել օձի գործարկման էկրան placeScran (); // տեղադրեք սննդի առաջին կտորը} // --------------------- ՀԻՄՆԱԿԱՆ ՀԱՅՏԱՐԱՐՈ----ԹՅՈՆ ----------------- ---------------------- void loop () {updateGame (); // այս գործառույթը այն է, ինչ կրում է հիմնական կոդը}

Քայլ 3:

Խորհուրդ ենք տալիս: