Pentru realizarea componentei software a proiectului, am folosit mediul de dezvoltare Arduino IDE, împreună cu două biblioteci externe: TFT.h și SPI.h. Acestea sunt utilizate pentru afișarea graficii jocului pe un ecran TFT conectat prin interfață SPI, oferind funcționalități de desenare rapidă a textului și formelor.
Execuția codului este structurată în modul următor:
Se declară variabilele globale necesare pentru poziția jucătorului, a glonțului, a inamicilor și a stării jocului (viață, scor, viteză inamic, coliziune).
În funcția setup() se inițializează ecranul TFT, porturile de control pentru LED-uri, precum și sistemul de sunet. Tot aici se generează o valoare aleatorie pentru poziția inamicilor, folosind analogRead() pentru a inițializa randomSeed().
Jocul începe cu un ecran de tip intro, care explică comenzile de control: butoanele A și B mută jucătorul stânga/dreapta, C trage un glonț, iar D începe jocul.
În cadrul funcției loop(), jocul rulează permanent: se citește tastatura, se mișcă inamicul și glonțul, se detectează coliziunile, se redă sunetul și se actualizează scorul și afișajul. Jocul se oprește în cazul în care se pierd toate viețile, afișând mesajul GAME OVER.
Jocul funcționează pe un principiu simplu: jucătorul este poziționat în partea de jos a ecranului și poate trage proiectile pentru a distruge inamicii care cad de sus. La fiecare atingere de jos a unui inamic, scorul crește, iar la intervale fixe, viteza acestora se accelerează. La coliziune directă, jucătorul pierde o viață.
În scopul optimizării performanței și pentru o mai bună înțelegere a hardware-ului, au fost făcute mai multe modificări:
În locul funcției tone(), care este blocantă și abstractă, a fost implementat un sistem propriu de generare a sunetului, folosind Timer2 în mod Fast PWM direct pe pinul OC2B (pinul 3 / PD3). Sunetul este redat atât în mod non-blocking (în timpul jocului), cât și în mod blocking (pentru secvențele de la Game Over). Astfel, s-a reușit reducerea latenței în reacțiile vizuale și sonore.