forza4 - z88dk/z88dk GitHub Wiki

{{:examples:snippets:connect4.gif|}}

//  Connect 4 game
//  This program is by Ale.gatti96
//  Original program:  http://www.pierotofy.it/pages/sorgenti/dettagli/19253-Forza_4/


#include `<stdio.h>`
#include `<stdlib.h>`
#include `<conio.h>`
#include `<string.h>`
#include `<time.h>`

//Dimensioni campo da gioco
#define R 9					//Numero di righe
#define C 8					//Numero di colonne
#define RC R*C

//Caratteri stampati a video
#define g1 		 'X'		//Carattere del giocatore 1
#define g2 		 'O'		//Carattere del giocatore 2
#define vuoto  '.'		//Carattere per uno spazio vuoto
#define CVitt  'V' 		//Carattere per segnare la combinazione vincente

//Valori nella matrice
#define vuotoI 0		//Valore di uno spazio vuoto
#define g1I 1				//Valore del giocatore 1
#define g2I 2				//Valore del giocatore 2
#define vI 3				//Valore per segnare la combinazione vincente

//Valori che può assumere f in gioca
#define FGioca 0		//Partita in corso
#define FG1 1				//Ha vinto il giocatore 1
#define FG2 2				//Ha vinto il giocatore 2
#define FPareggio 3 //Pareggio

//Varie
#define CN 15							//Numero dei caratteri dei nomi dei giocatori
#define NGV 4							//Numero Gettoni per la Vittoria

*#define CLS system("cls") *Funzione per pulire lo schermo su windows #define CLS fputc_cons(12) //Funzione per pulire lo schermo su windows

//Tipologia di Gioco
#define UvsU 1			//User contro User
#define UvsC 2			//User contro Computer
#define CvsC 3			//Computer contro Computer

//Tipologia Giocatore
#define User 1
#define CPU  2


//Prototipi funzioni
void azzera(int m[RC]);
void stampa(int m[RC]);
char stampaCasella(int x);
void stampaTitolo(void);
void stampaRigaPiena(void);
void gioca(char n1[CN], char n2[CN], int tg1, int tg2);
int mossaPC(int m[RC], int gp, int ga);
int inserisci(int m[RC], int c);
int controllaF(int m[RC], const int g, const int r, const int c, const int e);
int giocatoreP(int g);
int esiste(int r, int c);


//Corpi delle funzioni
int main(int argc, char *argv[]){
  char n1[CN];
  char n2[CN];
  unsigned char r, k=0;
  int m[RC], tipoGioco=0, tg1, tg2;
  srand(time(NULL));
  
  sprintf(n1,"Player A");
  sprintf(n2,"Player B");

  do{
  	CLS;
  	stampaTitolo();
  	printf("\n\t 1. User vs User");
		printf("\n\t 2. User vs Computer");
		printf("\n\t 3. Computer vs Computer");
  	printf("\n\n   Choose the game type: ");
  	scanf("%d", &tipoGioco);
  	fflush(stdin);
  }while(tipoGioco`<1||tipoGioco>`3);
  
  if(tipoGioco!=CvsC){
  	printf("Insert the 1st player's name:\n   ");
    scanf("%s", n1);
    fflush(stdin);
    if(tipoGioco==UvsU){
    	printf("Insert the 2nd player's name:\n   ");
      scanf("%15s", n2);
      fflush(stdin);
    }else
    	strcpy(n2, "CPU1");
  }else{
 	  strcpy(n1, "CPU1");
    strcpy(n2, "CPU2");
  }
  
  do{
    if(tipoGioco==UvsU)
      tg1=tg2=User;
    else if(tipoGioco==UvsC){
    	tg1=User; tg2=CPU;
    }else
      tg1=tg2=CPU;
    
		gioca(n1, n2, tg1, tg2);
    printf("\n\nAnother game? (y/n)");
    scanf("%c", &r);
    fflush(stdin);
  }while(r=='y' || r=='Y');
  return 0;
}


//###############################
void gioca(char n1[CN], char n2[CN], int tg1, int tg2){
  int m[RC], t=1, f, nt=0, r, c, g=g2I;
  
  f=FGioca;
  azzera(m);
  
  do{
    CLS;
    stampaTitolo();
    g=giocatoreP(g);
//printf("g=%d   tg=%d\n",g, g==g1I?tg1:tg2);
    printf("Move number: %d\n",++nt);
    if(t)
      //printf("E' il turno di %s (%c)\n\n", n1,g1);
	  printf("%s's turn (%c)\n\n", n1,g1);
    else
      //printf("E' il turno di %s (%c)\n\n", n2,g2);
	  printf("%s's turn (%c)\n\n", n2,g2);
    stampa(m);
    
    //Se gioca l'utente
    if( (g==1 && tg1==User) || (g==2 && tg2==User)){
      while(1){
        //printf("In che colonna vuoi mettere il gettone?  ");
		printf("Enter your move:  ");
        scanf("%d", &c);
			  fflush(stdin);
			  c--;
        if(c`<0 || c>`=C)
          continue;
        r=inserisci(m,c);
        if(r!=-1)
          break;
      }
    }else{ // Se gioca il computer
 	    c=mossaPC(m, g, giocatoreP(g));
 	    r=inserisci(m,c); //mossaPc ritorna una colonna valida e con spazio
 	    m[r*8+c]=g;
      //printf("\nc = %d \n", c+1);
      //getch();
    }
    
    m[r*8+c]=g;
    f=controllaF(m,g,r,c,1) ? g : f;
    if(nt==R*C && f==0){
      f=FPareggio;
      break;
    }
  }while(!f);
  
  CLS;
  stampaTitolo();
  stampa(m);
  switch(f){
    case 1:
      //printf("\n\nHa vinto %s (%c)", n1, g1);
	  printf("\n\n%s wins (%c)", n1, g1);
      break;
    case 2:
      //printf("\n\nHa vinto %s (%c)", n2, g2);
	  printf("\n\n%s wins (%c)", n2, g2);
      break;
    case 3:
      //printf("\n\nPareggio");
	  printf("\n\nNo winner");
      break;
  }
}

//###############################
int mossaPC(int m[RC], int gp, int ga){
	int r,c,m2[RC],cas,g,i;
	
	//Riempio la matrice di supporto
	for(r=0; r<R ;r++)
	  for(c=0; c<C; c++)
	    m2[r*8+c]=m[r*8+c];
	
	//printf("mossaPC ( m, %d, %d )",gp,ga);
	
	// 1° ciclo Controlla se può vincere
	// 2° ciclo controlla se l'avversario può vincere
 	for(i=0; i<2; i++){
		g=(i? ga : gp);
	  for(c=0;c<C;c++){
	  	r=inserisci(m2,c);
	  	m2[r*8+c]=g;
	  	//printf("\n  c=%d  r=%d controllaF( m, %d, %d, %d, 0)=%d", c,r,g,r,c,controllaF(m2, g, r, c, 0));
	    if(r!=-1 && controllaF(m2, g, r, c, 0))
	      return c;
      m2[r*8+c]=vuotoI;
    }
  }
  
  while(1)   //Controlla se nella colonna casuale c'è spazio
    if(inserisci(m2,cas=rand()%C)!=-1)
      return cas;
}

//###############################
int giocatoreP(int g){
	return g==g1I ? g2I : g1I;
}	


//###############################
int inserisci(int m[RC], int c){
  int i;
  for(i=R-1; i>=0; i--)
    if(m[i*8+c]==vuotoI)
      return i;
  return -1;
}


//###############################
int controllaF(int m[RC], const int g, const int r, const int c, const int e){
	int r2, c2, x, ret=0, i, ok;
	
	//Controllo diagonale \ ___
	if(esiste(r-1,c-1) && m[(r-1)*8+c-1]==g)
	  if(x=controllaF(m,g,r-1,c-1,e)!=0)
	    ret=ret||x;
  if(r<R-(NGV-1) && c<C-(NGV-1)){
  	ok=1;
    for(i=0; i<NGV && (ok*=(m[r*8+c]==m[(r+i)*8+c+i] || m[(r+i)*8+c+i]==vI)); i++) ;
    if(ok){
    	if(e)
        for(i=0; esiste(r+i, c+i) && m[(r+i)*8+c+i]==g; i++)
          m[(r+i)*8+c+i]=vI;
      ret=1;
    }
  }
  
  //Controllo diagonale /  ___
	if(esiste(r+1,c-1) && m[(r+1)*9+(c-1)]==g)
	  if(x=controllaF(m,g,r+1,c-1,e)!=0)
	    ret=ret||x;
  if(r>(NGV-2) && c<C-(NGV-2)){
  	ok=1;
    for(i=0; i<NGV && (ok*=(m[r*8+c]==m[(r-i)*8+c+i]) || m[(r-i)*8+c+i]==vI); i++) ;
    if(ok){
    	if(e)
        for(i=0; esiste(r-i, c+i) && m[(r-i)*8+c+i]==g; i++)
          m[(r-i)*8+c+i]=vI;
      ret=1;
    }
  }
  
	//Controllo riga
	if(esiste(r,c-1) && m[r*8+c-1]==g)
	  if(x=controllaF(m,g,r,c-1,e)!=0)
	    ret=ret||x;
  if(c<C-(NGV-1)){
  	ok=1;
    for(i=0; i<NGV && (ok*=(m[r*8+c]==m[r*8+c+i] || m[r*8+c+i]==vI)); i++) ;
    if(ok){
    	if(e)
        for(i=0; esiste(r, c+i) && m[r*8+c+i]==g; i++)
          m[r*8+c+i]=vI;
      ret=1;
    }
  }
	
	//Controllo colonna
	if(r<R-(NGV-1)){
	  ok=1;
		for(i=0; i<NGV && (ok*=(m[r*8+c]==m[(r+i)*8+c] || m[(r+i)*8+c]==vI)); i++) ;
		if(ok){
    	if(e)
			  for(i=0; i<NGV; i++) //Non serve controllare se sono più di 4
          m[(r+i)*8+c]=vI;
      ret=1;
		}
	}
	
  return ret;
}


//###############################
int esiste(int r, int c){
	if(r>=0&&r<R && c>=0&&c<C)
	  return 1;
	return 0;	
}


//###############################
void azzera(int m[RC]){
  int i,j;
  for(i=0; i<R; i++)
    for(j=0; j<C; j++)
      m[i*8+j]=0;
}


//###############################
void stampa(int m[RC]){
  int i,j;
  printf("\n");
//  stampaRigaPiena();  //Stampo prima riga |---|---|--...
  
  for(i=0; i<R; i++){ //Stampo le righe centrali
    printf("|");
    for(j=0; j<C; j++)
      printf(" %c |",stampaCasella(m[i*8+j]));
    printf("\n");
//    stampaRigaPiena();
  }
  stampaRigaPiena();  //Stampo prima riga |---|---|--...
  printf("|");
  for(j=1; j<=C; j++)
    printf(" %d |", j);
  printf("\n");
//  stampaRigaPiena();  //Stampo prima riga |---|---|--...
  printf("\n");
}

void stampaRigaPiena(){
  int i,j;
  printf("|");
  for(j=1; j<=C; j++)
    printf("---|");
  printf("\n");
}

char stampaCasella(int x){
	char c;
	switch(x){
		case 0:
	    c=vuoto; break;
    case 1:
    	c=g1; break;
   	case 2:
    	c=g2; break;
   	case 3:
   		c=CVitt; break;
	}
	return c;
}
void stampaTitolo(void){
//  printf("\n\n\t ### Forza quattro ###\n\n");
  printf("\n\n     ### Connect four ###\n\n");
}
⚠️ **GitHub.com Fallback** ⚠️