X si 0 este unul dintre cele mai cunoscute jocuri ale copilariei.
Proectul a fost conceput pentru a realiza designul hardware si software necesr pentru a juca x si 0 pe ecranul LCD al unui Nokia 3310.
Lista pieselor:
LCD NOKIA 3310
5 rezistente 3.3k
5 rezistente 1.8k
6 butoane
2 switchuri
3 diode 1N4148
Schema placutei:
Limbajul de programare: C
Mediul de dezvoltare: WinAVR Programers Notepad
S-a folosit driverul de la Quantum Torque pentru LCD NOKIA 3310 modificandu-se functia main.c pentru a se putea juca x si 0 pe lcd.
Am legat placuta aditionala pe care am lipit butoanele si LCDul la porturile A si C ale placutei.
Astfel LCDul a fost legat la portul A iar butoanele la portul C
Implementarea
S-au folosit functiile:
void lcd_init(void); - pt initializare lcd
void lcd_contrast(unsigned char contrast); - stabilire contrast
void lcd_clear(void); - stergerea lcd-ului
void lcd_clear_area(unsigned char line, unsigned char startX, unsigned char endX); - stergerea unei portiuni din lcd
void lcd_clear_line(unsigned char line); - stergerea unei linii
void lcd_goto_xy(unsigned char x, unsigned char y); - mutarea cursorului
void lcd_goto_xy_exact(unsigned char x, unsigned char y); - mtarea cursorului
void lcd_chr(char chr); -scrierea unui caracter
void lcd_str(char* str); -scrierea unui sir de caractere
Am definit butoanele:
#define BL PC7 //buton stanga #define BR PC3 //buton dreapta #define BU PC4 //buton sus #define BD PC5 //buton jos #define BO PC6 //buton ok #define SS PC0 //switch start #define SM PC1 //switch pentru modul single/multi player #define BS PC2 //buton reset
S-au adaugat functii precum:
functie de initializare: void init()
printarea tablei de joc la un anumit moment de timp: void printare_matrice()
verificarea daca un jucator a castigat: int check_m(char bb[9],char pl)
intoarce jucatorul opus: char otherplayer(char ch)
functia de minimax:
int minimax(char bb[9],uint8_t occ,uint8_t depth,char ch){ uint8_t score,max=LOSS; uint8_t i; if(check_m(bb,ch)==1) return WIN*(10-depth); if(check_m(bb,ch)==1) return LOSS*(10-depth); if(occ>=9) return DRAW; for(i=0;i<9;i++){ if(bb[i]==' '){ if(ch=='1') bb[i]='x'; else bb[i]='0'; score=-minimax(bb,occ+1,depth+1,otherplayer(ch)); bb[i]=' '; if(score>max){ max=score; if(depth==0){ curI=i; } } } } return max; }
Placuta de baza:
Placuta aditionala:
LCD NOKIA 3310:
Placuta aditionala + LCD:
Intregul proiect:
LCDul in timpul jocului:
Proictul a fost unul interesant, util si deosebit de ceea ce am facut pana acum.