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:
parent
d9b13c8c25
commit
17aa812f23
12
main.c
12
main.c
@ -8,14 +8,14 @@ int main (){
|
||||
/*Menu d'inizio*/
|
||||
system(clear);
|
||||
printf(SOTTOLINEATO GIALLO"\n Tris in stile C \n\n" RESET BIANCO);
|
||||
printf(ROSSO " [1]"RESET BIANCO" Partita con 2 giocatori\n");
|
||||
printf(ROSSO " [2]"RESET BIANCO" Partita singolo giocatore\n");
|
||||
printf(ROSSO" [1]"RESET BIANCO" Partita con 2 giocatori\n");
|
||||
printf(ROSSO" [2]"RESET BIANCO" Partita singolo giocatore\n");
|
||||
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
|
||||
printf(ROSSO " [3]"RESET BIANCO" Modalità di input \n");
|
||||
printf(ROSSO " [4]"RESET BIANCO" Informazioni\n");
|
||||
printf(ROSSO " [5]"RESET BIANCO" Esci\n");
|
||||
printf(ROSSO" [3]"RESET BIANCO" Modalità di input \n");
|
||||
printf(ROSSO" [4]"RESET BIANCO" Informazioni\n");
|
||||
printf(ROSSO" [5]"RESET BIANCO" Esci\n");
|
||||
scanf("%d",&scelta);
|
||||
switch(scelta){
|
||||
/*case per la partita con 2 giocatori*/
|
||||
|
451
tris.h
Normal file → Executable file
451
tris.h
Normal file → Executable file
@ -1,13 +1,13 @@
|
||||
#ifndef _TRIS_H_
|
||||
|
||||
|
||||
#define _TRIS_H_
|
||||
|
||||
|
||||
/*Librerie Principali*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
/*Colori ANSI*/
|
||||
#define NERO "\033[22;30m"
|
||||
#define BLU "\033[34m"
|
||||
@ -17,12 +17,12 @@
|
||||
#define RESET "\033[0m"
|
||||
#define GRASSETTO "\033[1m"
|
||||
#define SOTTOLINEATO "\033[4m"
|
||||
|
||||
|
||||
/*Definizioni*/
|
||||
#define random(x) rand() % x
|
||||
#define randomize srand((unsigned)time(NULL))
|
||||
#define M 3
|
||||
|
||||
|
||||
/*Funzione specifiche degli os*/
|
||||
#ifdef __WIN32__
|
||||
|
||||
@ -38,27 +38,27 @@
|
||||
#include <unistd.h>
|
||||
int mgetchar(void);
|
||||
int mgetchar(){
|
||||
char buf = 0;
|
||||
struct termios old = {0};
|
||||
if (tcgetattr(0, &old) < 0)
|
||||
perror("tcsetattr()");
|
||||
old.c_lflag &= ~ICANON;
|
||||
old.c_lflag &= ~ECHO;
|
||||
old.c_cc[VMIN] = 1;
|
||||
old.c_cc[VTIME] = 0;
|
||||
if (tcsetattr(0, TCSANOW, &old) < 0)
|
||||
perror("tcsetattr ICANON");
|
||||
if (read(0, &buf, 1) < 0)
|
||||
perror ("read()");
|
||||
old.c_lflag |= ICANON;
|
||||
old.c_lflag |= ECHO;
|
||||
if (tcsetattr(0, TCSADRAIN, &old) < 0)
|
||||
perror ("tcsetattr ~ICANON");
|
||||
return (buf);
|
||||
char buf=0;
|
||||
struct termios old={0};
|
||||
if(tcgetattr(0,&old)<0)
|
||||
perror("tcsetattr()");
|
||||
old.c_lflag&=~ICANON;
|
||||
old.c_lflag&=~ECHO;
|
||||
old.c_cc[VMIN]=1;
|
||||
old.c_cc[VTIME]=0;
|
||||
if(tcsetattr(0,TCSANOW,&old)<0)
|
||||
perror("tcsetattr ICANON");
|
||||
if(read(0,&buf,1)<0)
|
||||
perror("read()");
|
||||
old.c_lflag|=ICANON;
|
||||
old.c_lflag|=ECHO;
|
||||
if(tcsetattr(0,TCSADRAIN,&old)<0)
|
||||
perror("tcsetattr ~ICANON");
|
||||
return (buf);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*Prototipi*/
|
||||
void vuota(void);
|
||||
void stampa(void);
|
||||
@ -72,266 +72,267 @@
|
||||
void leggimossa(void);
|
||||
void aspetta(int t);
|
||||
void beep(int t);
|
||||
|
||||
|
||||
/*Variabili globali*/
|
||||
char a='a',c;
|
||||
int i,k;
|
||||
int giocatore,scelta,mossa;
|
||||
int tabella[M][M];
|
||||
int tastierino=1;
|
||||
|
||||
int tastierino=0;
|
||||
|
||||
/*Funzioni*/
|
||||
void stampa(){
|
||||
int i,k;
|
||||
printf("\n\n\n");
|
||||
for(i=0;i<M;i++) {
|
||||
printf(RESET" ");
|
||||
for(k=0; k<M;k++) {
|
||||
if(tabella[i][k]==1)
|
||||
printf(GIALLO" O ");
|
||||
else {
|
||||
if(tabella[i][k]==2)
|
||||
printf(ROSSO" X ");
|
||||
else
|
||||
printf(BIANCO" . ");
|
||||
}
|
||||
}
|
||||
printf("\n\n");
|
||||
}
|
||||
printf("\n");
|
||||
int i,k;
|
||||
printf("\n\n\n");
|
||||
for(i=0;i<M;i++) {
|
||||
printf(RESET" ");
|
||||
for(k=0;k<M;k++) {
|
||||
if(tabella[i][k]==1)
|
||||
printf(GIALLO" O ");
|
||||
else {
|
||||
if(tabella[i][k]==2)
|
||||
printf(ROSSO" X ");
|
||||
else
|
||||
printf(BIANCO" . ");
|
||||
}
|
||||
}
|
||||
printf("\n\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
|
||||
int controlla(int giocatore){
|
||||
if(tabella[0][0]==giocatore&&tabella[1][1]==giocatore&&tabella[2][2]==giocatore)
|
||||
return 1;
|
||||
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)
|
||||
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;
|
||||
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 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){
|
||||
|
||||
if(controlla(2))
|
||||
return INT_MAX;
|
||||
if(mossa==M*M)
|
||||
return 0;
|
||||
int res, tmp;
|
||||
if(giocatore==1){
|
||||
res=1;
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=1;
|
||||
if(controlla(1)){
|
||||
if(profondita==20){
|
||||
tabella[i][k]=0;
|
||||
return INT_MIN;
|
||||
}
|
||||
else
|
||||
res-=2;
|
||||
if(controlla(2))
|
||||
return INT_MAX;
|
||||
if(mossa==M*M)
|
||||
return 0;
|
||||
int res,tmp;
|
||||
if(giocatore==1){
|
||||
res=1;
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=1;
|
||||
if(controlla(1)&&!profondita==20){
|
||||
tabella[i][k]=0;
|
||||
return INT_MIN;
|
||||
}
|
||||
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;
|
||||
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() {
|
||||
int a,b;
|
||||
do{
|
||||
randomize;
|
||||
a=random(M);
|
||||
b=random(M);
|
||||
}while(tabella[a][b]==1||tabella[a][b]==2);
|
||||
tabella[a][b]=2;
|
||||
int a,b;
|
||||
do{
|
||||
randomize;
|
||||
a=random(M);
|
||||
b=random(M);
|
||||
}while(tabella[a][b]==1||tabella[a][b]==2);
|
||||
tabella[a][b]=2;
|
||||
}
|
||||
|
||||
|
||||
void medio(){
|
||||
int max=INT_MIN,mi=1,mk=1,t;
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=2;
|
||||
t=minimax(1, 10);
|
||||
if(t>max){
|
||||
max=t;
|
||||
mi=i;
|
||||
mk=k;
|
||||
}
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
int max=INT_MIN,mi=1,mk=1,t;
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=2;
|
||||
t=minimax(1, 10);
|
||||
if(t>max){
|
||||
max=t;
|
||||
mi=i;
|
||||
mk=k;
|
||||
}
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
stampa();
|
||||
tabella[mi][mk]=2;
|
||||
tabella[mi][mk]=2;
|
||||
}
|
||||
|
||||
void difficile(){
|
||||
int max=INT_MIN,mi=1,mk=1,t;
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=2;
|
||||
t=minimax(1,20);
|
||||
if(t>max){
|
||||
max=t;
|
||||
mi=i;
|
||||
mk=k;
|
||||
}
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
for(i=0;i<M;i++){
|
||||
for(k=0;k<M;k++){
|
||||
if(!tabella[i][k]){
|
||||
tabella[i][k]=2;
|
||||
t=minimax(1,20);
|
||||
if(t>max){
|
||||
max=t;
|
||||
mi=i;
|
||||
mk=k;
|
||||
}
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
tabella[mi][mk]=2;
|
||||
tabella[mi][mk]=2;
|
||||
}
|
||||
|
||||
void pausa() {
|
||||
do{
|
||||
getchar();
|
||||
}while ((c= getchar()) != '\n' && c!= EOF);
|
||||
getchar();
|
||||
}while ((c= getchar()) != '\n' && c!= EOF);
|
||||
}
|
||||
|
||||
void vuota() {
|
||||
for(i=0;i<M;i++) {
|
||||
for(k=0;k<M;k++)
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
for(i=0;i<M;i++) {
|
||||
for(k=0;k<M;k++)
|
||||
tabella[i][k]=0;
|
||||
}
|
||||
}
|
||||
|
||||
void leggimossa(){
|
||||
int tasto=0;
|
||||
fflush(stdin);
|
||||
if(tastierino==1){
|
||||
do{
|
||||
tasto=0;
|
||||
fflush(stdin);
|
||||
if(scelta==2)
|
||||
printf(GIALLO" Fai la tua mossa:\n"RESET BIANCO);
|
||||
else
|
||||
printf(GIALLO" Gioca il giocatore %d.\n Fai la tua mossa:\n"RESET BIANCO,giocatore);
|
||||
if(os)
|
||||
tasto=mgetchar();
|
||||
else
|
||||
do{
|
||||
tasto=getch();
|
||||
}while(kbhit());
|
||||
switch(tasto){
|
||||
case 49:{
|
||||
i=2;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 50:{
|
||||
i=2;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 51:{
|
||||
i=2;
|
||||
k=2;
|
||||
break;
|
||||
}
|
||||
case 52:{
|
||||
i=1;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 53:{
|
||||
i=1;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 54:{
|
||||
i=1;
|
||||
k=2;
|
||||
break;
|
||||
}
|
||||
case 55:{
|
||||
i=0;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 56:{
|
||||
i=0;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 57:{
|
||||
i=0;
|
||||
k=2;
|
||||
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);
|
||||
int tasto=0;
|
||||
fflush(stdin);
|
||||
if(tastierino==1){
|
||||
do{
|
||||
tasto=0;
|
||||
fflush(stdin);
|
||||
if(scelta==2)
|
||||
printf(GIALLO" Fai la tua mossa:\n"RESET BIANCO);
|
||||
else
|
||||
printf(GIALLO" Gioca il giocatore %d.\n Fai la tua mossa:\n"RESET BIANCO,giocatore);
|
||||
if(os)
|
||||
tasto=mgetchar();
|
||||
else
|
||||
do{
|
||||
tasto=getch();
|
||||
}while(kbhit());
|
||||
switch(tasto){
|
||||
case 49:{
|
||||
i=2;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 50:{
|
||||
i=2;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 51:{
|
||||
i=2;
|
||||
k=2;
|
||||
break;
|
||||
}
|
||||
case 52:{
|
||||
i=1;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 53:{
|
||||
i=1;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 54:{
|
||||
i=1;
|
||||
k=2;
|
||||
break;
|
||||
}
|
||||
case 55:{
|
||||
i=0;
|
||||
k=0;
|
||||
break;
|
||||
}
|
||||
case 56:{
|
||||
i=0;
|
||||
k=1;
|
||||
break;
|
||||
}
|
||||
case 57:{
|
||||
i=0;
|
||||
k=2;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}while(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){
|
||||
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);
|
||||
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);
|
||||
system(clear);
|
||||
}
|
||||
|
||||
}while(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);
|
||||
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){
|
||||
time_t Ti,Tf;
|
||||
time(&Ti);
|
||||
do{
|
||||
time(&Tf);
|
||||
}while(difftime(Tf,Ti)<t);
|
||||
time_t Ti,Tf;
|
||||
time(&Ti);
|
||||
do{
|
||||
time(&Tf);
|
||||
}while(difftime(Tf,Ti)<t);
|
||||
}
|
||||
|
||||
|
||||
void spinner(int tempo) {
|
||||
char spinner[] = "/-\\|";
|
||||
char spinner[] = "/-\\|";
|
||||
printf(GIALLO"\n ");
|
||||
for (int i=0; i<(tempo*10);i++){
|
||||
putchar(spinner[i%4]);
|
||||
fflush(stdout);
|
||||
usleep(200000);
|
||||
putchar('\b');
|
||||
}
|
||||
for (int i=0; i<(tempo*10);i++){
|
||||
putchar(spinner[i%4]);
|
||||
fflush(stdout);
|
||||
usleep(200000);
|
||||
putchar('\b');
|
||||
}
|
||||
printf(RESET);
|
||||
putchar(' ');
|
||||
}
|
||||
@ -340,5 +341,5 @@
|
||||
for(i=0;i<t*100;i++)
|
||||
putchar('\a');
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user