#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "forza quattro.c"
int main()
{
char gameZone[ MAXLINE ][ MAXCOLUMN ] = { 0 }; /* Questo è il campo di gioco */
int line, column; /* Variabili che mi servono per limitare la grandezza del campo di gioco */
int limits; /* Serve per limitare la scelta dell'utente. Su campi di gioco diversi la scelta può cambiare */
int mode; /* Serve per memorizzare la modalità di gioco */
int turnMax; /* Turni massimi possibili */
int turn = 0;
int victory;
Player playerOne, playerTwo; /* Dichiaro i due di giocatori con il tipo struct player */
intro();
clrscr();
start();
clrscr();
gameMode( &mode ); /* Passo &mode perchè il parametro di questa funzione è un puntatore */
clrscr();
insertName( playerOne.name, playerTwo.name, mode );
clrscr();
chooseGameZone( &line, &column, &limits, &turnMax );
clrscr();
chooseSign( &playerOne, &playerTwo );
createGameZone( gameZone, line, column );
do
{
clrscr();
printGameZone( gameZone, turn, line, column );
/* Qui il giocatore sceglie la mossa che deve fare */
turn % 2 == 0 ?
printf( "\n\n\n\n\n%s", turn % 2 == 0 ? playerOne.name : playerTwo.name );
printf( ", fai la tua mossa" );
while( choosePosition( mode, gameZone, &turn, limits, line, playerOne.sign, playerTwo.sign ) ); /* Finchè la mossa non è corretta non uscire dal ciclo */
} while( !( victory = win( gameZone, turn, turnMax, line, column ) ) ); /* Il valore di victory mi serve per determinare il messaggio finale */
clrscr();
printf( "\t\t\t Situazione finale" );
printGameZone( gameZone, turn, line, column );
getch(); /* Stoppa il programma per vedere la situazione finale */
clrscr();
end( playerOne.name, playerTwo.name, victory, turn );
clrscr();
getch();
return 0;
}
/* Funzione intro */
/* Nessun parametro e uscita */
/* Visualizza a schermo la schermata d'introduzione */
void intro( void )
{
printf( "\n\n\n" );
printf( "Benvenuto a Forza 4!!!");
getch();
}
/* Funzione start */
/* Nessun parametro e uscita */
/* Decidi cosa fare, se iniziare a giocare o se leggere le regole */
void start( void )
{
int chosen = 0;
/* Ciclo di controllo, mi permette di controllare l'input dell'utente */
while( chosen != '1' )
{
printf( "Cosa vuoi fare? " );
printf( "\n\n1." );
printf( " Giocare" );
printf( "\n2." );
printf( " Leggere le regole" );
switch( chosen = getch() )
{
/* Non metto il case '1' perchè, se inserisco '1', non entra neanche nello switch, perchè il ciclo risulta FALSO! */
case '2':
clrscr();
rules();
break;
default:
break;
}
clrscr();
}
}
/* Funzione rules */
/* Nessun parametro e uscita */
/* Visualizza le regole */
void rules( void )
{
printf( "\n\t\t\t\tRegole" );
printf( "\n\nSi puo' vincere in vari modi:\n"
"- Facendo una riga di 4 \"X\" o 4 \"O\"\n"
"- Facendo una colonna di 4 \"X\" o 4 \"O\"\n"
"- Facendo una diagonale di 4 \"X\" o 4 \"O\"\n\n"
"Per scegliere in che colonna mettere la \"X\" o la \"O\" premendo il tasto\ndella colonna corrispondente"
"\n\nEcco qui la tabella con i tasti corrispondenti:\n\n" );
printf( "\t\t\t---------------\n" );
printf("\t\t\t| | | | | | | |\n"
"\t\t\t| | | | | | | |\n"
"\t\t\t| | | | | | | |\n"
"\t\t\t| | | | | | | |\n"
"\t\t\t| | | | | | | |\n"
"\t\t\t| | | | | | | |\n" );
printf( "\t\t\t---------------\n" );
printf( "\t\t\t 1 2 3 4 5 6 7 " );
getch();
}
/* Funzione gameMode */
/* Un parametro ( un puntatore ) e nessun uscita */
/* Scegli la modalità di gioco, ovvero contro chi giocare */
void gameMode( int *m )
{
printf( "Che modalita' di gioco vuoi scegliere?" );
printf( "\n\n1." );
printf( " Classica" );
printf( "\n2." );
printf( " Forza 4 per 4" );
do {
*m = getch();
} while( *m != '1' && *m != '2' );
}
/* Funzione insertName */
/* Due parametri ( due stringhe ) e nessun uscita */
/* Inserisce il nickname nella struttura Player */
void insertName( char *t, char *n )
{
do {
printf( "Inserisci il tuo nome [Player 1]" );
scanf( "%s",t );
printf( "\t%s\n\n", t );
gets( n );
printf( "\n" );
printf( "Inserisci il tuo nome [Player 2]" );
scanf( "%s",t );
printf( "\t%s\n\n", t );
if( strcmpi( n, "CPU" ) == 0 )
printf( "Il nome %s non puo' essere usato! Usane un altro!\n\n", *n );
} while( strcmpi( n, "CPU" ) == 0 );
}
/* Funzione chooseGameZone */
/* Tre parametri ( tre puntatori ) e nessun uscita */
/* Si sceglie il campo di gioco, selezionando il numero di righe e colonne. Si definisce il limite della mossa dell'utente e il limite di turni */
void chooseGameZone( int *l, int *c, int *limits, int *tmax )
{
int chosen;
printf( "Di che grandezza vuoi la Griglia di Gioco?" );
printf( "\n\n1." );
printf( " Piccolo\t" );
printf( "[4x4]" );
printf( "\n2." );
printf(" Medio\t" );
printf( "[5x6]" );
printf( "\n3." );
printf( " Grande\t" );
printf( "[7x7]" );
printf( "\n4." );
printf( " Grandissimo\t" );
printf( "[8x9]" );
do
{
chosen = getch();
} while( chosen != '1' && chosen != '2' && chosen!= '3' && chosen != '4' );
switch( chosen )
{
/* l sono le linee, c le colonne, limits il limite di tasti da premere partendo da '1', tmax il turno massimo */
case '1':
*l = 6;
*c = 9;
*limits = '4';
*tmax = 16;
break;
case '2':
*l = 7;
*c = 13;
*limits = '6';
*tmax = 30;
break;
case '3':
*l = 9;
*c = 15;
*limits = '8';
*tmax = 49;
break;
case '4':
*l = MAXLINE;
*c = MAXCOLUMN;
*limits = '9';
*tmax = 72;
break;
}
}
/* Funzione chooseSign */
/* Due parametri ( due puntatori ) e nessun uscita */
/* Scegli il tuo segno fra X o O */
void chooseSign( Player *playerOne, Player *playerTwo )
{
printf( "%s", playerOne->name );
printf( ", che segno scegli? ");
printf( "\n\n\n\n" );
printf( "\t\t\tX\t\t\t" );
printf( "O" );
while( ( ( playerOne->sign = toupper( getch() ) ) != 'X' ) && playerOne->sign != 'O' )
;
if( playerOne->sign == 'X' ) /* Significa: Se il segno inserito convertito in maiuscolo è X, allora... */
playerTwo->sign = 'O';
else if( playerOne->sign == 'O' )
playerTwo->sign = 'X';
}
/* Funzione createGameZone */
/* 3 parametri e nessun uscita */
/* Crea la zona di gioco, in base al valore di line e column scelti dall'utente */
void createGameZone( char zone[][ MAXCOLUMN ], int l, int c )
{
int i, j;
for( i = 0; i != l; i++ )
for( j = 0; j != c; j++ )
{
if( i == 0 || i == l - 1 ) /* Il carattere '-' c'è solo nella riga iniziale e finale */
zone[ i ][ j ] = '-';
else if( j % 2 == 0 ) /* Ad ogni colonna di ordine pari c'è un carattere '|' */
zone[ i ][ j ] = '|';
}
}
/* Funzione printGameZone */
/* Due parametri ( una matrice e un intero ) e nessun uscita */
/* Stampa semplicemente la zona di gioco di Forza Quattro */
void printGameZone( char zone[][ MAXCOLUMN ], int turn, int l, int c )
{
int i, j;
for( i = 0; i != l; i++ )
{
printf("\n\t");
for( j = 0; j != c; j++ )
{
/* Stampo i componenti della matrice zone */
printf( "%c", zone[ i ][ j ]);
/* Stampa il turno quando siamo a metà delle righe */
if( ( i == l / 2 ) && ( j == c - 1 ) )
{
printf( "\t" );
printf( " Turno %2d", turn + 1 );
}
}
}
printf( "\n\t" );
for( i = 0; i != c/2; i++ )
printf( "%2d", i + 1 );
}
/* Funzione choosePosition */
/* 7 parametri e un uscita a int */
/* Fai scegliere al giocatore che mossa fare */
int choosePosition( int m, char zone[][ MAXCOLUMN ], int *turn, int limits, int l, int pOneSign, int pTwoSign )
{
int chosen;
int columnTemp;
int i;
if( ( m == '2' && *turn % 2 != 0 ) || m == '3' )
do
{
chosen = rand() % 8 + 1 + 48;
} while( chosen > limits );
else
while( ( ( chosen = getch() ) <= '0' ) || chosen > limits )
;
/* Un tasto corrisponde ad un valore di colonna, per questo bisogna usare lo switch */
switch( chosen )
{
case '1':
columnTemp = 1;
break;
case '2':
columnTemp = 3;
break;
case '3':
columnTemp = 5;
break;
case '4':
columnTemp = 7;
break;
case '5':
columnTemp = 9;
break;
case '6':
columnTemp = 11;
break;
case '7':
columnTemp = 13;
break;
case '8':
columnTemp = 15;
break;
case '9':
columnTemp = 17;
break;
}
if( zone[ 1 ][ columnTemp ] != 0 ) /* Se la colonna è piena, la mossa deve essere ripetuta */
return 1;
for( i = 0; i != l; i++ )
{
if( zone[ i ][ columnTemp ] == 0 && zone[ i + 1 ][ columnTemp ] != 0 )
{
( *turn % 2 == 0 ) ? ( zone[ i ][ columnTemp ] = pOneSign ) : ( zone[ i ][ columnTemp ] = pTwoSign );
++*turn;
return 0;
}
}
return 1; /* Mossa non valida */
}
/* Funzione choosePosition */
/* 5 parametri e un uscita a int */
/* Verifica se il giocatore ha vinto o no */
int win( char zone[][ MAXCOLUMN ], int turn, int tmax, int l, int c )
{
int i, j;
/* Pareggio */
if( turn == tmax )
return 2;
/* Come metodo uso la traslazione di un vettore immaginario nella matrice */
/* Vittoria orizzontale con X e O */
for( i = 1; i != l - 1; i++ )
for( j = 1; j <= c - 8; j+=2 )
{
if( zone[ i ][ j ] == 'X' && zone[ i ][ j + 2 ] == 'X' && zone[ i ][ j + 4 ] == 'X' && zone[ i ][ j + 6 ] == 'X' )
return 1;
if( zone[ i ][ j ] == 'O' && zone[ i ][ j + 2 ] == 'O' && zone[ i ][ j + 4 ] == 'O' && zone[ i ][ j + 6 ] == 'O' )
return 1;
}
/* Vittoria vericale con X e O */
for( j = 1; j < c - 1; j+=2 )
for( i = 1; i <= l - 4 - 1; i++ )
{
if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j ] == 'X' && zone[ i + 2 ][ j ] == 'X' && zone[ i + 3 ][ j ] == 'X' )
return 1;
if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j ] == 'O' && zone[ i + 2 ][ j ] == 'O' && zone[ i + 3 ][ j ] == 'O' )
return 1;
}
/* Vittoria diagonale "\" con X e O*/
for( i = 1; i <= l - 4 - 1; i++ )
for( j = 1; j <= c - 8; j+=2 )
{
if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j + 2 ] == 'X' && zone[ i + 2 ][ j + 4 ] == 'X' && zone[ i + 3 ][ j + 6 ] == 'X' )
return 1;
if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j + 2 ] == 'O' && zone[ i + 2 ][ j + 4 ] == 'O' && zone[ i + 3 ][ j + 6 ] == 'O' )
return 1;
}
/* Vittoria diagonale "/" con X e O*/
for( i = 1; i <= l - 4 - 1; i++ )
for( j = 7; j <= c; j+=2 )
{
if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j - 2 ] == 'X' && zone[ i + 2 ][ j - 4 ] == 'X' && zone[ i + 3 ][ j - 6 ] == 'X' )
return 1;
if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j - 2 ] == 'O' && zone[ i + 2 ][ j - 4 ] == 'O' && zone[ i + 3 ][ j - 6 ] == 'O' )
return 1;
}
return 0; /* Nessuna vittoria */
}
/* Funzione end */
/* 4 parametri e nessun uscita */
/* Visualizza il messaggio finale */
void end( char *pOneName, char *pTwoName, int v, int turn )
{
if( v == 1 )
{
printf( "Complimenti " );
printf( "%s", turn % 2 == 0 ? pTwoName : pOneName );
printf( ", hai vinto la sfida!" );
}
else
{
printf( "Siete scarsi, nessuno dei due ha vinto!" );
}
printf( "\n\nTurni" );
printf(" totali: ");
printf("%d", turn + 1);
getch();
}