Autorul poate fi contactat la adresa: Login pentru adresa
Imi propun implementarea unui joc de Snake care sa aiba urmatoarele functionalitati:
Scopul jocului este sa deplasezi sarpele catre iteme generate pe harta care ii maresc dimensiunea evitand coliziunea cu el insusi sau cu eventuale alte obstacole depinzand de varianta de joc.
Ideea de la care am pornit este jocul Snake. Istoric joc Snake
Jocul Snake poate reprezenta o activitate recreativa.
Componente | Cantitate |
---|---|
ATMega324 | 1 |
Placa de baza | 1 |
Placa de test | 1 |
Modul LCD ST7735R | 1 |
Joystick | 1 |
Buzzer | 1 |
Schema electrica:
Mediu de dezvoltare Proiectul a fost dezvoltat in Atmel Studio 7.0, bazat pe Visual Studio. Ofera optiunea de “Build project”, care genereaza un fisier .hex ce poate fi incarcat direct pe placuta atat din linia de comanda cat si din interfata grafica utilizand HIDBootFlash.
Structura proiect
LCD grafic
LCD-ul folosit are rezoluția 128×160 și este controlat prin controller-ul ST7735R. Interfațarea cu microcontroller-ul se face prin SPI (MOSI/MISO/SCK). Comunicația între microcontroller și controller-ul LCD-ului grafic se face printr-un set de comenzi specificate în datasheet-ul controller-ului LCD. Scheletul laboratorului conține API-ul pentru lucrul cu acest controller în fișierul ST7735R.h. Mai jos sunt câteva dintre funcțiile oferite:
/* Initializeaza Display-ul grafic. */ void ST7735R_Begin(); /* Deseneaza o linie de la (x0, y0) la (x1, y1), avand culoarea data de parametrii r, g, b. */ void ST7735R_Line(int x0, int y0, int x1, int y1, uint8_t r, uint8_t g, uint8_t b); /* Afiseaza un text, incepand de la pozitia (x, y). * Textul are culoarea specificata de pereche (r, g, b). * Background-ul pe care este afisat textul are culoarea (bgR, bgG, bgB). */ void ST7735R_DrawText(int x, int y, const char *text, uint8_t r, uint8_t g, uint8_t b, uint8_t bgR, uint8_t bgG, uint8_t bgB); /* Desenează un cerc cu centrul la coordonatele (x, y), de raza 'radius', cu culoarea specificată. */ void ST7735R_Circle(int x, int y, uint8_t radius, uint8_t red, uint8_t green, uint8_t blue); /* Desenează un cerc cu centrul la coordonatele (x, y) de raza 'radius' și îl umple cu culoarea dată. */ void ST7735R_FilledCircle(int x, int y, uint8_t radius, uint8_t red, uint8_t green, uint8_t blue); /* Este un macro: deseneaza un dreptunghi cu colțul stânga sus dat de (x0, y0) * și colțul dreapta jos dat de (x1, y1). * Dreptunghiul este umplut cu culoarea (r, g, b). */ ST7735R_FillRect(x0, y0, x1, y1, r, g, b);
#ifndef SPI_H #define SPI_H #include <stdint.h> /* SPI config */ #define SPI_PORT PORTB #define SPI_DDR DDRB #define SPI_MISO PB6 #define SPI_MOSI PB5 #define SPI_SCK PB7 void SPI_init(void); uint8_t SPI_exchange(uint8_t data); #endif // SPI_H
Bibliotecile se poat gasi in cadrul laboratorului 5 LCD ST7735R_TFT/SPI - Laborator 5.
Game API
Contine o serie de functii publice sau private prin intermediul caruia se controleaza fluxul jocului. De asemenea, contine structuri definite pentru a realiza o separare si grupare logica a componentelor/proprietatilor anumitor elemente de joc.
In structura game_t se vor retine informatii relevante despre starea jocului precum sarpele, statusul jocului(castigat, pierdut sau inca in desfasurare) si un vector cu itemele consumabile generate pe harta. Sarpele este conceput ca un vector de segmente de tipul segment_t, fiecare segment pastrand informatii privitor la culoare, pozitia pe harta, daca se identifica sau nu cu capul sarpelui, etc. Itemele consumabile sunt caracterizate de structura food_t, aceasta oferind informatii despre positia, culoarea itemului, cat si statusul acestuia, daca este sau nu consumat. Pentru o mai usoara manipulare a componentelor rgb ale culorilor le-am grupat intr-o structura cu 3 campuri asociate acestora.
/**************************************************************************** * Public Functions ****************************************************************************/ void GAME_init(void); void GAME_move_snake(int x, int y); void GAME_loop(void); int GAME_boost(void); int GAME_buzz_delay(void); /**************************************************************************** * Private Functions Prototypes ****************************************************************************/ /* Functii implementate la momentul curent al dezvoltarii jocului */ static void GAME_draw_snake(void); static void GAME_draw_segment(int x, int y, uint8_t r, uint8_t g, uint8_t b); static void GAME_generate_food(int index); static void GAME_draw_food(int index); static void GAME_draw_all_food(void); static void GAME_init_food(void); static void GAME_physics(void); static void GAME_draw_score(void); static void GAME_init_segment(uint8_t head, int pos_x, int pos_y, int index); static int GAME_check_food_collision(void); static int GAME_check_snake_collsion(void); static void GAME_buzzer_morse(int tip_morse); static void GAME_make_sound(int tip_morse, int type);
Joystick Nu a necesitat API specializat,controlul se face in cadrul fisierului sursa ||Game API||. Functia responsabila de miscarea directionata a sarpelui este ||void GAME_move_snake(int x, int y)||, cu parametrii x si y ce reprezinta valori ale inclinarii pe axele Ox/Oy, valori primite de la modului joystick.
In functia main() a jocului se realizeaza initializarile necesare, apelul functiei de initializare a structurilor jocului, si rularea efectiva a jocului intr-o bucla for. Dupa termianarea jocului se vor astepta 4 secunde pana la reinceperea unei noi sesiuni de joc.
1) Conectare ecran LCD, Joystick, buzzer pe placuta de test
2) Placa de baza
3) Proiect hardware complet
4) Implementare software
Realizarea unui astfel de proiect, de o complexitate mai ridicata decat majoritatea proiectelor de pana acum, aduce o satisfactie personala foarte mare. Incepem practic de la 0 si construim pas cu pas produsul finit, atat hardware cat si software, vedem cum munca noastra se transpune intr-un element fizic. O experienta placuta ce a necesitat cercetare extensiva, rabdare si preocupare.
Saptamana 1: Stabilirea temei proiectului, schema bloc si formularea unei liste de piese
Saptamana 2: Finalizarea lipirii componentelor pe placa + incarcare bootloader
Saptamana 3: Achizitionarea componentelor specifice proiectului
Saptamana 4: Asamblarea componentelor finale
Saptamana 5: Realizarea software-ului