BlackJack
Descriere generala
Cunoscut și sub numele de 21, este un joc des întâlnit în cazinouri. Jocul a câștigat popularitate deoarece este ușor de jucat, jucătorul ce are suma cărților 21 sau cel mai aproape de 21 câștigă.
Jucatorul primeste la inceput 2 carti cu valorile cuprinse intre 1 si 11 (11 este asul). El poate sa aleaga la fiecare pas daca mai vrea sau nu o carte; pentru a castiga trebuie ca suma tuturor cartilor sa fie in intervalul [18, 21]. Voi folosi un ecran pe care voi afisa cartile si, in final, daca s-a castigat sau s-a pierdut.
Descrierea generala a jocului se afla la linkul: Blackjack
Implementare hardware
Pentru realizarea proiectului, am mai creat o placuta suplimentara, pe langa placuta de baza:

Apoi am conectat placuta de extensie la cea de baza, cu ajutorul unor cabluri:
Ecranul Nokia 3310:
Piesele utilizate pentru conectarea placutei de baza cu LCD-ul Nokia 3310 sunt urmatoarele:
5 rezistente de 1k8
5 rezistente de 3k3
2 diode 1N4148
1 dioda Zener 3v3 (sa nu se arda ecranul daca una din rezistente nu limiteaza curentul)
1 condensator 10uF
3 butoane: Yes, No, Reset
pini
fire de legatura
LCD-ul Nokia 3310 functioneaza la o tensiune de 2.7 - 3.3V; de aceea au fost folosite niste divizoare de tensiune pentru pinii SCK (clock), SDIN (data), D/C (data/cmd), SCE (enable), RES (reset). Pinul GND este conectat la GND de pe placuta si pinul VOUT este conectat la condensatorul de 10uF (care este conectat la masa). S-a protejat ecranul printr-o dioda Zener de 3V3.
Conectarea ecranului cu atmega16:
SCK = PC7
SDIN = PC6
D/C = PC5
SCE = PC4
RES = PC3
Conectarea butoanelor cu atmega16:
Yes = PA2
No = PA3
Reset = PA4
Implementare software
Implementat in C.
Mediul de dezvoltare utilizat: Notepad++, Visual C++ 2008.
Am folosit libraria pcd8544.h
Implementare BlackJack:
am folosit niste functii deja definite pentru un lcd de Nokia
am definit structura unui dreptunghi (carte[][]), in care am considerat pixelii de desenat ca fiind 1 (ce nu e de desenat e 0)
initButtons(): initializeaza portul A, cu pinii corespunzatori: 0 pentru Reset, 1 pentru Yes, 2 pentru No
GetButton(): verifica ce buton a fost apasat, pentru a sti intentiile jucatorului
blackZero(): initializeaza la 0 toata structura de carte (toate elementele din matrice sunt 0)
blackInit(unsigned char val): pornind de la structura matricei carte[][], care initial are toate valorile 0, incep sa marchez ce pixeli trebuie desenati; am gandit ca o carte sa aiba dimensiunea de 9×12 (tot ecranul Nokia are 84×48); vreau sa i se ofere jucatorului maxim 6 carti, toate puse in linie; in dreapta sus am pus o carte speciala, care are ca simbol notat pe ea ”?” ⇒ inseamna ca ar putea sa mai primeasca o carte; dupa ce am marcat conturul unei carti, in functie de ce valoare are inauntru, am marcat pixelii care vor forma numarul; numarul este format ca si conturul, din puncte care formeaza linii; in functie de valoarea lui val, se va desena in contur numarul.
blackDraw(unsigned char val): apeleaza functia blackInit, pentru a vedea ce carte trebuie desenata; aici, daca un element din matrice este 1, se va apela functia LCD_setpixel; pe masura ce apelez blackDraw in main, cartile de vor aseza la dreapta anterioarei, pe acelasi Y, deci numai X se va modifica.
blackDrawWhenever(unsigned char val): deseneaza mereu cartea din dreapta sus
reset(): se poate apasa butonul de reset; atunci jocul o ia de la inceput: se afiseaza 2 carti, se afiseaza cartea din dreapta, score-ul devine 0, nu e nici un buton apasat.
myRand(): imi calculeaza niste numere random, intre 1 si 11, care reprezinta valorile cartilor.
main(): afisez 2 carti pe ecran, cartea din dreapta sus, score-ul se calculeaza ca suma a celor 2 carti; daca e 21 din prima, jucatorul castiga si se afiseaza pe ecran “Blackjack”; daca nu, jucatorul poate sa aleaga sa mai primeasca o carte (apasand pe butonul de Yes), sau sa incheie jocul, apasand pe No. Jocul este castigat daca score-ul este in intervalul [18, 21]. Daca nu, jucatorul pierde. Jucatorul poate sa apese si pe butonul de Reset, moment in care jocul o ia de la inceput, cu totul pe 0.
Rezultate obtinute
Concluzii
Ecranul de Nokia a fost greu de gasit si de aceea am folosit un ecran comun cu cativa colegi (la aprobarea asistentei noastre de laborator).
A fost dificila testarea codului, deoarece exista riscul arderii ecranului, daca conectam la o tensiune > 3.3V.
In final, totusi, a mers. Este un BlackJack basic, care nu are cine stie ce grafica, dar afiseaza pe ecran cartile conform descrierii si calculeaza score-ul si stie sa se reseteze.
Bibliografie