forza4.c

/*
  Forza4
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct{
  // La scacchiera su cui si gioca
  char tabella[6][7];
  // Per ciascuna colonna memorizza la prima riga libera
  int  libere[7];
} scacchiera;

typedef enum {true, false} boolean;

void main()
{
  scacchiera s;

  // Riga in cui viene inserito il gettone
  int  riga = -1;
  // Colonna in cui viene inserito il gettone
  int colonna;
  // Gettone (puo' essere O o X)
  char gettone = 'O';
  // Contatori
  int i,j,k;
  // Valore booleano che indica quando il gioco e' finito
  boolean fine = false;

  // Vuota la scacchiera
  for(i=0;i<6;i++)
    for(j=0;j<7;j++)
      s.tabella[i][j]='.';

  for(j=0;j<7;j++)
    s.libere[j]=5;


  while(fine==false)
    {
      // Disegna la scacchiera
      for(i=0;i<6;i++)
	{
	  printf("\n     ");
	  for(j=0;j<7;j++) printf("|%c",s.tabella[i][j]);
	  printf("|");
	}
      printf("\n     ---------------");
      printf("\n      1 2 3 4 5 6 7\n");

      // Chiede al giocatore dove vuole inserire il gettone
      do
	{
	  printf("\n[Gettone %c]\nIn quale colonna lo vuoi inserire (0 per terminare): ",gettone);
	  scanf("%d",&colonna);
	  colonna = colonna -1;
	}while(colonna<0 || colonna >6);

      // Verifica se la colonna non e' ancora piena
      riga = s.libere[colonna];
      if(riga<0) printf("La colonna %d e' gia piena, scegline un'altra",colonna+1);
      else
	{
	  // Aggiunge il gettone alla scacchiera
	  s.tabella[riga][colonna] = gettone;
	  // Incrementa il contatore della colonna in cui e' stato inserito il gettone
	  s.libere[colonna]--;

	  // Verifica che la scacchiera non sia tutta piena
	  k = 0;
	  for(i=0;i<7;i++)
	    {
	      k = k + s.libere[i];
	    }
	  if(k == -7) fine = true;

	  // Verifica se il giocatore ha fatto 4 in verticale
	  if(riga<3)
	    {
	      if((s.tabella[riga+1][colonna] == gettone) &&
		 (s.tabella[riga+2][colonna] == gettone) &&
		 (s.tabella[riga+3][colonna] == gettone))
		{
		  printf("4 in verticale - Il giocatore %c ha vinto !!!",gettone);
		  fine = true;
		}
	    }

	  // Verifica se il giocatore ha fatto 4 in orizzontale
	  k = 1;
	  // Conta il numero di gettoni a sinistra di quello inserito
	  for(j = colonna-1; j>=0 && j<=7 && s.tabella[riga][j]==gettone; j--) k++;
	  // Conta il numero di gettoni a destra di quello inserito
	  for(j = colonna+1; j>=0 && j<=7 && s.tabella[riga][j]==gettone; j++) k++;
	  // Se la somma dei gettoni contati e' maggiore di 3 hai vinto
	  if(k>3)
	    {
	      printf("4 in orizzontale - Il giocatore %c ha vinto !!!",gettone);
	      fine = true;
	    }

	  // Verifica se ha fatto 4 in diagonale (dall'alto al basso)
	  k = 1;
	  for(j=1 ; (riga-j)>=0 && (colonna-j)>=0 && s.tabella[riga-j][colonna-j]==gettone; j++)	k++;
	  for(j=1 ; (riga+j)<=6 && (colonna+j)<=7 && s.tabella[riga+j][colonna+j]==gettone; j++)	k++;
	  if(k>3)
	    {
	      printf("4 in diagonale - Il giocatore %c ha vinto !!!",gettone);
	      fine = true;
	    }

	  // Verifica se ha fatto 4 in diagonale (dal basso all'alto)
	  k = 1;
	  for(j=1 ; (riga+j)<=6 && (colonna-j)>=0 && s.tabella[riga+j][colonna-j]==gettone; j++)	k++;
	  for(j=1 ; (riga-j)>=0 && (colonna+j)<=7 && s.tabella[riga-j][colonna+j]==gettone; j++)	k++;
	  if(k>3)
	    {
	      printf("4 in diagonale - Il giocatore %c ha vinto !!!",gettone);
	      fine = true;
	    }

	  // Adesso tocca all'altro giocatore
	  if(gettone == 'O') gettone = 'X';
	  else gettone = 'O';
	}
    }

  // Disegna la scacchiera
  for(i=0;i<6;i++)
    {
      printf("\n     ");
      for(j=0;j<7;j++) printf("|%c",s.tabella[i][j]);
      printf("|");
    }
  printf("\n     ---------------");
  printf("\n      1 2 3 4 5 6 7\n");

}



Generated by GNU enscript 1.6.4.