In cadrul acestui proiect am incercat sa realizez o varianta a jocului Mastermind. In varianta originala, acesta se juca in 2 jucatori, scopul sau fiind de a ghici o combinatie de culori. Unul dintre jucatori ghicea un numar, iar celalalt oferea un feedback, ce continea numarul de culori ghicite si cate dintre acestea sunt pe pozitia corecta.
Am adaptat acest joc, astfel incat jucatorii trebuie sa ghiceasca o combinatie de cifre. Am impus de asemenea constrangerea ca ciferele sa fie distincte si nenule. La inceputul jocului, se alege numarul de cifre al combinatiei, care poate varia intre 3 si 6. De asemenea, se poate alege numarul de incercari pe care jucatorul le are la dispozitie pentru a ghici combinatia corecta.
In privinta implementarii hardware, am realizat 2 extensii pentru placa de baza, una pentru conectarea lcd-ului si una pentru butoane.
Avand in vedere celebra problema a conectarii pinilor lcd-ului, am ales sa realizez o placuta imprimata. Placuta contine circuitele
pe care sunt fixati pinii lcd-ului, precum si diversele componente necesare. Chiar si cu o placuta imprimata, fixare pinilor a fost
mai dificila decat m-am asteptat. Cea mai buna solutie ar fi fost probabil folosirea unor suruburi. Neavand la dispozitie aceasta varianta,
am fixat ecranul cu niste banda si am folosit un pix pentru a apasa pe ecran astfel incat toti pinii sa faca contact (e mai eficient decat suna ).
Aceasta placuta este fixata pe portul B al microcontrollerului.
Am realizat si o placuta ce conecteaza 3 butoane folosite in logica jocului. Aceasta extensie este conectata pe portul C.
Lista completa a componentelor folosite in etapa a doua a proiectului este:
Schema
Tensiunea de alimentare a lcd-ului este de 3.3V. Prin urmare, am folosit 2 diode 1N4148 pentru a limita cei 5V de la microcontroller.
Pentru tensiunea de input pentru LCD am folosit divizor de tensiune cu rezistentele de 1k8 si 3k3.
Butoanele sunt conectate direct, doarece microcontroller-ul include rezistentele de pull-up.
Realizarea partii hardware a fost destul de rapida, o data ce am avut la dispozitie toate componentele si dupa ce am realizat placuta imprimata.
Pentru lcd, am folosit driverul de la 37. Pentru a-l putea folosi, am schimbat o parte din definitiile
din fisierul header, extensia fiind conectata pe portul B. De asemenea, am modificat un pic makefile-ul, care era realizat pentru atmega64.
Ceva probleme am avut cu driverul pentru placuta si nu am putut sa il folosesc pe un sistem de operare pe 64 de biti. Prin urmare, implementarea
software a fost realizata in mare parte intr-o masina virtuala cu un sistem de operare pe 32 de biti (Win Server 2003). In privinta mediului de
dezvoltare, am ales sa lucrez in notepad++. Bineinteles, pentru debug, am folosit lcd-ul (“printf() debugging continues to prove itself indispensable”).
Avand partea hardware functionala, nu am mai fost nevoit sa simulez programul in Proteus.
In privinta logicii jocului, initial am intentionat sa realizez 2 moduri de joc: unul in care jucatorul uman ghiceste si altul in care “AI”-ul ghiceste. Mi s-a parut interesanta o astfel de abordare, de a avea atat perspectiva celui care ghiceste, cat si a celui care ofera feedback-ul. Insa, nu am avut timpul necesar pentru a realiza ambele implementari si am finalizat doar modul de joc in care jucatorul uman ghiceste. In plus, nu sunt sigur daca cele doua moduri de joc nu depasesc impreuna cei 16K.
Din meniurile de inceput, se selecteaza numarul de cifra al numarului(3-6) si numarul maxim de incercari. Jocul efectiv consta in alegerea unui numar si primirea feedback-ului de la AI. Pentru introducerea numarului se folosesc cele 3 butoane, in felul urmator: 2 dintre butoane sunt folosite pentru incrementarea sau decrementarea cifrei de pe pozitia curenta, iar al treilea buton este folosit pentru marcarea cifrei curente si trecerea la selectarea urmatoarei cifre. Poate parea un pic ciudat modul in care am ales sa introduc numerele, dar am preferat sa nu folosesc o tastatura obisnuita, conectata, de exemplu, prin interfata seriala. As fi putut sa folosesc o tastatura numerica, dar mi s-a parut mai amuzanta varianta pe care am ales-o. In plus, nu e deloc dificil de folosit.
De asemenea, jocul este caracterizat prin mai multe stari in care se poate afla programul. Trecerea intre meniurile si starile jocului este realizata prin intermediul unor functii handler, ce trateaza actiunile asupra celor 3 butoane.
if ( state == choose1 ) { ... } else if ( state == player ) { ... } else if ( state == game_over ) { ... } ...
Pentru interfata, am folosit metodele incluse in driverul lcd-ului. Acestea s-au dovedit foarte utile si foarte usor de folosit.
void lcd_clear(void); void lcd_goto_xy(unsigned char x, unsigned char y); void lcd_chr(char chr);
Unul dintre aspectele cele mai interesante a fost generarea numerelor aleatoare. Pentru a realiza aceasta functionalitate, am masurat cu ADC-ul un pin lasat in aer. Valoarea rezultata am folosit-o ca seed pentru generarea numerelor aleatoare (“hardware random number generator”).
uint8_t adc_get(void) { while ( ADCSRA & (1<<ADSC) ) {} uint16_t adc_lo = ADCL; ADCSRA |= (1<<ADSC); return adc_lo; } ... srand(adc_get());
Jocul este functional si chiar distractiv .
Proiectul a fost interesant si placut de realizat, avand in vedere ca nu am intampinat probleme mari, in privinta implementarii hardware si software (am avut un pic noroc ca lcd-ul a functionat fara probleme in timpul dezvoltarii software).
Am intentionat sa realizez un pic mai mult decat imi propusesem initial, insa nu am avut timp. Ar fi interesant in viitor sa termin si celelalte aspecte ale jocului, daca limitarile de spatiu imi vor permite. Cu toate acestea, in momentul de fata, jocul ofera destul de multe optiuni si posibilitati de joc.