Sistemata al codice e supporto alla tabella di qualunque dimensione

*Ora funziona con una tabella di qualunque grandezza. Il lato della
matrice quadrata è definito con #define M 3. Anche se la tabella è più
grande per vincere basta comunque fare un tris;
*Sistemati alcuni bug minori;
*Reso il codice più pulito;
This commit is contained in:
Rnhmjoj 2012-11-19 16:54:12 +01:00
parent d9b13c8c25
commit 17aa812f23
2 changed files with 232 additions and 231 deletions

12
main.c
View File

@ -8,14 +8,14 @@ int main (){
/*Menu d'inizio*/ /*Menu d'inizio*/
system(clear); system(clear);
printf(SOTTOLINEATO GIALLO"\n Tris in stile C \n\n" RESET BIANCO); printf(SOTTOLINEATO GIALLO"\n Tris in stile C \n\n" RESET BIANCO);
printf(ROSSO " [1]"RESET BIANCO" Partita con 2 giocatori\n"); printf(ROSSO" [1]"RESET BIANCO" Partita con 2 giocatori\n");
printf(ROSSO " [2]"RESET BIANCO" Partita singolo giocatore\n"); printf(ROSSO" [2]"RESET BIANCO" Partita singolo giocatore\n");
if(!os) if(!os)
printf(ROSSO " [3]"RESET BIANCO" Modalit%c di input\n",133); printf(ROSSO" [3]"RESET BIANCO" Modalit%c di input\n",133);
else else
printf(ROSSO " [3]"RESET BIANCO" Modalità di input \n"); printf(ROSSO" [3]"RESET BIANCO" Modalità di input \n");
printf(ROSSO " [4]"RESET BIANCO" Informazioni\n"); printf(ROSSO" [4]"RESET BIANCO" Informazioni\n");
printf(ROSSO " [5]"RESET BIANCO" Esci\n"); printf(ROSSO" [5]"RESET BIANCO" Esci\n");
scanf("%d",&scelta); scanf("%d",&scelta);
switch(scelta){ switch(scelta){
/*case per la partita con 2 giocatori*/ /*case per la partita con 2 giocatori*/

427
tris.h Normal file → Executable file
View File

@ -38,23 +38,23 @@
#include <unistd.h> #include <unistd.h>
int mgetchar(void); int mgetchar(void);
int mgetchar(){ int mgetchar(){
char buf = 0; char buf=0;
struct termios old = {0}; struct termios old={0};
if (tcgetattr(0, &old) < 0) if(tcgetattr(0,&old)<0)
perror("tcsetattr()"); perror("tcsetattr()");
old.c_lflag &= ~ICANON; old.c_lflag&=~ICANON;
old.c_lflag &= ~ECHO; old.c_lflag&=~ECHO;
old.c_cc[VMIN] = 1; old.c_cc[VMIN]=1;
old.c_cc[VTIME] = 0; old.c_cc[VTIME]=0;
if (tcsetattr(0, TCSANOW, &old) < 0) if(tcsetattr(0,TCSANOW,&old)<0)
perror("tcsetattr ICANON"); perror("tcsetattr ICANON");
if (read(0, &buf, 1) < 0) if(read(0,&buf,1)<0)
perror ("read()"); perror("read()");
old.c_lflag |= ICANON; old.c_lflag|=ICANON;
old.c_lflag |= ECHO; old.c_lflag|=ECHO;
if (tcsetattr(0, TCSADRAIN, &old) < 0) if(tcsetattr(0,TCSADRAIN,&old)<0)
perror ("tcsetattr ~ICANON"); perror("tcsetattr ~ICANON");
return (buf); return (buf);
} }
#endif #endif
@ -78,260 +78,261 @@
int i,k; int i,k;
int giocatore,scelta,mossa; int giocatore,scelta,mossa;
int tabella[M][M]; int tabella[M][M];
int tastierino=1; int tastierino=0;
/*Funzioni*/ /*Funzioni*/
void stampa(){ void stampa(){
int i,k; int i,k;
printf("\n\n\n"); printf("\n\n\n");
for(i=0;i<M;i++) { for(i=0;i<M;i++) {
printf(RESET" "); printf(RESET" ");
for(k=0; k<M;k++) { for(k=0;k<M;k++) {
if(tabella[i][k]==1) if(tabella[i][k]==1)
printf(GIALLO" O "); printf(GIALLO" O ");
else { else {
if(tabella[i][k]==2) if(tabella[i][k]==2)
printf(ROSSO" X "); printf(ROSSO" X ");
else else
printf(BIANCO" . "); printf(BIANCO" . ");
} }
} }
printf("\n\n"); printf("\n\n");
} }
printf("\n"); printf("\n");
} }
int controlla(int giocatore){ int controlla(int giocatore){
if(tabella[0][0]==giocatore&&tabella[1][1]==giocatore&&tabella[2][2]==giocatore) for(i=0;i<M;i++){
return 1; if(tabella[i][i]==giocatore&&tabella[i+1][i+1]==giocatore&&tabella[i+2][i+2]==giocatore)
if(tabella[2][0]==giocatore&&tabella[1][1]==giocatore&&tabella[0][2]==giocatore)
return 1;
for(i=0;i<3;i++){
if(tabella[i][0]==giocatore&&tabella[i][1]==giocatore&&tabella[i][2]==giocatore)
return 1; return 1;
if(tabella[0][i]==giocatore&&tabella[1][i]==giocatore&&tabella[2][i]==giocatore) if(tabella[i+2][i]==giocatore&&tabella[i+1][i+1]==giocatore&&tabella[i][i+2]==giocatore)
return 1; return 1;
} }
return 0; for(i=0;i<M;i++){
for(k=0;k<M;k++)
if(tabella[i][k]==giocatore&&tabella[i][k+1]==giocatore&&tabella[i][k+2]==giocatore)
return 1;
for(k=0;k<M;k++)
if(tabella[k][i]==giocatore&&tabella[k+1][i]==giocatore&&tabella[k+2][i]==giocatore)
return 1;
}
return 0;
} }
int minimax(int giocatore, int profondita){ int minimax(int giocatore, int profondita){
if(controlla(2))
if(controlla(2)) return INT_MAX;
return INT_MAX; if(mossa==M*M)
if(mossa==M*M) return 0;
return 0; int res,tmp;
int res, tmp; if(giocatore==1){
if(giocatore==1){ res=1;
res=1; for(i=0;i<M;i++){
for(i=0;i<M;i++){ for(k=0;k<M;k++){
for(k=0;k<M;k++){ if(!tabella[i][k]){
if(!tabella[i][k]){ tabella[i][k]=1;
tabella[i][k]=1; if(controlla(1)&&!profondita==20){
if(controlla(1)){ tabella[i][k]=0;
if(profondita==20){ return INT_MIN;
tabella[i][k]=0;
return INT_MIN;
}
else
res-=2;
} }
else if((tmp=minimax(2, profondita - 1))<res) else if((tmp=minimax(2,profondita-1))<res)
res=tmp;
else
res-=2;
tabella[i][k]=0;
}
}
}
}
else{
res=-1;
for(i=0;i<M;i++){
for(k=0;k<M;k++){
if(!tabella[i][k]){
tabella[i][k]=2;
if(controlla(2))
res+=2;
else if((tmp=minimax(1,profondita-1))>res)
res=tmp; res=tmp;
tabella[i][k]=0; tabella[i][k]=0;
} }
} }
} }
}
else{
res=-1;
for(i=0;i<M;i++){
for(k=0;k<M;k++){
if(!tabella[i][k]){
tabella[i][k]=2;
if(controlla(2))
res+=2;
else if((tmp=minimax(1, profondita - 1))>res)
res=tmp;
tabella[i][k]=0;
}
}
}
} }
return res; return res;
} }
void facile() { void facile() {
int a,b; int a,b;
do{ do{
randomize; randomize;
a=random(M); a=random(M);
b=random(M); b=random(M);
}while(tabella[a][b]==1||tabella[a][b]==2); }while(tabella[a][b]==1||tabella[a][b]==2);
tabella[a][b]=2; tabella[a][b]=2;
} }
void medio(){ void medio(){
int max=INT_MIN,mi=1,mk=1,t; int max=INT_MIN,mi=1,mk=1,t;
for(i=0;i<M;i++){ for(i=0;i<M;i++){
for(k=0;k<M;k++){ for(k=0;k<M;k++){
if(!tabella[i][k]){ if(!tabella[i][k]){
tabella[i][k]=2; tabella[i][k]=2;
t=minimax(1, 10); t=minimax(1, 10);
if(t>max){ if(t>max){
max=t; max=t;
mi=i; mi=i;
mk=k; mk=k;
} }
tabella[i][k]=0; tabella[i][k]=0;
} }
} }
} }
stampa(); stampa();
tabella[mi][mk]=2; tabella[mi][mk]=2;
} }
void difficile(){ void difficile(){
int max=INT_MIN,mi=1,mk=1,t; int max=INT_MIN,mi=1,mk=1,t;
for(i=0;i<M;i++){ for(i=0;i<M;i++){
for(k=0;k<M;k++){ for(k=0;k<M;k++){
if(!tabella[i][k]){ if(!tabella[i][k]){
tabella[i][k]=2; tabella[i][k]=2;
t=minimax(1,20); t=minimax(1,20);
if(t>max){ if(t>max){
max=t; max=t;
mi=i; mi=i;
mk=k; mk=k;
} }
tabella[i][k]=0; tabella[i][k]=0;
} }
} }
} }
tabella[mi][mk]=2; tabella[mi][mk]=2;
} }
void pausa() { void pausa() {
do{ do{
getchar(); getchar();
}while ((c= getchar()) != '\n' && c!= EOF); }while ((c= getchar()) != '\n' && c!= EOF);
} }
void vuota() { void vuota() {
for(i=0;i<M;i++) { for(i=0;i<M;i++) {
for(k=0;k<M;k++) for(k=0;k<M;k++)
tabella[i][k]=0; tabella[i][k]=0;
} }
} }
void leggimossa(){ void leggimossa(){
int tasto=0; int tasto=0;
fflush(stdin); fflush(stdin);
if(tastierino==1){ if(tastierino==1){
do{ do{
tasto=0; tasto=0;
fflush(stdin); fflush(stdin);
if(scelta==2) if(scelta==2)
printf(GIALLO" Fai la tua mossa:\n"RESET BIANCO); printf(GIALLO" Fai la tua mossa:\n"RESET BIANCO);
else else
printf(GIALLO" Gioca il giocatore %d.\n Fai la tua mossa:\n"RESET BIANCO,giocatore); printf(GIALLO" Gioca il giocatore %d.\n Fai la tua mossa:\n"RESET BIANCO,giocatore);
if(os) if(os)
tasto=mgetchar(); tasto=mgetchar();
else else
do{ do{
tasto=getch(); tasto=getch();
}while(kbhit()); }while(kbhit());
switch(tasto){ switch(tasto){
case 49:{ case 49:{
i=2; i=2;
k=0; k=0;
break; break;
} }
case 50:{ case 50:{
i=2; i=2;
k=1; k=1;
break; break;
} }
case 51:{ case 51:{
i=2; i=2;
k=2; k=2;
break; break;
} }
case 52:{ case 52:{
i=1; i=1;
k=0; k=0;
break; break;
} }
case 53:{ case 53:{
i=1; i=1;
k=1; k=1;
break; break;
} }
case 54:{ case 54:{
i=1; i=1;
k=2; k=2;
break; break;
} }
case 55:{ case 55:{
i=0; i=0;
k=0; k=0;
break; break;
} }
case 56:{ case 56:{
i=0; i=0;
k=1; k=1;
break; break;
} }
case 57:{ case 57:{
i=0; i=0;
k=2; k=2;
break; break;
} }
}
if(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M){
system(clear);
stampa();
printf(GRASSETTO ROSSO"\n Mossa non valida,riprova.\n\n"RESET BIANCO);
} }
}while(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M); if(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M){
}
else{
do{
if(scelta==2)
printf(GIALLO" Tocca a te.\n Inserisci coordinate della mossa"ROSSO"[Riga,colonna]:\n" RESET BIANCO);
else
printf(GIALLO" Gioca il giocatore %d.\n Inserisci coordinate della mossa"ROSSO"[Riga,colonna]:\n" RESET BIANCO,giocatore);
scanf("%d,%d",&i,&k);
if(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M){
system(clear); system(clear);
stampa(); stampa();
printf(GRASSETTO ROSSO"\n\n Coordinate non valide,riprova.\n\n\n"RESET BIANCO); printf(GRASSETTO ROSSO"\n Mossa non valida,riprova.\n\n"RESET BIANCO);
} }
}while(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M); }while(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M);
system(clear); }
} else{
do{
if(scelta==2)
printf(GIALLO" Tocca a te.\n Inserisci coordinate della mossa"ROSSO"[Riga,colonna]:\n" RESET BIANCO);
else
printf(GIALLO" Gioca il giocatore %d.\n Inserisci coordinate della mossa"ROSSO"[Riga,colonna]:\n" RESET BIANCO,giocatore);
scanf("%d,%d",&i,&k);
if(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M){
system(clear);
stampa();
printf(GRASSETTO ROSSO"\n\n Coordinate non valide,riprova.\n\n\n"RESET BIANCO);
}
}while(tabella[i][k]==1||tabella[i][k]==2||i<0||k<0||i>=M||k>=M);
system(clear);
}
} }
void aspetta(int t){ void aspetta(int t){
time_t Ti,Tf; time_t Ti,Tf;
time(&Ti); time(&Ti);
do{ do{
time(&Tf); time(&Tf);
}while(difftime(Tf,Ti)<t); }while(difftime(Tf,Ti)<t);
} }
void spinner(int tempo) { void spinner(int tempo) {
char spinner[] = "/-\\|"; char spinner[] = "/-\\|";
printf(GIALLO"\n "); printf(GIALLO"\n ");
for (int i=0; i<(tempo*10);i++){ for (int i=0; i<(tempo*10);i++){
putchar(spinner[i%4]); putchar(spinner[i%4]);
fflush(stdout); fflush(stdout);
usleep(200000); usleep(200000);
putchar('\b'); putchar('\b');
} }
printf(RESET); printf(RESET);
putchar(' '); putchar(' ');
} }