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);
}