#include #include #include #include char map[9]; //variabile globale che mostra la mappa //0=' ' 1='x' -1='o' void show_map() //funzione che mostra le caselle { char map2[9]; //mappa di caratteri (non di numeri come prima..) for (int i=0;i<9;i++) //creo la mappa di caratteri... switch(map[i]) { case 0: map2[i]=' '; break; case -1: map2[i]='o'; break; case 1: map2[i]='x'; break; } system("cls"); //pulisco lo schermo...stampo la tabelluzza printf("\n\t%c | %c | %c",map2[0],map2[1],map2[2]); printf("\n\t---------"); printf("\n\t%c | %c | %c",map2[3],map2[4],map2[5]); printf("\n\t---------"); printf("\n\t%c | %c | %c",map2[6],map2[7],map2[8]); } //ritorna se si è vinto //prende come argomento il giocatore da esaminare (ng=1 (giocatore 1) ng=2 (giocatore 2 )) char vittoria(int ng) { if (map[0]!=0 && map[1]!=0 && map[2]!=0 && map[3]!=0 && map[4]!=0 && map[5]!=0 && map[6]!=0 && map[7]!=0 && map[8]!=0 ) return -1; //se tutte le caselle sono piene la partita finisce pari //e ritorna -1 return ( (map[0]==ng && map[1]==ng && map[2]==ng) ||(map[3]==ng && map[4]==ng && map[5]==ng) ||(map[6]==ng && map[7]==ng && map[8]==ng) ||(map[0]==ng && map[3]==ng && map[6]==ng) ||(map[1]==ng && map[4]==ng && map[7]==ng) ||(map[2]==ng && map[5]==ng && map[8]==ng) ||(map[0]==ng && map[4]==ng && map[8]==ng) ||(map[2]==ng && map[4]==ng && map[6]==ng)? 1:0 ); //se ng vince ritorna 1, 0 altrimenti } //ALGORITMO MINI MAX int better(int ng) //ritorna se il giocatore ng fa una mossa furba o no { //le variabili winner servono a misurare l'intelligenza della mossa int old_winner=-2; //mossa di default:stupida... int winner; //variabile per paragonare la nuova mossa con la vecchia if(vittoria(ng)==1) //se il giocatore ha vinto ritorna 1 return 1; else if(vittoria(ng)==-1) return 0; //se ha pareggiato ritorna 0 for(int i=0;i<9;i++) //per tutte le caselle { if (map[i]!=0) //se la casella è vuota continue; //salta l'iterazione map[i]=ng; //assegna la tabella if(vittoria(ng)==1) //se adesso vincerebbe { //ritorna 1 map[i]=0; return 1; } winner=-better(-ng); //guarda se l'altro può fare una buona mossa //ritorna un numero alto se la mossa è buona //percui si mette un - davanti alla funzione map[i]=0; //rimette la mappa a posto (per ora) if (winner > old_winner) //se questa mossa ha risultati migliori di { //tutte le precedenti... old_winner=winner; //cambia il rilustato } } return old_winner; //ritorna l'intelligenza massima della mossa } //ritorna la casella della mossa migliore //è identico a prima a parte qualche dettaglio... int bestmove(int ng) //parametri:giocatore { int old_winner=-2; //furbizia della mossa... int winner; int best; //indica la posizione migliore dove sistemare la casella for(int i=0;i<9;i++) //scorre la tabella.. { if (map[i]!=0) //idem sopra... continue; map[i]=ng; if(vittoria(ng)==1) { map[i]=0; return i; } winner=-better(-ng); //se better ritorna un numero basso map[i]=0; if (winner > old_winner) { old_winner=winner;//come prima però qui ricorda quale è la posizione della best=i; //mossa migliore } } return best; //ritorna best che la mossa migliore... } int main() //finalmente c'è il nostro amico main() { int i; //la uso per fare un po' di tutto... show_map(); //mostra la mappa... while (1) //ciclo infinito { printf("\n\ngiocatore 1\n"); do i=getchar(); //prende in input un carattere finchè non è un numero while (!isdigit(i)|| !map[i-49]==0); //di quelli vuoti //lo assegno a map[] map[i-49]=1; //ricorda che era un carattere quindi lo trasformo in numero show_map(); //mostro la mappa if (vittoria(1)==1) //controlla se ha vinto... { printf("\n\ngiocatore 1 ha vinto!"); break; } if (vittoria(0)==-1) //controlla se la partita è finita pari... { printf("\n\npartita finita pari!"); break; } printf("\n\ngiocatore 2\n"); //giocatore 2 i=bestmove(-1); //ottiene la mossa migliore map[i]=-1; //assegna il valore show_map(); //mostra la mappa if (vittoria(-1)==1) //controlla se la cpu ha vinto... { printf("\n\ngiocatore 2 ha vinto!"); break; } } printf("\n\n fine\n\n"); //alla fine di tutto... system("pause"); } /* accidenti quanto ho scritto! è raro che io faccia così tanti commenti non fateci l'abitudine...;-) */