Table of Contents

Arduino Cyclone Arcade Game

Nume: Mândruță Cezar-Dan
Grupă: 334CB

Introducere


Proiectul reprezintă o interpretare proprie a unui joc de tip Cyclone, unul din cele mai populare și îndrăgite jocuri arcade din lume. Scopul proiectului este entertainment-ul, însă poate fi folosit și pentru a face profit, păcălindu-ți prietenii să joace pe bani :P.

Descriere generală

Proiectul constă într-un joc arcade în care o lumină se plimbă pe un inel, iar jucatorul trebuie să o oprească atunci când ajunge intr-un interval dat. Jocul are opt nivele. Cu cât jucătorul avansează, cu atât dificultatea crește (intervalul devine mai mic iar viteza cu care se deplasează lumina crește). Un buzzer va scoate sunete diferite atunci cand jucatorul nimerește și atunci când ratează ținta. Nivelul la care se află jucătorul va fi prezentat prin intermediul unei fâșii cu 8 led-uri. Jucătorul va putea opri lumina prin apăsarea unui buton de tip arcade.

Hardware Design

Software Design

Am scris codul în IDE-ul Arduino.
M-am folosit de biblioteca FastLED.h pentru controlul fasiilor de led-uri cu neopixeli WS2812 (atat stick-ul de 8 LED-uri cat si inelul de 48 de LED-uri).

Pentru a permite modificarea facila a parametrilor codului, majoritatea variabilelor au fost definite la inceput ca si macro-uri.

Proiectul functioneaza ca un automat finit de stari, lucru care se poate observa usor din functia loop(). Daca mai tineti minte de la PL (sau LFA mai recent), jocul are un comportament diferit in functie de starea in care se afla.

Cand jocul este la inceput, acesta asteapta ca utilizatorul sa apese butonul pentru a incepe primul nivel. Atata timp cat utilizatorul nu apasa butonul, atat pe inelul de LED-uri cat si pe stick se afiseaza un joc de lumini de tip rainbow swipe (se misca luminile in culorile curcubeului).

Functia aceasta este apelata mereu cand jocul este in desfasurare. In functie de nivelul la care se afla jucatorul, viteza luminii rosii si marimea target-ului variaza (in functie de variabila globala game_state). Am folosit vectori de date pentru a permite folosirea unei singure functii de play_round(), in loc de una pentru fiecare nivel.

Functia aceasta este apelata din functia play_round si realizeaza miscarea luminii rosii cu un pas pe cerc.

Atunci cand jucatorul nimereste sau rateaza tinta, un joc de lumini ce consta in 3 pulsuri de lumina va fi afisat pe inel si un sunet va fi produs de catre buzzer. Daca jucatorul nimereste, lumina va fi verde, iar tonul sunetului va fi unul acut. Daca jucatorul rateaza, lumina va fi rosie, iar tonul va fi unul grav. La fel ca si mai inainte, in loc sa fac 2 functii am scris doar una, iar tonul dat de buzzer si lumina culorilor de pe inel sunt primite ca si parametrii.

Simuleaza starea in care jucatorul nimereste/rateaza tinta. Apeleaza pulse_three_times() cu parametrii corespunzatori.

Cand jucatorul termina toate nivelele se apeleaza aceasta functie.

De fiecare data cand jocul asteapta input de la utilizator, led-ul butonului clipeste. Acest efect l-am obtinut folosind o intrerupere cu timer pentru LED.

Concluzii

Desi stiam ca imi place sa lucrez cu Arduino avand experienta dinainte, nu m-am asteptat sa fie asa addictive proiectul. Am preferat sa lucrez la el puternic in loc sa fac alte teme (la SO si ASC m(). Si jocul in sine e super fun, chiar m-as juca ca sa treaca timpul si sa nu ma simt asa de prost cand procrastinez.

Download

mandruta_cezar-dan_334cb.zip

Jurnal

N-am tinut jurnal sincer si de acum nu are rost sa fabulez pe aici. Am cautat piesele pe Amazon, apoi intr-o zi de munca puternica am terminat partea de hardware. S-au mai rupt si piesele de cateva ori, stie laborantul ca am mers sa lipesc de 3 ori. Proiectul era gata de vreo 2 saptamani dar de abia azi, 27.05.2022, i-am facut si o cutie cocheta dupa cum se poate observa din poza de mai sus.

Bibliografie/Resurse

https://www.hackster.io/mircemk/diy-arduino-cyclone-game-with-ws2812b-led-ring-738c58 https://fastled.io/docs/3.1/index.html

Export to PDF