Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - aiuto per programma forza 4
Forum - C/C++ - aiuto per programma forza 4

Avatar
weg51 (Normal User)
Newbie


Messaggi: 2
Iscritto: 23/05/2012

Segnala al moderatore
Postato alle 9:30
Mercoledì, 23/05/2012
Salve a tutti,

devo implementare un programmino per il gioco di Forza 4 in linguaggio C (e' il primo che provo a fare in assoluto!) e avrei bisogno del vostro aiuto.

Mi e' richiesto di inserire una funzione per "salvare" la partita e di conseguenza poter "ricaricare la partita salvata", penso di dover usare un file di testo per scrivere e poi leggere i dati, ma non riesco a scrivere questa parte del programma!
Potete darmi qualche indicazione su dove inserire la funzione e soprattutto come scriverla? (non ho ben capito come dire al programma quali dati deve "scrivere" e poi "leggere").

Spero che la domanda sia chiara (sono assolutamente un principiante!).
Allego il codice completo, ogni segnalazione e/o correzione di errori e' graditissima!!!

Grazie infinite a chi vorra' aiutarmi :)

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include "forza quattro.c"
  6.  
  7.  int main()
  8.  {
  9.    char gameZone[ MAXLINE ][ MAXCOLUMN ] = { 0 };  /* Questo è il campo di gioco */
  10.   int line, column;  /* Variabili che mi servono per limitare la grandezza del campo di gioco */
  11.   int limits;  /* Serve per limitare la scelta dell'utente. Su campi di gioco diversi la scelta può cambiare */
  12.   int mode;  /* Serve per memorizzare la modalità di gioco */
  13.   int turnMax;  /* Turni massimi possibili */
  14.   int turn = 0;
  15.   int victory;
  16.   Player playerOne, playerTwo;    /* Dichiaro i due di giocatori con il tipo struct player */
  17.  
  18.   intro();
  19.   clrscr();
  20.  
  21.   start();
  22.   clrscr();
  23.  
  24.   gameMode( &mode );  /* Passo &mode perchè il parametro di questa funzione è un puntatore */
  25.   clrscr();
  26.  
  27.   insertName( playerOne.name, playerTwo.name, mode );
  28.   clrscr();
  29.  
  30.   chooseGameZone( &line, &column, &limits, &turnMax );
  31.   clrscr();
  32.  
  33.   chooseSign( &playerOne, &playerTwo );
  34.   createGameZone( gameZone, line, column );
  35.  
  36.   do
  37.   {
  38.       clrscr();
  39.       printGameZone( gameZone, turn, line, column );
  40.       /* Qui il giocatore sceglie la mossa che deve fare */
  41.       turn % 2 == 0 ?
  42.       printf( "\n\n\n\n\n%s", turn % 2 == 0 ? playerOne.name  : playerTwo.name );
  43.       printf( ", fai la tua mossa" );
  44.       while( choosePosition( mode, gameZone, &turn, limits, line, playerOne.sign, playerTwo.sign ) );  /* Finchè la mossa non è corretta non uscire dal ciclo */
  45.   } while( !( victory = win( gameZone, turn, turnMax, line, column ) ) );  /* Il valore di victory mi serve per determinare il messaggio finale */
  46.   clrscr();
  47.  
  48.   printf( "\t\t\t Situazione finale" );
  49.  
  50.   printGameZone( gameZone, turn, line, column );
  51.    getch();  /* Stoppa il programma per vedere la situazione finale */
  52.  clrscr();  
  53.  
  54.  end( playerOne.name, playerTwo.name, victory, turn );
  55.  clrscr();
  56.  getch();
  57.  
  58.  return 0;
  59.  }
  60.  /* Funzione intro */
  61.  /* Nessun parametro e uscita */
  62.  /* Visualizza a schermo la schermata d'introduzione */
  63.  
  64.  void intro( void )
  65.  {
  66.   printf( "\n\n\n" );
  67.   printf( "Benvenuto a Forza 4!!!");
  68.   getch();
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  /* Funzione start */
  75.  /* Nessun parametro e uscita */
  76.  /* Decidi cosa fare, se iniziare a giocare o se leggere le regole */
  77.  
  78.  void start( void )
  79.  {
  80.    int chosen = 0;
  81.      
  82.   /* Ciclo di controllo, mi permette di controllare l'input dell'utente */
  83.   while( chosen != '1' )
  84.   {
  85.       printf( "Cosa vuoi fare? " );
  86.       printf( "\n\n1." );
  87.       printf( " Giocare" );
  88.       printf( "\n2." );
  89.       printf( " Leggere le regole" );
  90.       switch( chosen = getch() )
  91.       {
  92.   /* Non metto il case '1' perchè, se inserisco '1', non entra neanche nello switch, perchè il ciclo risulta FALSO! */
  93.          case '2':
  94.               clrscr();
  95.               rules();
  96.               break;
  97.          
  98.           default:
  99.               break;
  100.       }
  101.         clrscr();
  102.     }
  103.  }
  104.  
  105.  
  106.  
  107.  /* Funzione rules */
  108.  /* Nessun parametro e uscita */
  109.  /* Visualizza le regole */
  110.  
  111.  void rules( void )
  112.  {
  113.     printf( "\n\t\t\t\tRegole" );
  114.     printf( "\n\nSi puo' vincere in vari modi:\n"
  115.          "- Facendo una riga di 4 \"X\" o 4 \"O\"\n"
  116.          "- Facendo una colonna di 4 \"X\" o 4 \"O\"\n"
  117.          "- Facendo una diagonale di 4 \"X\" o 4 \"O\"\n\n"
  118.          "Per scegliere in che colonna mettere la \"X\" o la \"O\" premendo il tasto\ndella colonna corrispondente"
  119.          "\n\nEcco qui la tabella con i tasti corrispondenti:\n\n" );
  120.  printf( "\t\t\t---------------\n" );
  121.  printf("\t\t\t| | | | | | | |\n"
  122.         "\t\t\t| | | | | | | |\n"
  123.         "\t\t\t| | | | | | | |\n"
  124.         "\t\t\t| | | | | | | |\n"
  125.         "\t\t\t| | | | | | | |\n"
  126.         "\t\t\t| | | | | | | |\n" );
  127.  printf( "\t\t\t---------------\n" );
  128.  printf( "\t\t\t 1 2 3 4 5 6 7  " );
  129.  getch();
  130.  }
  131.  
  132.  
  133.  
  134.  /* Funzione gameMode */
  135.  /* Un parametro ( un puntatore ) e nessun uscita */
  136.  /* Scegli la modalità di gioco, ovvero contro chi giocare */
  137.  
  138.  void gameMode( int *m )
  139.  {
  140.   printf( "Che modalita' di gioco vuoi scegliere?" );
  141.   printf( "\n\n1." );
  142.   printf( " Classica" );
  143.   printf( "\n2." );
  144.   printf( " Forza 4 per 4" );
  145.   do {
  146.       *m = getch();
  147.   } while( *m != '1' && *m != '2' );
  148.  }
  149.  
  150.  
  151.  /* Funzione insertName */
  152.  /* Due parametri ( due stringhe ) e nessun uscita */
  153.  /* Inserisce il nickname nella struttura Player */
  154.  
  155.  void insertName( char *t, char *n )
  156. {
  157.   do {
  158.       printf( "Inserisci il tuo nome [Player 1]" );
  159.       scanf( "%s",t );
  160.       printf( "\t%s\n\n", t );
  161.       gets( n );
  162.       printf( "\n" );
  163.       printf( "Inserisci il tuo nome [Player 2]" );
  164.       scanf( "%s",t );
  165.       printf( "\t%s\n\n", t );
  166.       if( strcmpi( n, "CPU" ) == 0 )
  167.           printf( "Il nome %s non puo' essere usato! Usane un altro!\n\n", *n );
  168.   } while( strcmpi( n, "CPU" ) == 0 );                
  169.  }
  170.  
  171.  
  172.  
  173. /* Funzione chooseGameZone */
  174. /* Tre parametri ( tre puntatori ) e nessun uscita */
  175. /* 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 */
  176.  
  177. void chooseGameZone( int *l, int *c, int *limits, int *tmax )
  178. {
  179.     int chosen;
  180.    
  181.     printf( "Di che grandezza vuoi la Griglia di Gioco?" );
  182.     printf( "\n\n1." );
  183.     printf( " Piccolo\t" );
  184.     printf( "[4x4]" );
  185.     printf( "\n2." );
  186.     printf(" Medio\t" );
  187.     printf( "[5x6]" );
  188.     printf( "\n3." );
  189.     printf( " Grande\t" );
  190.     printf( "[7x7]" );
  191.     printf( "\n4." );
  192.     printf( " Grandissimo\t" );
  193.     printf( "[8x9]" );
  194.     do
  195.     {
  196.         chosen = getch();
  197.     } while( chosen != '1' && chosen != '2' && chosen!= '3' && chosen != '4' );
  198.     switch( chosen )
  199.     {
  200.         /* l sono le linee, c le colonne, limits il limite di tasti da premere partendo da '1', tmax il turno massimo */
  201.         case '1':
  202.             *l = 6;
  203.             *c = 9;
  204.             *limits = '4';
  205.             *tmax = 16;
  206.             break;
  207.        
  208.         case '2':
  209.             *l = 7;
  210.             *c = 13;
  211.             *limits = '6';
  212.             *tmax = 30;
  213.             break;
  214.        
  215.         case '3':
  216.             *l = 9;
  217.             *c = 15;
  218.             *limits = '8';
  219.             *tmax = 49;
  220.             break;
  221.        
  222.         case '4':
  223.             *l = MAXLINE;
  224.             *c = MAXCOLUMN;
  225.             *limits = '9';
  226.             *tmax = 72;
  227.             break;
  228.     }
  229. }
  230.  
  231.  
  232.  
  233. /* Funzione chooseSign */
  234. /* Due parametri ( due puntatori ) e nessun uscita */
  235. /* Scegli il tuo segno fra X o O */
  236.  
  237. void chooseSign( Player *playerOne, Player *playerTwo )
  238. {    
  239.          printf( "%s", playerOne->name );
  240.          printf( ", che segno scegli? ");
  241.          printf( "\n\n\n\n" );
  242.          printf( "\t\t\tX\t\t\t" );
  243.          printf( "O" );
  244.          
  245.          while( ( ( playerOne->sign = toupper( getch() ) ) != 'X' ) && playerOne->sign != 'O' )
  246.              ;
  247.          if( playerOne->sign == 'X' )             /* Significa: Se il segno inserito convertito in maiuscolo è X, allora... */
  248.              playerTwo->sign = 'O';
  249.          else if( playerOne->sign == 'O' )
  250.              playerTwo->sign = 'X';
  251. }
  252.  
  253.  
  254.  
  255. /* Funzione createGameZone */
  256. /* 3 parametri e nessun uscita */
  257. /* Crea la zona di gioco, in base al valore di line e column scelti dall'utente */
  258.  
  259. void createGameZone( char zone[][ MAXCOLUMN ], int l, int c )
  260. {
  261.     int i, j;
  262.    
  263.     for( i = 0; i != l; i++ )
  264.         for( j = 0; j != c; j++ )
  265.         {
  266.             if( i == 0 || i == l - 1 )  /* Il carattere '-' c'è solo nella riga iniziale e finale */
  267.                 zone[ i ][ j ] = '-';
  268.             else if( j % 2 == 0 )       /* Ad ogni colonna di ordine pari c'è un carattere '|' */
  269.                 zone[ i ][ j ] = '|';
  270.         }
  271. }
  272.  
  273.  
  274.  
  275. /* Funzione printGameZone */
  276. /* Due parametri ( una matrice e un intero ) e nessun uscita */
  277. /* Stampa semplicemente la zona di gioco di Forza Quattro */
  278.  
  279. void printGameZone( char zone[][ MAXCOLUMN ], int turn, int l, int c )
  280. {
  281.     int i, j;  
  282.  
  283.     for( i = 0; i != l; i++ )
  284.     {
  285.         printf("\n\t");
  286.         for( j = 0; j != c; j++ )
  287.         {
  288.             /* Stampo i componenti della matrice zone */
  289.             printf( "%c", zone[ i ][ j ]);
  290.            
  291.             /* Stampa il turno quando siamo a metà delle righe */
  292.             if( ( i == l / 2 ) && ( j == c - 1 ) )
  293.             {
  294.                  printf( "\t" );
  295.                  printf( "    Turno %2d", turn + 1 );
  296.             }
  297.         }
  298.     }
  299.     printf( "\n\t" );
  300.     for( i = 0; i != c/2; i++ )
  301.         printf( "%2d", i + 1 );  
  302. }
  303.  
  304.  
  305.  
  306. /* Funzione choosePosition */
  307. /* 7 parametri e un uscita a int */
  308. /* Fai scegliere al giocatore che mossa fare */
  309.  
  310. int choosePosition( int m, char zone[][ MAXCOLUMN ], int *turn, int limits, int l, int pOneSign, int pTwoSign )
  311. {
  312.     int chosen;
  313.     int columnTemp;
  314.     int i;
  315.    
  316.     if( ( m == '2' && *turn % 2 != 0 ) || m == '3' )
  317.         do
  318.         {
  319.             chosen = rand() % 8 + 1 + 48;
  320.         } while( chosen > limits );
  321.     else  
  322.         while( ( ( chosen = getch() ) <= '0' ) || chosen > limits )
  323.             ;
  324.     /* Un tasto corrisponde ad un valore di colonna, per questo bisogna usare lo switch */
  325.     switch( chosen )
  326.     {    
  327.         case '1':
  328.             columnTemp = 1;
  329.             break;    
  330.        
  331.         case '2':
  332.             columnTemp = 3;
  333.             break;    
  334.        
  335.         case '3':
  336.             columnTemp = 5;
  337.             break;    
  338.        
  339.         case '4':
  340.             columnTemp = 7;
  341.             break;    
  342.        
  343.         case '5':
  344.             columnTemp = 9;
  345.             break;    
  346.        
  347.         case '6':
  348.             columnTemp = 11;
  349.             break;    
  350.        
  351.         case '7':
  352.             columnTemp = 13;
  353.             break;    
  354.        
  355.         case '8':
  356.             columnTemp = 15;
  357.             break;    
  358.        
  359.         case '9':
  360.             columnTemp = 17;
  361.             break;
  362.     }
  363.     if( zone[ 1 ][ columnTemp ] != 0 )  /* Se la colonna è piena, la mossa deve essere ripetuta */
  364.         return 1;
  365.     for( i = 0; i != l; i++ )
  366.     {
  367.         if( zone[ i ][ columnTemp ] == 0 && zone[ i + 1 ][ columnTemp ] != 0 )
  368.         {
  369.             ( *turn % 2 == 0 ) ? ( zone[ i ][ columnTemp ] = pOneSign ) : ( zone[ i ][ columnTemp ] = pTwoSign );
  370.             ++*turn;
  371.             return 0;
  372.         }
  373.     }
  374.     return 1;  /* Mossa non valida */
  375. }
  376.  
  377.  
  378.  
  379. /* Funzione choosePosition */
  380. /* 5 parametri e un uscita a int */
  381. /* Verifica se il giocatore ha vinto o no */
  382.  
  383. int win( char zone[][ MAXCOLUMN ], int turn, int tmax, int l, int c )
  384. {
  385.     int i, j;
  386.    
  387.     /* Pareggio */    
  388.     if( turn == tmax )
  389.         return 2;  
  390.        
  391.     /* Come metodo uso la traslazione di un vettore immaginario nella matrice */
  392.     /* Vittoria orizzontale con X e O */
  393.     for( i = 1; i != l - 1; i++ )
  394.         for( j = 1; j <= c - 8; j+=2 )
  395.         {
  396.             if( zone[ i ][ j ] == 'X' && zone[ i ][ j + 2 ] == 'X' && zone[ i ][ j + 4 ] == 'X' && zone[ i ][ j + 6 ] == 'X' )
  397.                 return 1;
  398.             if( zone[ i ][ j ] == 'O' && zone[ i ][ j + 2 ] == 'O' && zone[ i ][ j + 4 ] == 'O' && zone[ i ][ j + 6 ] == 'O' )
  399.                 return 1;
  400.         }
  401.  
  402.     /* Vittoria vericale con X e O  */
  403.     for( j = 1; j < c - 1; j+=2 )
  404.         for( i = 1; i <= l - 4 - 1; i++ )
  405.         {
  406.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j ] == 'X' && zone[ i + 2 ][ j ] == 'X' && zone[ i + 3 ][ j ] == 'X' )
  407.                 return 1;
  408.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j ] == 'O' && zone[ i + 2 ][ j ] == 'O' && zone[ i + 3 ][ j ] == 'O' )
  409.                 return 1;
  410.         }
  411.    
  412.     /* Vittoria diagonale "\" con X e O*/
  413.     for( i = 1; i <= l - 4 - 1; i++ )
  414.         for( j = 1; j <= c - 8; j+=2 )
  415.         {
  416.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j + 2 ] == 'X' && zone[ i + 2 ][ j + 4 ] == 'X' && zone[ i + 3 ][ j + 6 ] == 'X' )
  417.                 return 1;
  418.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j + 2 ] == 'O' && zone[ i + 2 ][ j + 4 ] == 'O' && zone[ i + 3 ][ j + 6 ] == 'O' )
  419.                 return 1;
  420.         }
  421.        
  422.     /* Vittoria diagonale "/" con X e O*/
  423.     for( i = 1; i <= l - 4 - 1; i++ )
  424.         for( j = 7; j <= c; j+=2 )
  425.         {
  426.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j - 2 ] == 'X' && zone[ i + 2 ][ j - 4 ] == 'X' && zone[ i + 3 ][ j - 6 ] == 'X' )
  427.                 return 1;
  428.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j - 2 ] == 'O' && zone[ i + 2 ][ j - 4 ] == 'O' && zone[ i + 3 ][ j - 6 ] == 'O' )
  429.                 return 1;
  430.         }
  431.                  
  432.     return 0;  /* Nessuna vittoria */
  433. }
  434.  
  435.  
  436.  
  437. /* Funzione end */
  438. /* 4 parametri e nessun uscita */
  439. /* Visualizza il messaggio finale */
  440.  
  441. void end( char *pOneName, char *pTwoName, int v, int turn )
  442. {
  443.    if( v == 1 )
  444.    {  
  445.        printf( "Complimenti " );
  446.        printf( "%s", turn % 2 == 0 ? pTwoName : pOneName );
  447.        printf( ", hai vinto la sfida!" );
  448.    }
  449.    else
  450.    {
  451.        printf( "Siete scarsi, nessuno dei due ha vinto!" );    
  452.    }
  453.    printf( "\n\nTurni" );
  454.    printf(" totali:   ");
  455.    printf("%d", turn + 1);
  456.    getch();
  457. }


PM Quote
Avatar
mangasdani (Normal User)
Newbie


Messaggi: 2
Iscritto: 04/06/2012

Segnala al moderatore
Postato alle 10:42
Lunedì, 04/06/2012
non riusco a compilare il tuo programma ,perché mi manca il codice #include "forza quattro.c"

PM Quote
Avatar
mangasdani (Normal User)
Newbie


Messaggi: 2
Iscritto: 04/06/2012

Segnala al moderatore
Postato alle 10:58
Lunedì, 04/06/2012
non riusco a compilare il tuo programma ,perché mi manca il codice #include "forza quattro.c"

PM Quote
Avatar
weg51 (Normal User)
Newbie


Messaggi: 2
Iscritto: 23/05/2012

Segnala al moderatore
Postato alle 13:57
Mercoledì, 06/06/2012
Sì scusate XD in effetti ho postato male il codice: effettivamente ho sbagliato e ho incluso il file forza4.c nello stesso codice, ora lo riposto:
FUNZIONE MAIN
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #include "forza quattro.c"
  6.  
  7.  int main()
  8.  {
  9.    char gameZone[ MAXLINE ][ MAXCOLUMN ] = { 0 };  /* Questo è il campo di gioco */
  10.   int line, column;  /* Variabili che mi servono per limitare la grandezza del campo di gioco */
  11.   int limits;  /* Serve per limitare la scelta dell'utente. Su campi di gioco diversi la scelta può cambiare */
  12.   int mode;  /* Serve per memorizzare la modalità di gioco */
  13.   int turnMax;  /* Turni massimi possibili */
  14.   int turn = 0;
  15.   int victory;
  16.   Player playerOne, playerTwo;    /* Dichiaro i due di giocatori con il tipo struct player */
  17.  
  18.   intro();
  19.   clrscr();
  20.  
  21.   start();
  22.   clrscr();
  23.  
  24.   gameMode( &mode );  /* Passo &mode perchè il parametro di questa funzione è un puntatore */
  25.   clrscr();
  26.  
  27.   insertName( playerOne.name, playerTwo.name, mode );
  28.   clrscr();
  29.  
  30.   chooseGameZone( &line, &column, &limits, &turnMax );
  31.   clrscr();
  32.  
  33.   chooseSign( &playerOne, &playerTwo );
  34.   createGameZone( gameZone, line, column );
  35.  
  36.   do
  37.   {
  38.       clrscr();
  39.       printGameZone( gameZone, turn, line, column );
  40.       /* Qui il giocatore sceglie la mossa che deve fare */
  41.       turn % 2 == 0 ?
  42.       printf( "\n\n\n\n\n%s", turn % 2 == 0 ? playerOne.name  : playerTwo.name );
  43.       printf( ", fai la tua mossa" );
  44.       while( choosePosition( mode, gameZone, &turn, limits, line, playerOne.sign, playerTwo.sign ) );  /* Finchè la mossa non è corretta non uscire dal ciclo */
  45.   } while( !( victory = win( gameZone, turn, turnMax, line, column ) ) );  /* Il valore di victory mi serve per determinare il messaggio finale */
  46.   clrscr();
  47.  
  48.   printf( "\t\t\t Situazione finale" );
  49.  
  50.   printGameZone( gameZone, turn, line, column );
  51.    getch();  /* Stoppa il programma per vedere la situazione finale */
  52.  clrscr();  
  53.  
  54.  end( playerOne.name, playerTwo.name, victory, turn );
  55.  clrscr();
  56.  getch();
  57.  
  58.  return 0;
  59.  }


FORZA4.C
Codice sorgente - presumibilmente C++

  1. /* Funzione intro */
  2.  /* Nessun parametro e uscita */
  3.  /* Visualizza a schermo la schermata d'introduzione */
  4.  
  5.  void intro( void )
  6.  {
  7.   printf( "\n\n\n" );
  8.   printf( "Benvenuto a Forza 4!!!");
  9.   getch();
  10. }
  11.  
  12.  
  13.  
  14.  
  15.  /* Funzione start */
  16.  /* Nessun parametro e uscita */
  17.  /* Decidi cosa fare, se iniziare a giocare o se leggere le regole */
  18.  
  19.  void start( void )
  20.  {
  21.    int chosen = 0;
  22.      
  23.   /* Ciclo di controllo, mi permette di controllare l'input dell'utente */
  24.   while( chosen != '1' )
  25.   {
  26.       printf( "Cosa vuoi fare? " );
  27.       printf( "\n\n1." );
  28.       printf( " Giocare" );
  29.       printf( "\n2." );
  30.       printf( " Leggere le regole" );
  31.       switch( chosen = getch() )
  32.       {
  33.   /* Non metto il case '1' perchè, se inserisco '1', non entra neanche nello switch, perchè il ciclo risulta FALSO! */
  34.          case '2':
  35.               clrscr();
  36.               rules();
  37.               break;
  38.          
  39.           default:
  40.               break;
  41.       }
  42.         clrscr();
  43.     }
  44.  }
  45.  
  46.  
  47.  
  48.  /* Funzione rules */
  49.  /* Nessun parametro e uscita */
  50.  /* Visualizza le regole */
  51.  
  52.  void rules( void )
  53.  {
  54.     printf( "\n\t\t\t\tRegole" );
  55.     printf( "\n\nSi puo' vincere in vari modi:\n"
  56.          "- Facendo una riga di 4 \"X\" o 4 \"O\"\n"
  57.          "- Facendo una colonna di 4 \"X\" o 4 \"O\"\n"
  58.          "- Facendo una diagonale di 4 \"X\" o 4 \"O\"\n\n"
  59.          "Per scegliere in che colonna mettere la \"X\" o la \"O\" premendo il tasto\ndella colonna corrispondente"
  60.          "\n\nEcco qui la tabella con i tasti corrispondenti:\n\n" );
  61.  printf( "\t\t\t---------------\n" );
  62.  printf("\t\t\t| | | | | | | |\n"
  63.         "\t\t\t| | | | | | | |\n"
  64.         "\t\t\t| | | | | | | |\n"
  65.         "\t\t\t| | | | | | | |\n"
  66.         "\t\t\t| | | | | | | |\n"
  67.         "\t\t\t| | | | | | | |\n" );
  68.  printf( "\t\t\t---------------\n" );
  69.  printf( "\t\t\t 1 2 3 4 5 6 7  " );
  70.  getch();
  71.  }
  72.  
  73.  
  74.  
  75.  /* Funzione gameMode */
  76.  /* Un parametro ( un puntatore ) e nessun uscita */
  77.  /* Scegli la modalità di gioco, ovvero contro chi giocare */
  78.  
  79.  void gameMode( int *m )
  80.  {
  81.   printf( "Che modalita' di gioco vuoi scegliere?" );
  82.   printf( "\n\n1." );
  83.   printf( " Classica" );
  84.   printf( "\n2." );
  85.   printf( " Forza 4 per 4" );
  86.   do {
  87.       *m = getch();
  88.   } while( *m != '1' && *m != '2' );
  89.  }
  90.  
  91.  
  92.  /* Funzione insertName */
  93.  /* Due parametri ( due stringhe ) e nessun uscita */
  94.  /* Inserisce il nickname nella struttura Player */
  95.  
  96.  void insertName( char *t, char *n )
  97. {
  98.   do {
  99.       printf( "Inserisci il tuo nome [Player 1]" );
  100.       scanf( "%s",t );
  101.       printf( "\t%s\n\n", t );
  102.       gets( n );
  103.       printf( "\n" );
  104.       printf( "Inserisci il tuo nome [Player 2]" );
  105.       scanf( "%s",t );
  106.       printf( "\t%s\n\n", t );
  107.       if( strcmpi( n, "CPU" ) == 0 )
  108.           printf( "Il nome %s non puo' essere usato! Usane un altro!\n\n", *n );
  109.   } while( strcmpi( n, "CPU" ) == 0 );                
  110.  }
  111.  
  112.  
  113.  
  114. /* Funzione chooseGameZone */
  115. /* Tre parametri ( tre puntatori ) e nessun uscita */
  116. /* 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 */
  117.  
  118. void chooseGameZone( int *l, int *c, int *limits, int *tmax )
  119. {
  120.     int chosen;
  121.    
  122.     printf( "Di che grandezza vuoi la Griglia di Gioco?" );
  123.     printf( "\n\n1." );
  124.     printf( " Piccolo\t" );
  125.     printf( "[4x4]" );
  126.     printf( "\n2." );
  127.     printf(" Medio\t" );
  128.     printf( "[5x6]" );
  129.     printf( "\n3." );
  130.     printf( " Grande\t" );
  131.     printf( "[7x7]" );
  132.     printf( "\n4." );
  133.     printf( " Grandissimo\t" );
  134.     printf( "[8x9]" );
  135.     do
  136.     {
  137.         chosen = getch();
  138.     } while( chosen != '1' && chosen != '2' && chosen!= '3' && chosen != '4' );
  139.     switch( chosen )
  140.     {
  141.         /* l sono le linee, c le colonne, limits il limite di tasti da premere partendo da '1', tmax il turno massimo */
  142.         case '1':
  143.             *l = 6;
  144.             *c = 9;
  145.             *limits = '4';
  146.             *tmax = 16;
  147.             break;
  148.        
  149.         case '2':
  150.             *l = 7;
  151.             *c = 13;
  152.             *limits = '6';
  153.             *tmax = 30;
  154.             break;
  155.        
  156.         case '3':
  157.             *l = 9;
  158.             *c = 15;
  159.             *limits = '8';
  160.             *tmax = 49;
  161.             break;
  162.        
  163.         case '4':
  164.             *l = MAXLINE;
  165.             *c = MAXCOLUMN;
  166.             *limits = '9';
  167.             *tmax = 72;
  168.             break;
  169.     }
  170. }
  171.  
  172.  
  173.  
  174. /* Funzione chooseSign */
  175. /* Due parametri ( due puntatori ) e nessun uscita */
  176. /* Scegli il tuo segno fra X o O */
  177.  
  178. void chooseSign( Player *playerOne, Player *playerTwo )
  179. {    
  180.          printf( "%s", playerOne->name );
  181.          printf( ", che segno scegli? ");
  182.          printf( "\n\n\n\n" );
  183.          printf( "\t\t\tX\t\t\t" );
  184.          printf( "O" );
  185.          
  186.          while( ( ( playerOne->sign = toupper( getch() ) ) != 'X' ) && playerOne->sign != 'O' )
  187.              ;
  188.          if( playerOne->sign == 'X' )             /* Significa: Se il segno inserito convertito in maiuscolo è X, allora... */
  189.              playerTwo->sign = 'O';
  190.          else if( playerOne->sign == 'O' )
  191.              playerTwo->sign = 'X';
  192. }
  193.  
  194.  
  195.  
  196. /* Funzione createGameZone */
  197. /* 3 parametri e nessun uscita */
  198. /* Crea la zona di gioco, in base al valore di line e column scelti dall'utente */
  199.  
  200. void createGameZone( char zone[][ MAXCOLUMN ], int l, int c )
  201. {
  202.     int i, j;
  203.    
  204.     for( i = 0; i != l; i++ )
  205.         for( j = 0; j != c; j++ )
  206.         {
  207.             if( i == 0 || i == l - 1 )  /* Il carattere '-' c'è solo nella riga iniziale e finale */
  208.                 zone[ i ][ j ] = '-';
  209.             else if( j % 2 == 0 )       /* Ad ogni colonna di ordine pari c'è un carattere '|' */
  210.                 zone[ i ][ j ] = '|';
  211.         }
  212. }
  213.  
  214.  
  215.  
  216. /* Funzione printGameZone */
  217. /* Due parametri ( una matrice e un intero ) e nessun uscita */
  218. /* Stampa semplicemente la zona di gioco di Forza Quattro */
  219.  
  220. void printGameZone( char zone[][ MAXCOLUMN ], int turn, int l, int c )
  221. {
  222.     int i, j;  
  223.  
  224.     for( i = 0; i != l; i++ )
  225.     {
  226.         printf("\n\t");
  227.         for( j = 0; j != c; j++ )
  228.         {
  229.             /* Stampo i componenti della matrice zone */
  230.             printf( "%c", zone[ i ][ j ]);
  231.            
  232.             /* Stampa il turno quando siamo a metà delle righe */
  233.             if( ( i == l / 2 ) && ( j == c - 1 ) )
  234.             {
  235.                  printf( "\t" );
  236.                  printf( "    Turno %2d", turn + 1 );
  237.             }
  238.         }
  239.     }
  240.     printf( "\n\t" );
  241.     for( i = 0; i != c/2; i++ )
  242.         printf( "%2d", i + 1 );  
  243. }
  244.  
  245.  
  246.  
  247. /* Funzione choosePosition */
  248. /* 7 parametri e un uscita a int */
  249. /* Fai scegliere al giocatore che mossa fare */
  250.  
  251. int choosePosition( int m, char zone[][ MAXCOLUMN ], int *turn, int limits, int l, int pOneSign, int pTwoSign )
  252. {
  253.     int chosen;
  254.     int columnTemp;
  255.     int i;
  256.    
  257.     if( ( m == '2' && *turn % 2 != 0 ) || m == '3' )
  258.         do
  259.         {
  260.             chosen = rand() % 8 + 1 + 48;
  261.         } while( chosen > limits );
  262.     else  
  263.         while( ( ( chosen = getch() ) <= '0' ) || chosen > limits )
  264.             ;
  265.     /* Un tasto corrisponde ad un valore di colonna, per questo bisogna usare lo switch */
  266.     switch( chosen )
  267.     {    
  268.         case '1':
  269.             columnTemp = 1;
  270.             break;    
  271.        
  272.         case '2':
  273.             columnTemp = 3;
  274.             break;    
  275.        
  276.         case '3':
  277.             columnTemp = 5;
  278.             break;    
  279.        
  280.         case '4':
  281.             columnTemp = 7;
  282.             break;    
  283.        
  284.         case '5':
  285.             columnTemp = 9;
  286.             break;    
  287.        
  288.         case '6':
  289.             columnTemp = 11;
  290.             break;    
  291.        
  292.         case '7':
  293.             columnTemp = 13;
  294.             break;    
  295.        
  296.         case '8':
  297.             columnTemp = 15;
  298.             break;    
  299.        
  300.         case '9':
  301.             columnTemp = 17;
  302.             break;
  303.     }
  304.     if( zone[ 1 ][ columnTemp ] != 0 )  /* Se la colonna è piena, la mossa deve essere ripetuta */
  305.         return 1;
  306.     for( i = 0; i != l; i++ )
  307.     {
  308.         if( zone[ i ][ columnTemp ] == 0 && zone[ i + 1 ][ columnTemp ] != 0 )
  309.         {
  310.             ( *turn % 2 == 0 ) ? ( zone[ i ][ columnTemp ] = pOneSign ) : ( zone[ i ][ columnTemp ] = pTwoSign );
  311.             ++*turn;
  312.             return 0;
  313.         }
  314.     }
  315.     return 1;  /* Mossa non valida */
  316. }
  317.  
  318.  
  319.  
  320. /* Funzione choosePosition */
  321. /* 5 parametri e un uscita a int */
  322. /* Verifica se il giocatore ha vinto o no */
  323.  
  324. int win( char zone[][ MAXCOLUMN ], int turn, int tmax, int l, int c )
  325. {
  326.     int i, j;
  327.    
  328.     /* Pareggio */    
  329.     if( turn == tmax )
  330.         return 2;  
  331.        
  332.     /* Come metodo uso la traslazione di un vettore immaginario nella matrice */
  333.     /* Vittoria orizzontale con X e O */
  334.     for( i = 1; i != l - 1; i++ )
  335.         for( j = 1; j <= c - 8; j+=2 )
  336.         {
  337.             if( zone[ i ][ j ] == 'X' && zone[ i ][ j + 2 ] == 'X' && zone[ i ][ j + 4 ] == 'X' && zone[ i ][ j + 6 ] == 'X' )
  338.                 return 1;
  339.             if( zone[ i ][ j ] == 'O' && zone[ i ][ j + 2 ] == 'O' && zone[ i ][ j + 4 ] == 'O' && zone[ i ][ j + 6 ] == 'O' )
  340.                 return 1;
  341.         }
  342.  
  343.     /* Vittoria vericale con X e O  */
  344.     for( j = 1; j < c - 1; j+=2 )
  345.         for( i = 1; i <= l - 4 - 1; i++ )
  346.         {
  347.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j ] == 'X' && zone[ i + 2 ][ j ] == 'X' && zone[ i + 3 ][ j ] == 'X' )
  348.                 return 1;
  349.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j ] == 'O' && zone[ i + 2 ][ j ] == 'O' && zone[ i + 3 ][ j ] == 'O' )
  350.                 return 1;
  351.         }
  352.    
  353.     /* Vittoria diagonale "\" con X e O*/
  354.     for( i = 1; i <= l - 4 - 1; i++ )
  355.         for( j = 1; j <= c - 8; j+=2 )
  356.         {
  357.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j + 2 ] == 'X' && zone[ i + 2 ][ j + 4 ] == 'X' && zone[ i + 3 ][ j + 6 ] == 'X' )
  358.                 return 1;
  359.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j + 2 ] == 'O' && zone[ i + 2 ][ j + 4 ] == 'O' && zone[ i + 3 ][ j + 6 ] == 'O' )
  360.                 return 1;
  361.         }
  362.        
  363.     /* Vittoria diagonale "/" con X e O*/
  364.     for( i = 1; i <= l - 4 - 1; i++ )
  365.         for( j = 7; j <= c; j+=2 )
  366.         {
  367.             if( zone[ i ][ j ] == 'X' && zone[ i + 1 ][ j - 2 ] == 'X' && zone[ i + 2 ][ j - 4 ] == 'X' && zone[ i + 3 ][ j - 6 ] == 'X' )
  368.                 return 1;
  369.             if( zone[ i ][ j ] == 'O' && zone[ i + 1 ][ j - 2 ] == 'O' && zone[ i + 2 ][ j - 4 ] == 'O' && zone[ i + 3 ][ j - 6 ] == 'O' )
  370.                 return 1;
  371.         }
  372.                  
  373.     return 0;  /* Nessuna vittoria */
  374. }
  375.  
  376.  
  377.  
  378. /* Funzione end */
  379. /* 4 parametri e nessun uscita */
  380. /* Visualizza il messaggio finale */
  381.  
  382. void end( char *pOneName, char *pTwoName, int v, int turn )
  383. {
  384.    if( v == 1 )
  385.    {  
  386.        printf( "Complimenti " );
  387.        printf( "%s", turn % 2 == 0 ? pTwoName : pOneName );
  388.        printf( ", hai vinto la sfida!" );
  389.    }
  390.    else
  391.    {
  392.        printf( "Siete scarsi, nessuno dei due ha vinto!" );    
  393.    }
  394.    printf( "\n\nTurni" );
  395.    printf(" totali:   ");
  396.    printf("%d", turn + 1);
  397.    getch();
  398. }


PM Quote