Table of Contents

Introducere

Proiectul reprezintă versiunea electronică a jocului cu avioane, jucat de regulă cu hârtia și pixul. (o variație a jocului Battleship)

Descrierea jocului
Joc cu avioane pe hârtieLa joc participă 2 persoane, fiecare are 3 avioane (a câte 10 pătrățele) de poziționat într-o matrice de 10×10 pătrățele și de îndată ce acestea au fost poziționate, jucătorii incearcă să ghicească pe rând pozițiile avioanelor adversarului. Fiecare jucător încearcă câte o poziție din matrice și adversarul îi spune ce se găsește la poziția respectivă (gol, corpul sau capul avionului). Pentru a câștiga, toate avioanele trebuie “doborâte” înaintea adversarului prin ghicirea celor 3 poziții corespunzătoare pentru capetele avioanelor.

Nu știu cât de util este pentru alții acest proiect, dar noi am căutat ca prin intermediul lui să dobândim cunoștiințe noi intr-o manieră care sa ne distreze și care să ne trezească interesul pentru această latură a științei calculatoarelor.

Descriere generală

Schema bloc

Proiectul conține:

Module hardware

Plăcuța de bază

Plăcuța de extensie

Module software

project.hex - conține toate instrucțiunile necesare pentru joc

Hardware Design

2xLista de piese
Componentă Număr
Rezistență 3K310
Rezistență 30010
Tranzistor10
Convertor BCD CD4028BE1
Push button5
Baretă4
Led100
Placuța de test1
Cablu
Schema electrică pentru plăcuța de bază
|ATMega16Interfața serialăInterfața de programare prin USB
Schema electrică pentru plăcuța de extensie
Convertor BCDButoaneAșezare led-uriTranzistoare

Pentru plăcuța de extensie:

Am considerat 1 convertor BCD și 10 tranzistoare în loc de 2 convertoare BCD pentru că ne-am gândit că vrem să aprindem mai multe led-uri deodată dar ne-am dat seama că mai bine aprindem câte un led pe rând deoarece n-am fi avut destulă intensitate pentru led-uri.

Inițial am vrut să facem cu interfață ethernet, ne-am cumparat tot ce ne trebuia mai puțin mufa magnetică mamă RJ45, mufă pe care nu am găsit-o nicăieri (la momentul respectiv) de aceea am decis că facem partea de rețea prin interfața serială RS232 dar nu știm de ce aceasta nu a mers cum ne așteptam să meargă (ca la etapa 1 a proiectului când a fost testată) și drept urmare am scos circuitul integrat MAX232 și am șuntat curentul electric prin cabluri în pinii respectivi.

Se poate vedea conectarea componentelor electrice și în galeria de poze de la “rezultate obținute” de mai jos.

Software Design

Ne așteptam ca partea de programare să ne ia mai puțin timp decât partea în care a trebuit să conectăm componentele electrice însă se pare că a programa și a ține cont de constrângerile mediului pe care programezi înseamnă ceva mai mult decât a te gândi la niște algoritmi care să-ți rezolve problema.

Jocul a fost gândit în așa fel încât să fie cât mai compact în ceea ce privește folosirea resurselor prin utilizarea unor tipuri de date cât mai mici ca memory footprint, prin scrierea unui cod fără informație redundantă și prin eliminarea codului nefolosit care venea o dată cu header-ele incluse.

Ierahia fișierelor cu dimensiunile lor

void clear_display() // stinge toate led-urile

void my_delay() // stabilește cât ar trebui sa rămână aprinse led-urile

void init_random() // initializeaza / suprascrie seed-ul din memoria EEPROM folosit la generarea unui număr random

void refresh_display() // actualizează display-ul / matricea de led-uri la fiecare intrare în bucla principală conform schimbărilor

uint8_t validate_dot_position(uint8_t x, uint8_t y) // validează poziția unui punct

void draw_dot(uint8_t x, uint8_t y, uint8_t  led_value) // aprinde led-ul corespunzător coordonatelor

void get_plane_dots(dot_t *vect, uint8_t x, uint8_t y, uint8_t dir) // întoarce punctele conținute de un avion dat prin coordonatele mijlocului acestuia

uint8_t validate_plane_position(uint8_t x, uint8_t y, uint8_t dir, uint8_t validate) // validează poziția unui avion

void draw_plane(uint8_t x, uint8_t y, uint8_t dir, uint8_t led_value) // aprinde led-urile corespunzătoare punctelor conținute de avion

dot_t random_cursor_position() // generează un pct de coordonate x, y aleator

dot_t random_plane_position(uint8_t *dir) // generază un pct valid de coordonate x, y aleator pentru un avion

void init_game(uint8_t *start_x, uint8_t *start_y, uint8_t *dir, uint8_t *dot_type, uint8_t *saved_dot_type) // inițializează parametrii jocului

void init_USART() // inițializeaza interfața serială

uint8_t pack_bcd(uint8_t x, uint8_t y) // împachetarea informației transmise 

void unpack_bcd(uint8_t bcd, uint8_t *x, uint8_t *y) // despachetarea informației primite

void usart_send(uint8_t data) // trimite date prin interfața serială

Rezultate Obţinute

În urma muncii depuse am realizat ce ne-am propus, un joc cu avioane pe matrice de leduri; însă placuța cu leduri poate fi folosită și pentru alte jocuri.

Galerie de poze cu plăcuțele realizate

 Rezultatul final  Rezultatul final  Munca din spate  Atelierul  În timpul jocului </aviewer>|

Concluzii

Download

Proiect + Makefile 1)

Jurnal

27 Mai 2010 Am cumpărat componentele electrice. Nu am găsit tot ce ne trebuia.

28 Mai 2010 Ne-am apucat de implementat circuitul electric.

1 Iunie 2010 Am fost să căutam restul componentelor. Tot nu am găsit ce trebuie pentru interfața Ethernet. Am terminat de implementat circuitul electric.

2 Iunie 2010 Ne-am apucat de programare.

4 Iunie 2010 Am terminat cu programarea și am făcut documentația proiectului.

Bibliografie/Resurse

Wiki-ul laboratorului de PM

ATMega16 Datasheet

AVR-Libc API

EEPROM Random Generator

BCD Decoder Datasheet

1) software-ul mai trebuie îmbunătățit pe partea de rețea