Ionuţ BACIU (78667) - Fancy snake
Autorul poate fi contactat la adresa: Login pentru adresa
Introducere
Proiectul presupune implementarea unui joc Snake cu un twist: implementarea are ca scop dezvoltarea a mai multor nivele cu grade diferite de dificultate, powerup-uri specifice care pot fi benefice pentru jucător sau nu și un set de vieți. Utilizatorul va putea selecta modul de joc (clasic - jocul original sau fancy - pe nivele). Suplimentar, jocul va avea diferite sunete în funcție de evenimentul întâmpinat (acțiunea din joc, de exemplu eat, gain powerup, death, game lost etc.).
Proiectul este folosit doar în scopuri recreaționale. În funcție de ideile care pot veni pe parcursul dezvoltării, acesta pot diferi din punct de vedere al experienței utilizatorului.
Motivul temei proiectului: folosirea LCD-ului grafic și îmbinarea noțiunilor din teoria jocurilor plus cele dobândite în urma laboratoarelor.
Descriere generală
Hardware Design
Denumire | Număr |
Plăcuță de bază | 1 |
Buzzer | 1 |
Butoane | 6 |
Microcontroller ATmega 324 | 1 |
Display LCD SPI ILI9163 | 1 |
Software Design
<fc #000080>Proiectul a fost realizat în C++ (datorită fișierelor pentru LCD-ul SPI ILI9163)</fc>
<fc #00FF00>Surse:</fc>
digitalpin - folder pentru pinii LCD-ului
ili9166 - folder cu funcșiile LCD-ului
spi - folder pentru SPI
Sursele luate pentru LCD au fost luate de la următoarea adresă: spi
<fc #00FF00>Biblioteci folosite:</fc>
DigitalPin.h (din folderul digitalpin) - pentru pini
ili9163.h (din folderul ili9163) - pentru lcd
font5x8.h (din folderul ili9163) - permite lcd-ului afișarea de caractere
colors.h (din folderul ili9163) - un set de culori folosite în implementare
spi_lib.h (din folderul spi) - pentru inițializarea LCD-ului prin SPI
defines.h - string-uri și int-uri folosite
config.h - configurările necesare pentru inițializarea LCD-ului
song.h - cântecul pe buzzer
main.h - funcțiile folosite în main
Importurile din main.cpp: avr/io.h, util/delay.h, avr/interrupt.h, stdlib.h și string.h
<fc #00FF00>Funcții:</fc>
void init_buttons(void) - inițializarea butoanelor și a led-ului de pe placă
void play(int32_t note, uint32_t len) - funcție pentru redarea unei note
void set_lcd(void) - setarea meniului pe lcd
void about_menu(void) - setarea meniului “About” pe lcd
void display_score(void) - desenarea meniului de scor la terminarea jocului.
void move_square(void) - deplasarea cursorului la apăsarea unui dintre butoanele sus sau jos (PA1 sau PA2)
void init_game(void) - inițializarea datelor pentru joc (lcd-ul, valorile pentru scor, hartă etc.)
void draw_snake_start(void) - desenarea șarpelui în poziția de start
void add_food(int place, int type) - adăugarea unui element de tipul food
int check_for_score(void) - verificare dacă s-a făcut coliziunea cu un element de tipul food
void check_for_collision(void) - verificare coliziuni cu propria coadă
void change_direction(void) - schimbarea de direcție la apăsarea unuia dintre butoanele stânga, jos, sus, dreapta (PA0, PA1, PA2 sau PA3)
void change_game_settings(void) - modificările suferinte la powerup-uri (pentru jocul Advanced)
void draw_snake(void) - desenarea șarpelui la momentul curent pe LCD
void change_tail(void) - resetare coordonate coadă
void move(int type) - mutarea în funcție de tipul de joc
void play_game(int type) - funcția de joc
int main(void) - main-ul
ISR(TIMER0_OVF_vect) - întrerupere pentru buzzer
ISR(PCINT0_vect) - întrerupere pentru butoane, realizată doar pentru ecranul principal
<fc #00FF00>Structuri:</fc>
structura de tipul Food oferă detalii pentru “mâncarea” șarpelui, detaliile fiind coordonatele x, y și tipul
un enum pentru tipul de joc și al ecranului curent (pentru opțiunile meniului)
Rezultate Obţinute
Rezultatul final a fost realizarea jocului clasic Snake cu mai multe tipuri de joc după cum urmează
Small - dimensiunea nu se modifică și nu există powerup-uri
Classic - jocul clasic de Snake
Advanced - powerup-uri (+1p/5p/-5p scor cu +0/+1 dimensiune și resetarea la dimensiunea inițială)
La pornirea proiectului, LCD-ul va arăta meniul principal care conține cele 3 tipuri de joc plus meniul Advanced unde se găsesc detalii despre powerup-uri. Deasemenea există și un cursor care poate fi mutat sus-jos pentru a selecta unul dintre cele patru meniuri. Selectul se va face cu butonul de pe PA0, jos cu PA1 și sus cu PA2. Din meniul de abput se iese apăsând Back, adică butonul PA3.
Jocul se desfășoară apăsând pe cele 4 butoane (PA0, PA1, PA2, PA3). Scorul este înmulțit cu 10 față de valoarea sa reală.
Din meniul de final, cel se scor, se iese apăsând pe butonul PA0 și se revine la meniul principal.
Concluzii
În cocluzie, proiectul realizează un joc de tipul Snake, cu moduri de joc diferinte, care presupune și redarea unei melodii atâta timp cât utilizatorul se află în meniul principal.
Download
Jurnal
22 aprilie - introducere + descriere generală + componente
7 mai - schema proiectului
15 mai - adăugarea codului pentru LCD
17 mai - terminarea jocului folosind delay-uri
18 mai - adăugarea întreruperilor pentru buzzer și butoane
20 mai - terminarea documentului de prezentare al proiectului + modificări
Bibliografie/Resurse
-
-
Biblioteca pentru SPI LCD -
spi
Documentația PDF
* Documentația în format
PDF