Proiectul are ca scop simularea jocului de PC Minesweeper folosind un ecran LCD PCD8544( ecran de Nokia 3310), microcontrolerul ATMega16 si 6 butoane pentru control.
Minesweeper este un joc single-player de logica ce are ca scop descoperirea tuturor minelor de pe plansa fara a “detona” vreo mina. La inceputul jocului, matricea de mine este nedescoperita. Jucatorul trebuie sa descopere, in mod logic, pozitiile tuturor minelor din matrice pe baza casutelor deja descoperite. Acesta trebuie sa selecteze casute, sau sa puna flag-uri pentru a le marca (aceste casute contin mine). In urma selectarii unei casute pot aparea 2 posibilitati :
- Casuta contine o mina, caz in care se termina jocul sau
- Casuta nu contine mina fapt ce va determina afisarea unui numar
Acest numar reprezinta totalitatea minelor aflate in vecinatatea casutei respective.
Jocul se termina in momentul in care este “detonata” o mina sau nu mai sunt casute de descoperit.
Afisarea se face pe un LCD de Nokia 3310 ( PCD8544 ) care dispune de o rezolutie de 48 x 84 pixeli. Datorita rezolutiei ecranului, matricea de zone a fost limitata la dimensiunea 6*6. Jocul are ca obiectiv dezamorsarea unui camp minat. La inceputul jocului se va alege dificultatea (easy,medium,hard), ceea ce va determina numarul de mine din matrice(6,8 sau 10 mine). Dificultatea se alege folosind butonul de flag, iar pentru pornirea jocului se va folosi butonul select. In total utilizatorul dispune de 6 butoane: 4 pentru deplasarea in cadrul matricii de zone, un buton pentru selectarea zonei (select) si un buton pentru marcare zone (flag). La selectarea unei zone, in cazul in care pe acea pozitie nu exista o mina, va aparea o cifra. Acea cifra va determina cate mine sunt in jurul zonei respective. La depistarea unei zone minate, jucatorul o va marca cu un steag. Jocul va lua sfarsit cand se vor deduce toate zonele minate si vor fi insemnate cu flag, sau daca este detonata o mina.
Componente :
- LCD PCD8544 48 x 84 px
- 6 * butoane
- 1 * condensator de 10 μF
- 5 * rez 3k3
- 5 * rez 1k8
- 2 * dioda 1n4007
LCD-ul si butoanele sunt folosite pentru interactiunea cu utilizatorul. Astfel pe LCD este afisata matricea si bombele ramase, iar cu ajutorul butoanelor se poate realiza deplasarea prin matrice, cat si selectarea unei pozitii sau marcarea acesteia. Diodele au fost utilizate pentru reducerea tensiunii de la 5V la 3.6V (desi LCD-ul are nevoie de o tensiune de 3.3V, acesta functioneaza si cu 3.6V).
Dupa pornirea aplicatiei, utilizatorul are posibilitatea de a alege dificultatea jocului. Alegerea o face utilizand butonul de flag, iar pentru inceperea jocului butonul de select. Dupa alegerea optiunii, se initializeaza matricea de mine. Pentru a realiza o configuratie aleatorie, am utilizat random(), iar pentru a initializarea srand am stocat un numar nou in memoria EEPROM la fiecare joc. Urmeaza derularea jocului efectiv. Microcontrolerul verifica daca s-a apasat vreun buton. In caz de apasare se verifica ce buton s-a apasat si se trateaza pentru fiecare in parte astfel:
- Daca s-a apasat LEFT, RIGHT, UP, DOWN atunci se afiseaza elementul anterior in casuta, se modifica indicii de pozitionare si se afiseaza noua pozitie fara casuta.
- Daca s-a apasat SELECT se verifica daca pozitia curenta a fost descoperita anterior. In caz afirmativ, apasarea butonului nu are niciun efect, altfel verifica daca este mina, caz in care se termina jocul, altfel afiseaza numarul.
- Daca s-a apasat FLAG se verifica daca pozitia curenta este inca nedescoperita caz in care verifica daca a fost marcata anterior. Acest lucru duce la demarcarea pozitiei curente, altfel se seteaza flagul si se decrementeaza numarul de bombe curente. Jocul se termina cu succes cat nu mai sunt casute de descoperit. Imaginile de sunt afisate pe LCD au fost stocate static in memoria PROGMEM.
Am folosit WinAvr pentru editarea surselor si au fost compilate cu avr-gcc. De asemenea am realizat simularea aplicatiei in Proteus.
Am reusit sa realizez aplicatia software pe care am testat-o in Proteus. Din pacate nu am reusit sa verific si partea hardware intrucat nu functioneaza LCD-ul.
minesweeper.zip
A fost un proiect interesant chiar daca nu am obtinut rezultatele dorite. Daca ar fi sa mai aleg o data tema de proiect as alege o tema care sa nu foloseasca LCD :D. Am utilizat 2 LCD-uri: primul am reusit sa il ard incercand sa il lipesc, iar al doilea nu functioneaza si nu stiu de ce.