Autorul poate fi contactat la adresa: Login pentru adresa
Scopul acestui proiect este realizarea jocului Breakout de la Atari pe o matrice de led 8×8. Am pornit de la ideea ca, jocul fiind un preferat al copilariei mele, ar fi benefic sa realizez acest proiect pentru evolutia mea ca programator. Acest proiect este benefic pentru alte persoane deoarece acestea se pot relaxa luand jocul in mana. Pentru mine a fost proiect greu si m-a fortat sa imi depasesc limitele.
Placa etapa I a fost facauta conform indicatiilor de la laborator
Placa etapa II ⇒
Lista de componenete / Nr. piese
Matrice Led 8×8 → Led rosu → AT-TOM-2088BH-B / 1
Rezistente 1k OHM / 10
Pini Mama / 32
Butoane / 4
Interconexiuni(fire) / 27
Am lucrat pe windows 7 cu utiliatarul sublime. Am compilat cu avr-gcc.
Am folosit libariile “avr/io.h” & “util/delay.h”.
Am decis sa implementez jocul Breakout(Atari). Pentru a indeplini acest scop am lucrat problema mai inati in C, cu afisari la stdout. Majoritatea algoritmului trateaza coliziunile posible ale mingii cu peretii, “brick”-ului si a paltformei. Pe deasupra am considerat ca afisarea treptata a led-urilor va duce la aprinderea unel coloane intregi. Modul cum am rezolvat aceasta prblema a fost sa iau coloana cu coloana si sa afisez toate ledurile din matricea jocului asignate cu 1. La sfarsitul acestui for inchid toate ledurile si trec la urmatoarea coloana. Initial am citit ca ochiul uman nu mai face diferenta de flickering la peste 24 FPS. Am calculat si la delay de 3ms nu se vede. Dar am decis sa las 1ms deoarece nu afecteaza starea matricii. Butoane in sine sunt tratate in modul urmator : daca sunt apasate intra intr-o bucla ce afiseaza cat timp este apsat matricea fara sa afecteze starea mingii. Astfel am descoperit un bug care face ca programul sa se opreasca in while. Nu am gasit o alta rezolvare. In momentul in care jocul se castiga || pierde modul intra in mod stop si trebuie resetata placa.
Surse
⇒ breakout.c
Functii
⇒ void init_map() functia de intializare a matricii din spatele progamului ⇒ int test_ball(int i, int j) returneaza 0 daca poatea sa mearga in directia data sau 1 daca nu
⇒ void move_ball() functia ce trateaza colizunile, se apeleaza reursiv daca nu are drum pentru a schimba directia ⇒ void move(int direction) muta cu ajutorul flagurilor date de butone platforma in stanga si in dreapta
⇒ void enableColumn(int column) cu ajutprul functiei de mai jos aprinde cate un led ⇒ void enableLineRed(int line) cu ajutprul functiei de mai sus aprinde cate un led
⇒ void lightRed(int i, int j) apeleaza cele doua functii de mai sus in ordine ⇒ void lightOff() blocheaza curentul intre PC si PA
⇒ void print_matrix() afiseaza cate o coloana pe rand si le inchide succesiv ⇒ int main (void) functia main ce apleaza functiile de mai sus
Ceea ce am obtinut la finalul acestui proiect este un joc functional de breakout. Dar si o placuta e poate fi reprogramata pentru urmatoarele jocuri : Connect 4, Snake, Tetris, race car, mini_pacman, mini_superMario, etc.
Am intampinat cele mai multe probleme la partea hardware. Deoarece nu m-am informat corespunzator sa cumpar fire conectoare cu pin mama la capat, a trebuit sa lipesc fire direct pe pin, fire ce sunt luate din cablu UTP. Ce as sfatui pe viitori studenti la aceasta materie sa nu se joace cu aceste cabluri deoarece desi se lipesc usor, devin extrem de agasante cand ai un scurt deoarece nu sunt foarte maleabile si am observat au tendinta sa se rupa usor deoarece nu prea sunt elastice. Butoanele pe care le-am cumparat, desi isi fac treaba nu isi justifica banii dati deoarece au constructie ce lasa de dorit si un anumit mod in care ar trebui apasate.
Programul software nu mi-a dat multa bataie de cap, desi a tinut 2 zile redactarea si debugul acestuia. Problema ce a persistat si a fost rezolvata decat in ultimul moment a fost conectarea pinilor. De ce? Deoarece i-am lipit intr-o ordine ce initial o consideram corecta, dar in software a dovedit contrariul. Jocul in sine nu este destul de greu, desi conditiile de coliziuni pentru “brick”-uri nu sunt fidele jocului in sine. Dar simulez detul de bine acest joc.
A fost un proiect interesant, greu, dar care si-a lasat o apmrenta puternica asupra mea. Nu am crezut initial ca il voi termina. Nu am crezut ca v-a fi functional dar am reusit. Desi sunt mai multe proiecte ca acesta, pentru mine totusi este un succes personal.
Arhiva codului sursa catalin_ichimov_332cc_breakout.zip
Schema in eagle proiect.sch