Բովանդակություն:
Video: Arduino OLED Snake խաղ. 3 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:47
Ողջույն, բարի գալուստ, մեր հրահանգներին, թե ինչպես պատրաստել և arduino OLED խաղ, այս նախագիծը ստեղծվեց, երբ մենք փորձում էինք մեր առաջին խաղը կատարել arduino- ով, այնպես որ, մենք մտածեցինք, թե որտեղից ավելի լավ է սկսել, քան nokia դասական Snake- ը (լավ գոնե օձի կլոն:)):
Այն, ինչ ձեզ պետք կգա
Պարագաներ
Arduino UNO կամ կլոն
OLED էկրան
4 դիոդ
500-1k դիմադրություն
4 վերահսկիչ կոճակ
Պասիվ պիեզո ազդանշան
ըստ ցանկության
Solderless BreadBoard
Խնդրում ենք նկատի ունենալ, որ այս հղումները միայն օրինակ են
Քայլ 1: Շղթան
Վերոնշյալ նկարում կարող եք տեսնել մեր սխեման, 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:
Խորհուրդ ենք տալիս:
NeoPixels Matrix : Snake խաղ. 4 քայլ
NeoPixels Matrix : Snake Game: Դուք դեռ հիշու՞մ եք օձի խաղը, որը մենք խաղում էինք մեր մանկության ժամանակ մեր խաղատուփի կամ բջջայինի վրա: Այսօր մենք սովորելու ենք, թե ինչպես պատրաստել օձերի խաղ 8*8 NeoPixels մատրիցով: Մենք ընտրում ենք Arduino uno- ն որպես կառավարման կենտրոն և Joystick- ի բեկման մոդուլ ՝ համատեղ
Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. 6 քայլ
Reckless Racer Arduino OLED խաղ, AdafruitGFX և Bitmaps հիմունքներ. Այս ձեռնարկում մենք կանդրադառնանք, թե ինչպես օգտագործել bitmaps- ը Adafruit_GFX.c գրադարանից ՝ որպես խաղի տեսակի սպիրտներ: Ամենապարզ խաղը, որի մասին մենք կարող էինք մտածել, կողային ոլորման մեքենայի խաղ փոխելու խաղն է, ի վերջո, մեր բետա փորձարկողը և օգնական կոդավորողը
Էլեկտրոնային խաղ Tic-Tac-Toe խաղ փայտե տուփի մեջ. 5 քայլ
Էլեկտրոնային խաղ Tic-Tac-Toe- ը փայտե տուփի մեջ
Aruduino LED խաղ Արագ կտտացնելով երկու խաղացողի խաղ. 8 քայլ
Aruduino LED խաղ Արագ սեղմում երկու խաղացողի խաղ. Այս նախագիծը ոգեշնչված է @HassonAlkeim- ից: Եթե պատրաստ եք խորը հայացք նետել, այստեղ կա մի հղում, որը կարող եք ստուգել https://www.instructables.com/id/Arduino-Two-Player-Fast-Button-Clicking-Game/: Այս խաղը Alkeim's- ի կատարելագործված տարբերակն է: Դա է
Խաղացեք PONG խաղ Arduino Uno- ով և OLED 0.96 SSD1306 էկրանով ՝ 6 քայլ
Խաղացեք PONG խաղ Arduino Uno- ով և OLED 0.96 SSD1306 էկրանով. Բարև տղերք, այսօր մենք PONG խաղ ենք պատրաստելու Arduino- ի հետ: Խաղը ցուցադրելու համար մենք կօգտագործենք adafruit- ի 0.96 oled էկրանը & սեղմել կոճակները ՝ խաղը վերահսկելու համար