Cuprins:
- Pasul 1: Toate părțile
- Pasul 2: Cum să conectați piesele la Arduino
- Pasul 3: Diagrama fluxului programului
- Pasul 4: Programarea joystick-ului
- Pasul 5: Primul nivel
- Pasul 6: Detectarea coliziunilor
- Pasul 7: Ultimele două niveluri
Video: Recreația celui mai greu joc din lume pe Arduino: 7 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:44
Acest proiect se bazează pe un joc pe computer pe care îl puteți găsi online. Numele său este „Cel mai greu joc din lume”. Am reușit să-l recreez pe Arduino folosind un LED Matrix cu patru module. În acest instructabil vă învăț cum să-l construiți singur. Înainte de a ajunge la prea multe detalii, vreau să ofer o scurtă prezentare generală a etapelor prin care am trecut pentru a crea acest joc.
- Am adunat toate piesele necesare.
- Am conectat piesele între ele.
- Am scris o schiță care folosea joystick-ul pentru a muta LED-urile jucătorilor pe toate modulele.
- Am proiectat primele obstacole și le-am adăugat la schiță, astfel încât să imite Worlds Hardest Game.
- Am adăugat apoi cod pentru a detecta o coliziune cu obstacolele, care va relua jocul.
- Și apoi am proiectat încă două niveluri de obstacole.
Pasul 1: Toate părțile
Iată o listă cu toate părțile de care aveți nevoie:
- Un conector Arduino UNO și USB:
- Un patru module 8x8: matrice LED
- Un joystick:
- 10 fire de la mascul la feminin:
Pasul 2: Cum să conectați piesele la Arduino
Cum să conectați matricea LED la Arduino
- GND merge la GND
- VCC merge la 5V
- DataIn merge la pinul digital 12
- CLK trece la pinul digital 11
- CS sau LOAD trece la pinul digital 10
Cum se conectează joystick-ul
- GND merge la GND
- 5V merge la 5V
- VRx merge la pinul analogic A0
- VRy trece la pinul analogic A1
- SW nu este utilizat
Bateria se conectează la mufa de 9v pentru a oferi putere Arduino
Pasul 3: Diagrama fluxului programului
Ovalul indică începutul programului.
Primul pas este de a defini toate obstacolele.
Următorii doi pași indică setarea variabilelor și pornirea tuturor modulelor.
Următorul pas este de a seta LED-urile la primul nivel și orice alte variabile.
Apoi afișează nivelul pe care este jucătorul în prezent.
Rombul indică citirea joystick-ului pentru a vedea în ce direcție este împins.
Apoi mutați jucătorul în orice direcție a fost împins joystick-ul.
Verificați și vedeți dacă jucătorul s-a ciocnit de un obstacol.
Dacă jucătorul a lovit un obstacol, reveniți la primul nivel. Dacă nu, verificați dacă jucătorul a ajuns la sfârșitul nivelului.
Dacă jucătorul se află la sfârșitul nivelului, setați-l la nivelul următor, apoi reveniți la „Afișează nivelul curent”. Dacă nu sunt la sfârșit, mutați obstacolele și întoarceți-vă la „Citiți joystick-ul”.
Pasul 4: Programarea joystick-ului
Desigur, pentru a muta micul punct care este jucătorul, avem nevoie de un joystick. și pentru a permite joystick-ului să deplaseze de fapt playerul, trebuie să-l codăm în ID-ul Arduino. Trebuie să includeți biblioteca LedControl pe care o puteți găsi accesând meniul schiță> Includeți biblioteci> gestionați bibliotecile și căutați LedControl. Iată cum arată codul pentru joystick.
#include „LedControl.h”
int DataIn = 12; int CLK = 11; int DIN = 10; LedControl lc = LedControl (DataIn, CLK, DIN, 4); // Creează obiect pentru patru module int delaytime = 50; // viteza cu care rulează jocul în joystick_RtLt, joystick_UpDn; int players_x = 0; // poziția orizontală a jucătorilor de la 0 la 31 int players_y = 3; // poziția verticală a jucătorilor de la 0 la 7 rânduri, coloane, module; void setup () {initialize_modules (); // porniți și setați toate cele patru module led} void loop () {move_player (); // începe bucla verificând dacă jucătorul mișcă întârzierea (delaytime); } void initialize_modules () {lc.shutdown (0, false); // pornește modulul 0 lc.setIntensity (0, 1); lc.shutdown (1, fals); // pornește modulul 1 lc.setIntensity (1, 1); lc.shutdown (2, fals); // pornește modulul 2 lc.setIntensity (2, 1); lc.shutdown (3, fals); // pornește modulul 3 lc.setIntensity (3, 1); lc.clearDisplay (0); // șterge modulul 0} void move_player () {module = players_x / 8; // definește modul în care este jucătorul pe coloană = players_x% 8; // definește coloana în care se află jucătorul pe rândul modulului = players_y; lc.setLed (modul, rând, coloană, fals); // opriți ledul în poziția actuală a jucătorului joystick_RtLt = analogRead (A0) / 204 - 2; // citiți X-joystick și harta variază de la 2 la -2 dacă (joystick_RtLt> 0) // atunci când joystick-ul este la jucătorii potriviți_x ++; // mergeți în dreapta altfel dacă (joystick_RtLt 0) // dacă joystick-ul este la stânga și nu la începutul players_x--; // mutați stânga joystick_UpDn = analogRead (A1) / 204 - 2; // citiți Y-joystick și harta variază de la 2 la -2 dacă (joystick_UpDn 0) // dacă joystick-ul este în jos și jucătorul nu este la baza jucători_y--; // mutați în jos altfel dacă (joystick_UpDn> 0 && players_y <7) // dacă joystick-ul este sus și jucătorul nu este la top players_y ++; // merge sus modul = players_x / 8; // setați modulul la noua poziție a coloanei jucătorilor = players_x% 8; // setați coloana la poziția nouă a jucătorilor rând = players_y; // setați rândul pe poziția nouă a jucătorilor lc.setLed (modul, rând, coloană, adevărat); // pornește ledul la noua poziție a jucătorului}
Acum că ați adăugat joystick-ul, să lucrăm la primul obstacol!
Pasul 5: Primul nivel
Bine, așa că acum este timpul să intrați în partea principală a programului, obstacolele! Obstacolele sunt ceea ce face cu adevărat acest „cel mai greu joc din lume”. Deci, dacă doriți să jucați efectiv jocul, trebuie să adăugați acest lucru la codul dvs.:
byte obstacle [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// trei nivele, 8 scene, 8 coloane, 8 rânduri
{{{1, 1, 1, 1, 1, 1, 0, 0}, // primul nivel, prima scenă {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, 1, 1, 1, 1, 1, 1}, { 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}}, {{1, 1, 1, 1, 1, 0, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primul nivel, a doua scenă {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 1, 1, 1, 1 }, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primul nivel, al treilea scena {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primul nivel, a patra scenă {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 1, 0, 0, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primul nivel, a cincea scenă {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {1, 1, 1, 1, 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}}, {{1, 0, 0, 1, 1, 1, 1, 1}, {0, 0, 0, 0, 0, 0, 0, 0}, // primul nivel, a șasea scenă {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, { 1, 1, 1, 1, 1, 0, 0, 1}, {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, 1, 1, 1, 1, 1, 1}, // primul nivel, a șaptea scenă {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0 }, {1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 1, 1}, // primul nivel, opt scenă {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}, {1, 1, 1, 1, 1, 1, 1, 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}}}, void setup () {initialize_modules (); // porniți și setați toate cele patru module led start_level (0); bucla void () {move_player (); // începe bucla verificând dacă jucătorul se mișcă dacă (coliziune ()) {// verifică nivelul de coliziune = 0; // dacă coliziune este adevărată, resetați nivelul start_level (nivel); // reporniți jocul} else if (delay_count == obstacle_delay) {// if no collision move obstacle every other delay moveobstacle (); delay_count = 0; } else else_count ++; întârziere (întârziere); // întârziere în funcție de viteza jocului}
Și acesta este primul obstacol! Dacă te plictisești de acest lucru ca prim nivel, atunci poți oricând să schimbi octeții, amintește-ți că trebuie să ai opt scene diferite! Să continuăm cu pasul următor, detectarea coliziunilor!
Pasul 6: Detectarea coliziunilor
Acest pas este o altă parte importantă a jocului, fără ca acesta să nu fie prea mare provocare! ai putea pur și simplu să îți croiești drum printre obstacole fără a avea consecințe! nu ar fi foarte distractiv nu? deci hai să facem jocul mai provocator (și mult mai distractiv!) prin adăugarea acestei secțiuni a programului:
bucla nulă () {
move_player (); // începe bucla verificând dacă jucătorul se mișcă dacă (coliziune ()) {// verifică nivelul de coliziune = 0; // dacă coliziune este adevărată, resetați nivelul start_level (nivel); // reporniți jocul} else if (delay_count == obstacle_delay) {// if no collision move obstacle every other delay moveobstacle (); delay_count = 0; } else else_count ++; întârziere (întârziere); // întârziere în funcție de viteza jocului} int collision () {// verificați dacă jucătorul a lovit un obstacol în modul scene = players_x / 8; coloană = jucători_x% 8; rând = jucători_y; if (modul> 0) if (obstacol [nivel] [scenă] [coloană] [rând] == 1) // dacă poziția jucătorului este aceeași cu întoarcerea obstacolului (1); // coliziune detectată return true return (0); // fără coliziune returnare falsă}
Și iată-te! acum vă puteți bucura de joc mult mai mult! Acum am să vă arăt cum să programați ultimele două niveluri ale jocului! aproape ați terminat cu acest instructable și sunt sigur că sunteți gata să-l încercați!
Pasul 7: Ultimele două niveluri
Veneau la sfârșitul instructabilului, aceste două niveluri sunt tot ce aveți nevoie pentru a termina acest joc. Apoi, puteți încerca singur! aici este codul:
byte obstacle [LEVELS] [SCENES] [COLUMNS] [ROWS] = {// al doilea și al treilea nivel, 8 scene, 8 coloane, 8 rânduri
{{{1, 0, 0, 0, 0, 0, 0, 1}, // al doilea nivel, prima scenă {0, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, { 0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 0}, {1, 0, 0, 0, 0, 0, 0, 1}}, {{1, 1, 0, 0, 0, 0, 0, 1}, // al doilea nivel, a doua scenă {0, 0, 1, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0, 0 }, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 0, 1, 1}}, {{0, 1, 0, 0, 0, 0, 0, 0}, // al doilea nivel, a treia scenă {0, 0, 1, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 1, 1, 1, 0}, {0, 1, 1, 1, 1, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0, 1, 0}}, {{0, 0, 1, 0, 0, 0, 0, 0}, // al doilea nivel scena a patra {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {0, 1, 1, 1, 1, 0, 1, 0}, {0, 1, 0, 1, 1, 1, 1, 0}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}}, {{0, 0, 0, 1, 0, 0, 0, 0}, // al doilea nivel, fif scena a {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 0, 0, 1}, {1, 0, 0, 1, 1, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // al doilea nivel, a șasea scenă {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1, 1}, {0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 1, 0, 0}, // al doilea nivel, a șaptea scenă {0, 0, 0, 0, 0, 1, 0, 0}, {1, 1, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 1, 1}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 0, 0, 1, 0}, // al doilea nivel a opta scenă {1, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 1, 1}, {0, 1, 0, 0, 0, 0, 0, 0}}}, {{{0, 1, 0, 0, 0, 0, 0, 1}, // al treilea nivel, prima scenă {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0} }, {{0, 0, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a doua scenă {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a treia scenă {0, 0, 0, 1, 0, 0, 1, 0}, { 0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a patra scenă {1, 0, 0, 1, 0, 0, 1, 0 }, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a cincea scenă {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a șasea scenă {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}, {{0, 1, 0, 0, 1, 0, 0, 1}, // al treilea nivel, a șaptea scenă {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}}, {{0, 0, 0, 0, 1, 0, 0, 0}, // al treilea nivel, scena a opta { 1, 0, 0, 0, 0, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 0, 0, 1, 0}}}};
Si asta e! ești pregătit să încerci să finalizezi cel mai greu joc din lume. De asemenea, codul complet Arduino este atașat mai jos.
Recomandat:
Cel mai mic difuzor Bluetooth din lume din piese vechi: 8 pași (cu imagini)
Cel mai mic difuzor Bluetooth din lume de la piese vechi: dacă ți-a plăcut acest proiect, ia în considerare votarea acestuia pentru a câștiga concursul Trash to Treasure aici -https: //www.instructables.com/contest/trashytreasure2020/ În acest instructiv vei învăța cum să faci un difuzor bluetooth de casă foarte mic, care
Cultivarea mai multor salată în spațiu mai mic sau Cultivarea salatei în spațiu, (mai mult sau mai puțin) .: 10 pași
Cultivarea mai multor salată în spațiu mai mic sau … Cultivarea salată în spațiu, (mai mult sau mai puțin). Nu aș putea fi mai încântat să proiectez pentru producția de culturi spațiale și să postez primul meu Instructable. Pentru a începe, concursul ne-a cerut
Întoarce-l! - Cel mai prost joc din lume ?: 7 pași (cu imagini)
Întoarce-l! - Cel mai prost joc din lume ?: Origini: Acesta este un joc pe care l-am dezvoltat în câțiva ani 2018-2019. Acesta a fost inițial numit „Stupid Flip”. și am ieșit din interesul meu de a crea jocuri interactive simple și distractive care ar putea fi folosite și pentru predarea codării. Aceasta este abo
Think Geek Retro Bluetooth Receptor cu greutate rapidă Mod. (Pentru că mai greu este mai bine): 3 pași
Think Geek Receptor Bluetooth retro Mod greutate rapidă. (Pentru că Greutatea este mai bună): adăugați o greutate suplimentară la receptorul dvs. Think Geek Retro Bluetooth. Pentru că heft = calitate. Cel puțin în retro-land.Cerințe: 5 plăci de pescuit de 3/4 inch Un pistol cu adeziv fierbinte Telefonul Acesta este un mod ușor și nu ar trebui să dureze mai mult de o jumătate de oră. Tehnologie mai distractivă
Cea mai subțire brățară din piele programabilă din lume !: 6 pași (cu imagini)
Cea mai subțire brățară din piele programabilă din lume !: Button-schemer, de Aniomagic, este un mic widget atât de uimitor. Este un cititor de programe ambientale de mărimea unui nichel, care este programabil cu blițuri de lumină temporizate special. Cu ea, vom face cea mai subțire brățară programabilă din lume. Am