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*/

59
tris.h Normal file → Executable file
View File

@ -38,22 +38,22 @@
#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);
} }
@ -78,7 +78,7 @@
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(){
@ -86,7 +86,7 @@
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 {
@ -102,42 +102,43 @@
} }
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++){
if(tabella[i][i]==giocatore&&tabella[i+1][i+1]==giocatore&&tabella[i+2][i+2]==giocatore)
return 1; return 1;
if(tabella[2][0]==giocatore&&tabella[1][1]==giocatore&&tabella[0][2]==giocatore) if(tabella[i+2][i]==giocatore&&tabella[i+1][i+1]==giocatore&&tabella[i][i+2]==giocatore)
return 1; return 1;
for(i=0;i<3;i++){ }
if(tabella[i][0]==giocatore&&tabella[i][1]==giocatore&&tabella[i][2]==giocatore) 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; return 1;
if(tabella[0][i]==giocatore&&tabella[1][i]==giocatore&&tabella[2][i]==giocatore) for(k=0;k<M;k++)
if(tabella[k][i]==giocatore&&tabella[k+1][i]==giocatore&&tabella[k+2][i]==giocatore)
return 1; return 1;
} }
return 0; 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)){ if(controlla(1)&&!profondita==20){
if(profondita==20){
tabella[i][k]=0; tabella[i][k]=0;
return INT_MIN; return INT_MIN;
} }
else if((tmp=minimax(2,profondita-1))<res)
res=tmp;
else else
res-=2; res-=2;
}
else if((tmp=minimax(2, profondita - 1))<res)
res=tmp;
tabella[i][k]=0; tabella[i][k]=0;
} }
} }
@ -151,7 +152,7 @@
tabella[i][k]=2; tabella[i][k]=2;
if(controlla(2)) if(controlla(2))
res+=2; res+=2;
else if((tmp=minimax(1, profondita - 1))>res) else if((tmp=minimax(1,profondita-1))>res)
res=tmp; res=tmp;
tabella[i][k]=0; tabella[i][k]=0;
} }