Table of Contents

Cristian-Andrei SANDU (66894) - Minesweeper

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Proiectul consta in implementarea jocului Minesweeper pe LCD. Jucatorul trebuie sa expandeze toate casutele tablei de joc, in afara de bombele ascunse, cu ajutorul hint-urilor numerice care spun cate bombe sunt adiacente unei casute.

Am ales acest proiect pentru ca Minesweeper este un joc care imi place foarte mult si poate fi jucat cu usurinta de oricine.

Descriere generală

Schema bloc:  Schema bloc

Jucatorul interactioneaza cu jocul cu ajutorul a 4 butoane directionale, care muta cursorul in cele 4 directii, un buton pentru a marca bombele si un buton pentru a realiza selectia/expanda patratelul de sub cursor.

Jocul este afisat pe LCD(84×48 pixeli) sub forma unui grid de dimensiuni fixe, cursorul reprezentand un highlight in jurul patratelului selectat.

Hardware Design

Lista de piese:

Schema electrica:

 Schema electrica

Am ales sa folosesc PORTC pentru a conecta display-ul, pentru ca avea pinii dispusi la fel ca cei ai lcd-ului(GND, PC7 cu rezistenta pe traseu pentru backlight, VCC etc.) si PORTA pentru butoane, pentru ca era pe aceeasi parte a placutei.

Software Design

Semnificatia fisierelor

Functiile propriu-zise sunt descrise pe larg in surse.

Design-ul jocului

Jocul contine 6×12 casute in care pot fi bombe, starea fiecarei casute fiind retinuta in structura:

 enum field_state { HIDDEN, CLICKED, FLAGGED };
/* Minefield struct */
typedef struct {
	uint8_t isBomb;
	uint8_t bombCount; /* no. of bombs around this field */
	enum field_state state;
} minefield_t; 

Informatiile despre jocul general fiind retinute intr-o structura de tipul:

/* Game states */
enum game_state { READY, ONGOING, WON, LOST };

/* Game info struct, for easier argument passing */
typedef struct {
	cursor_t cursor;
	minefield_t board[GAME_HEIGHT][GAME_WIDTH];
	enum game_state state;
	uint8_t hidden_count;
	uint8_t flagged_count;
	volatile uint16_t seconds_passed;
} game_info_t; 

Logica este tratata la fiecare apasare de buton, in functie de game_state-ul in care se afla jocul si de butonul apasat:

In partea stanga a ecranului este o zona “rezervata” pentru informatii ce tin de status:

Chestii ce tin de hardware, dar nu se potrivesc la categoria Hardware Design:

Rezultate Obţinute

Rezultatele sunt conform asteptarilor initiale.

Am reusit cu succes sa implementez un joc de minesweeper controlat prin 6 butoane simple si afisat pe un ecran LCD de Nokia, conectat la uController-ul ATMEGA324.

Sunt foarte multumit de cum a iesit partea de software, iar in ce priveste hardware-ul, pe viitor m-as gandi mai mult la cum as atasa display-ul pe placuta de test(aici, pinii “ies prea putin in afara”, si conexiunile cu cablurile mama sunt cam subrede).

img_20170523_234240.jpg img_20170523_234604.jpgimg_20170524_000332.jpg img_20170523_234915.jpg

Concluzii

Nu a fost un proiect indeosebi de dificil, dar mi-a placut sa lucrez la el. Planuiesc ca pe viitor sa mai fac si alte “proiecte”, utilizand microcontroller-ul si placuta de baza, vazand potentialul acestora si fiind incantat de rezultatele obtinute aici.

Download

Arhiva cu proiectul

Jurnal

Bibliografie/Resurse

Resurse software

Resurse hardware