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.