Advertisement
FrancescoMontagno

tris

Nov 12th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.66 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 3
  4. #define LS 256
  5. #define CONTROLLI 4 //numero di controlli da fare (riga, colonna, diagonale1 e diagonale 2)
  6. #define VAL_X 88 // codifica ascii di X
  7. #define VAL_O 79 // codifica ascii di O
  8.  
  9. void main(void)
  10.  {
  11.   int i, j, k, turno=1, vittoria=1, contatore=0, somma[CONTROLLI]; //somma[4] conterrà la somma delle righe,colonne e delle due diagonali
  12.   char input_str[LS], griglia[N][N];
  13.  
  14.   for(i=0; i<N; i++)
  15.    for(j=0; j<N; j++)
  16.     griglia[i][j]='-'; //la codifica ascii di '-' è 45
  17.  
  18.   for(i=0; i<CONTROLLI; i++)
  19.    somma[i]=0;
  20.  
  21.   while(vittoria)
  22.    {
  23.     do // input controllato della riga e della colonna
  24.      {
  25.       printf("\n\nE' il turno del giocatore %d, \nInserire la riga: ", turno);
  26.       scanf("%s", input_str);
  27.       i=atoi(input_str);
  28.       printf("Inserire la colonna: ");
  29.       scanf("%s", input_str);
  30.       j=atoi(input_str);
  31.      }
  32.     while(griglia[i-1][j-1]!='-');
  33.    
  34.     switch(turno)  // questo switch setta le X e le O, inoltre cambia il turno
  35.      {
  36.       case 1:
  37.               turno++;
  38.               griglia[i-1][j-1]='X';
  39.       break;
  40.  
  41.       case 2:
  42.               turno--;
  43.               griglia[i-1][j-1]='O';
  44.       break;
  45.      }
  46.  
  47.     contatore++; //tiene conto del numero di mosse fatte
  48.  
  49.  // la parte di codice che segue stampa la griglia e calcola la somma delle diagonali, delle righe e delle colonne. Questi controlli sono uguali per ogni N>1 scelto, dunque cambiare N non varia i controlli
  50.  
  51.     for(i=0; i<N; i++)
  52.      {
  53.       printf("\n\t\t");
  54.  
  55.       for(j=0; j<N; j++)
  56.        {
  57.         printf("%c \t", griglia[i][j]);
  58.         somma[0]+=((int)griglia[i][j]); //somma della riga i
  59.         somma[1]+=((int)griglia[j][i]); //somma della colonna i
  60.         somma[2]+=((int)griglia[j][j]); //somma della diagonale principale
  61.         somma[3]+=((int)griglia[j][N-1-j]); //somma della diagonale secondaria
  62.        }
  63.  
  64.       if( contatore>=(2*N-1) ) // se non si effettuano 2N-1 mosse, non è possibile vincere dunque inutile verificare la condiizione di vittoria
  65.        {
  66.         for(k=0; k<CONTROLLI; k++)
  67.          {
  68.           switch(somma[k])
  69. /*poiché somma[] contiene la somma (righe, colonne, diagonali) del valore corrispondente ad 'X','O', '-', la condizione di vittoria si verifica se somma[] è uguale ad N volte il valore di 'X' oppure 'O'. Si noti che (int)'X'=88, (int)'O'=79, (int)'-'=45, dunque non si può verificare che 2'X'+'-'=3'O' o casi simili*/
  70.            {
  71.             case N*VAL_X:
  72.                          vittoria--;
  73.                          contatore=1;
  74.                          k=CONTROLLI+1; // condizione di uscita dal for più interno
  75.             break;
  76.  
  77.             case N*VAL_O:
  78.                           vittoria--;
  79.                           contatore=2;
  80.                           k=CONTROLLI+1; // condizione di uscita dal for più interno                            
  81.             break;
  82.            
  83.             default:
  84.                     if(contatore==(N*N)) // nel caso in cui la griglia sia stata riempita
  85.                      {
  86.                       k=CONTROLLI+1; // condizione di uscita dal for più interno
  87.                       vittoria--;
  88.                       contatore=3;
  89.                      }
  90.            }
  91.          }
  92.        }
  93.       for(k=0; k<CONTROLLI; k++) //azzera somme dopo ogni controllo
  94.        somma[k]=0;            
  95.      }
  96.    }
  97.  
  98.   switch(contatore)
  99.    {
  100.     case 1: printf("\n\n \t \t ""\e[1;31m""Vince il giocatore 1!\n\n");
  101.     break;
  102.     case 2: printf("\n\n \t \t ""\e[1;31m""Vince il giocatore 2!\n\n");
  103.     break;
  104.     case 3: printf("\n\n \t \t ""\e[1;31m""E' un pareggio!\n\n");
  105.     break;
  106.    }
  107.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement