Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #define N 3
- #define LS 256
- #define CONTROLLI 4 //numero di controlli da fare (riga, colonna, diagonale1 e diagonale 2)
- #define VAL_X 88 // codifica ascii di X
- #define VAL_O 79 // codifica ascii di O
- void main(void)
- {
- int i, j, k, turno=1, vittoria=1, contatore=0, somma[CONTROLLI]; //somma[4] conterrà la somma delle righe,colonne e delle due diagonali
- char input_str[LS], griglia[N][N];
- for(i=0; i<N; i++)
- for(j=0; j<N; j++)
- griglia[i][j]='-'; //la codifica ascii di '-' è 45
- for(i=0; i<CONTROLLI; i++)
- somma[i]=0;
- while(vittoria)
- {
- do // input controllato della riga e della colonna
- {
- printf("\n\nE' il turno del giocatore %d, \nInserire la riga: ", turno);
- scanf("%s", input_str);
- i=atoi(input_str);
- printf("Inserire la colonna: ");
- scanf("%s", input_str);
- j=atoi(input_str);
- }
- while(griglia[i-1][j-1]!='-');
- switch(turno) // questo switch setta le X e le O, inoltre cambia il turno
- {
- case 1:
- turno++;
- griglia[i-1][j-1]='X';
- break;
- case 2:
- turno--;
- griglia[i-1][j-1]='O';
- break;
- }
- contatore++; //tiene conto del numero di mosse fatte
- // 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
- for(i=0; i<N; i++)
- {
- printf("\n\t\t");
- for(j=0; j<N; j++)
- {
- printf("%c \t", griglia[i][j]);
- somma[0]+=((int)griglia[i][j]); //somma della riga i
- somma[1]+=((int)griglia[j][i]); //somma della colonna i
- somma[2]+=((int)griglia[j][j]); //somma della diagonale principale
- somma[3]+=((int)griglia[j][N-1-j]); //somma della diagonale secondaria
- }
- if( contatore>=(2*N-1) ) // se non si effettuano 2N-1 mosse, non è possibile vincere dunque inutile verificare la condiizione di vittoria
- {
- for(k=0; k<CONTROLLI; k++)
- {
- switch(somma[k])
- /*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*/
- {
- case N*VAL_X:
- vittoria--;
- contatore=1;
- k=CONTROLLI+1; // condizione di uscita dal for più interno
- break;
- case N*VAL_O:
- vittoria--;
- contatore=2;
- k=CONTROLLI+1; // condizione di uscita dal for più interno
- break;
- default:
- if(contatore==(N*N)) // nel caso in cui la griglia sia stata riempita
- {
- k=CONTROLLI+1; // condizione di uscita dal for più interno
- vittoria--;
- contatore=3;
- }
- }
- }
- }
- for(k=0; k<CONTROLLI; k++) //azzera somme dopo ogni controllo
- somma[k]=0;
- }
- }
- switch(contatore)
- {
- case 1: printf("\n\n \t \t ""\e[1;31m""Vince il giocatore 1!\n\n");
- break;
- case 2: printf("\n\n \t \t ""\e[1;31m""Vince il giocatore 2!\n\n");
- break;
- case 3: printf("\n\n \t \t ""\e[1;31m""E' un pareggio!\n\n");
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement