Student: Tănăsescu Robert-Andrei Grupa: 336CC LCD Endless Runner Realizarea și testarea părții software a proiectului a fost făcută pe Arduino IDE pe Windows 10. Pentru a putea compila codul trebuie adăugate cele 4 biblioteci externe în acest IDE folosind funcția Sketch -> Include Library > Add .zip library si alegem calea catre biblioteca in format zip. Dupa aceea apasam pe Upload si incarcam codul pe placuta Arduino si proiectul porneste. LCD Endless Runner este proiectul propus de mine la materia Proiectarea cu Microprocesoare. Acesta reprezintă un joc de tip Endless Runner pe un display LCD 2 linii x 16 coloane și cu afișare scorului pe un DOT MATRIX, fiecare led aprins pe aceasta fiind reprezentat de un obstacol distrus. Liniile de pe LCD reprezintă 2 lane-uri TOP și BOT. În antetul codului, am definit pinii cu care voi conecta componentele la Arduino, o funcție power_funct pentru a ridica un număr la putere, câteva variabile globale utilizate pentru a implementa logica jocului și câteva dot sprites, practic array-uri de bytes care imi vor permite să controlez mai ușor ce se afișează pe DOT MATRIX. În funcția setup setăm pinii de pe Arduino pentru fiecare componentă corespunzător (pentru butoane INPUT_PULLUP pentru a nu arde pinii, pentru LEDURI OUTPUT și pentru joystick și ir-receiver pinii de INPUT) și inițializez lcd-ul I2C și dot matrix-ul. În plus, inițializez și vectorii bot și top care practic descriu harta jocului cu numerele 0, 1, 3 sau 4, 0 reprezentând un spațiu gol , 1 reprezentând spațiu gol unde nu se poate plasa un obstacol, 3 reprezentând un obstacol nedistructibil, iar în final 4 reprezentând un obstacol distructibil. În funcția loop avem 3 cazuri în care ne putem afla. Dacă flag-ul GAME_OVER este -1 înseamnă că suntem în ecranul principal al jocului unde afișăm pe LCD ,prima oară o bară de progres pentru inițializarea proiectului după care afișăm mesajul PRESS ANY KEY TO START! și așteptăm input din partea player-ului folosind fie butoanele, telecomanda IR sau joystick-ul. In plus, aprindem si pe dot matrix LED-urile astfel incat sa afiseze mesajul "DO IT!". Dacă flag-ul GAME_OVER este 0 înseamnă că jocul a început și începem prin a verifica dacă primim vreun input de la joystick, butoane sau IR. Pentru a verifica starea joystick-ului avem 2 variabile XVal si YVal care ne spun in ce pozitie se afla joystick-ul raportat la axele OX si OY. Daca observam ca pe axa OY se fac schimbari inseamna ca se efectueaza comanda de SUS sau JOS , iar daca se modfica valoarea XVal inseamna ca se doreste efectuarea comenzii de atac. Pe partea de IR Receiver, acesta in functie de butonul apasat de telecomanda primeste un cod de la telecomanda. In functie de acel cod ne dam seama ce comanda trebuie efectuata, sus , jos sau atac. Dacă jucătorul apasă comanda de atac, verificăm dacă există un obstacol distructibil în apropierea lui, dacă da înlocuim acel obstacol cu 0 in vectorul de bot sau top în funcție de poziția player-ului, folosim buzzer-ul pentru a reda un sunet specific și aprindem un led pe matricea DOT-MATRIX. Dacă jucătorul ajunge să completeze o linie de pe matrice acesta primește fie un bonus la scor (dacă are 3 viețti fie o viață în plus dacă are mai puțin de 3 vieți). Dacă jucătorul apasă comanda de SUS sau JOS, modificăm variabila player_pos care este 0 dacă player-ul este pe TOP și 1 dacă este pe BOT. Pentru tratarea coliziunii verificăm dacă pe poziția player-ului din vectorii top și bot se află la un moment dat de timp un obstacol, dacă da atunci decrementăm numărul de vieți și stingem un LED dintre cele 3 ale player-ului și buzzer-ul redă un sunet specific pentru coliziunea cu un obstacol. După toate ce s-au parcurs vectorii top și bot ii reinițializăm exact așa cum s-a făcut în setup după care facem refresh la LCD. Apoi, desenăm player-ul în funcție de ultima lui poziție și obstacolele care sunt vizibile la momentul respectiv, deoarece sunt și câteva obstacole generate în avans pentru a face experiența mai cursivă. Dacă flag-ul GAME_OVER devine 1 (atunci când player-ul pierde toate viețile) jocul se oprește, pe LCD se printează mesajul GAME_OVER și scorul obținut de jucător și desenăm pe matrix folosind sprite-ul sprite_over o față tristă pe dot matrix. După aceea așteptăm input de la player prin butoane sau joystick și dacă se acționează o comandă, resetăm toate variabilele globale (inclusiv scorul) la valorile inițiale și ne reîntoarcem în cazul în care avem flag-ul GAME_OVER egal cu 0 și jocul practic reîncepe.