Linguaggio C

Gioco del Tris

Gioco del Tris – Sergio Ginex 3A IT 2020/2021

//Gioco del tris
//Inclusione della libreria standard di IO
#include <stdio.h>
//inclusione della libreria string.h
#include <string.h>
//Funzione che azzera tutte le colonne e righe della matrice
void azzera (int m[3][3])
{
	int c,r;
	for (c=0;c<3;c++)
	{
		for (r=0;r<3;r++)
		{
			m[r][c]=0;
		}
	}	
}
// stampa sullo schermo il contenuto della matrice 
void stampa (int m[3][3])
{
	// vettore che conververte in stampa i valori caricati sulla matrice  (1 per computer che diventa O, 10 per il giocatore  che diventa X)
	char vet[]={'\0','O','\0','\0','\0','\0','\0','\0','\0','\0','X'};
	
	printf(" %c|%c|%c\n",vet[m[0][0]],vet[m[0][1]],vet[m[0][2]]);
	printf("-------\n");
	printf(" %c|%c|%c\n",vet[m[1][0]],vet[m[1][1]],vet[m[1][2]]);
	printf("-------\n");
	printf(" %c|%c|%c\n",vet[m[2][0]],vet[m[2][1]],vet[m[2][2]]);
	
	printf("\n\n");
}
// Chiede all'utente di inserire le coordinate dove inserire la X (riga, colonna)
void chiediMossa(int m[3][3])
{
	int c;
	int r;
	printf("Inserisci mossa (r,c)");
	scanf("%d,%d",&r,&c);
	m[r][c]=10;
}
// Controlla se c'è una vincita nella diagonale principale della matrice
int diagPWin (int m[3][3],int giocatore){
	int d=0,s=0,diagonale=1;
	while (diagonale==1&&d<3){
		s=s+m[d][d];
		if (s==giocatore){
				diagonale=0;
		}
		d++;
	}
	return diagonale;
}
// Controlla se c'è una vincita nella diagonale inversa della matrice
int diagIWin (int m[3][3],int giocatore){
	int d=0,s=0,diagonale=1;
	while (diagonale==1&&d<3){
		s=s+m[2-d][d];
		if (s==giocatore){
				diagonale=2;
		}
		d++;
	}
	return diagonale;
}
// Ostacola il tris nelle diagonali della matrice (diagonale=0 Princiale, diagonale=2 Inversa)
int diagPIWinS(int m[3][3], int giocatore,int diagonale){
	int d=0;
	if (diagonale!=1){
		for (d=0;d<3;d++){
			if (m[abs(diagonale-d)][d]==0){
				m[abs(diagonale-d)][d]=giocatore;
				return 1;	
			}
		}
	}
	return 0;
}
// controlla se c'è una vincita nelle colonne della matrice
int colWin (int m[3][3],int giocatore){
	int c=0,r=0,s=0,riga=0,colonna=0;
	while (colonna==0&&c<3){
		while(colonna==0&&r<3){
			s=s+m[r][c];
			r++;
		}
		if (s==giocatore){
			colonna=c;
		}
		s=0;
		r=0;
		c++;
	}
	return colonna;
}
// controlla se c'è una vincita nelle righe della matrice
int rowWin (int m[3][3],int giocatore){
	int c=0,r=0,s=0,riga=0,colonna=0;
	while (riga==0&&r<3){
		while(riga==0&&c<3){
			s=s+m[r][c];
			c++;
		}
		if (s==giocatore){
				riga=r;
		}
		c=0;
		s=0;
		r++;
	}
	return riga;
}
// Ostacola la realizzazione del tris nelle colonne della matrice
int colWinS(int m[3][3], int giocatore,int colonna){
	int r=0;
	if (colonna!=0){
		for (r=0;r<3;r++){
			if (m[r][colonna]==0){
				m[r][colonna]=giocatore;
				return 1;	
			}
		}
	}
	return 0;
}
// Ostacola la realizzazione del tris nelle righe della matrice
int  rowWinS(int m[3][3], int giocatore,int riga){
	int c=0;
	if (riga!=0){
		for (c=0;c<3;c++){
			if (m[riga][c]==0){
				m[riga][c]=giocatore;
				return 1;
			}
		}
	}
	return 0;
}

void adiacenza (int m[3][3],int giocatore){
	int c=0,r=0,s=0,riga=0,colonna=0;
	while (colonna==0&&c<3){
		while(riga==0&&r<3){
			if(m[r][c]==giocatore){
				riga=r;
				colonna=c;
			}
			r++;
		}
		r=0;
		c++;
	}
	c=0;
	r=0;
	while(c<3){
		if(m[riga][c]==0){
			m[riga][c]=giocatore;
			c=4;
		}
		c++;
	}
	while(r<3&&c!=5){
		if(m[r][colonna]==0){
			m[r][colonna]=giocatore;
			r=4;
		}
		r++;
	}
}
//Entry point del programma
int main(){
	printf("Benvenuto nel gioco del tris.\nPer inserire una mossa devi inserire da tastira il numero della riga, numero della colonna. Tu hai le X, il computer O\n");
	// dichiarazione e istanziazione della variabile e della matrice
	int k=0;
	int tris[3][3];
	azzera (tris);
	// stampa il tris vuoto
	stampa(tris);
	// chiede di fare la prima mossa al giocatore
	chiediMossa(tris);
	// stampa la prima mossa del giocatore
	stampa(tris);
	// se al centro è vuoto allora il computer lo riempie con una X
	if (tris[1][1]==0){
		tris[1][1]=1;	
	}
	stampa(tris);
	
	// chiede al giocatore la terza mossa
	chiediMossa(tris);
	stampa(tris);
		
	// gioco di difesa del computer: controlla che il giocatore non faccia tris nelle righe, colonne e diagonali apponendo uno O di contrasto
	k=colWinS(tris,1,colWin(tris,20))+rowWinS(tris,1,rowWin(tris,20))+
	diagPIWinS(tris,1,diagPWin(tris,20))+diagPIWinS(tris,1,diagIWin(tris,20));
	
	// se non c'è stato bisogno di un contrasto al tris il computer tenta di realizzare una coppia
	if(k==0)
	{
		adiacenza(tris,1);
	}	
	
	stampa(tris);
	
	chiediMossa(tris);
	
	stampa(tris);
	
	// gioco di attacco del computer: controlla se c'è la possibilità di fare tris e lo realizza
	k=colWinS(tris,1,colWin(tris,2))+rowWinS(tris,1,rowWin(tris,2))+
	diagPIWinS(tris,1,diagPWin(tris,2))+diagPIWinS(tris,1,diagIWin(tris,2));

	// se fa il tris stampa su schermo Hai perso
	if(k>0){
		printf("\nHai perso\n");
	}
	
	// gioco di difesa del computer: controlla che il giocatore non faccia tris nelle righe, colonne e diagonali apponendo uno O di contrasto
	if(k==0){
		k=colWinS(tris,1,colWin(tris,20))+rowWinS(tris,1,rowWin(tris,20))+
		diagPIWinS(tris,1,diagPWin(tris,20))+diagPIWinS(tris,1,diagIWin(tris,20));
	
	}
	// se non c'è stato bisogno di giocare in difesa il computer cerca di fare una coppia
	if (k==0){
		adiacenza(tris,1);
	}	
	stampa(tris);
	
	chiediMossa(tris);
	
	stampa(tris);	
	
	k=colWinS(tris,1,colWin(tris,2))+rowWinS(tris,1,rowWin(tris,2))+
	diagPIWinS(tris,1,diagPWin(tris,2))+diagPIWinS(tris,1,diagIWin(tris,2));

	if(k>0){
		printf("\nHai perso\n");
	}	
	
	if(k==0){
		k=colWinS(tris,1,colWin(tris,20))+rowWinS(tris,1,rowWin(tris,20))+
		diagPIWinS(tris,1,diagPWin(tris,20))+diagPIWinS(tris,1,diagIWin(tris,20));	
	}
	
	if (k==0){
		adiacenza(tris,1);
	}
	
	stampa(tris);
	
	chiediMossa(tris);
	
	stampa(tris);
	
	
	k=colWinS(tris,1,colWin(tris,2))+rowWinS(tris,1,rowWin(tris,2))+
	diagPIWinS(tris,1,diagPWin(tris,2))+diagPIWinS(tris,1,diagIWin(tris,2));

	if(k>0){
		printf("\nHai perso\n");
	}
	
	if(k==0){
		k=colWinS(tris,1,colWin(tris,20))+rowWinS(tris,1,rowWin(tris,20))+
		diagPIWinS(tris,1,diagPWin(tris,20))+diagPIWinS(tris,1,diagIWin(tris,20));	
	}
	
	if (k==0){
		adiacenza(tris,1);
	}	
	stampa(tris);
}