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

struct gioco
{
  int pu;
  int pc;
  int turno; // se pari ad 1 turno giocatore altriimenti se pari a 0 turno del computer
};

struct gioco menu( struct gioco mio )
{
  int temp;
  mio.pu=0;
  mio.pc=0;
  printf( "\n*********************************\n\n" );
  printf( "*               MENU             *\n" );
  printf( "\n*********************************\n\n" );
  printf( "chi comincia a giocare? [1= uomo, 0=programma]\n" );
  scanf( "%d", & temp );
  mio.turno = temp;
  return mio;
}

int lanciaDado()
{
  int dado;
  dado = int( ceil( ( ( double )rand() / ( double )RAND_MAX ) * 6 ) ); //ceil arrotonda per eccesso
  return dado;

}

/

int strateprude( struct gioco mio )
{
    int d, dado;
    int parziale = 0; // tiene somma parziale di quando si tira dado
    int i;

    d = mio.pc - mio.pu;
    /* il computer in base a questi semplici criteri deciderà sul come
     comportarsi:
     - se PC in vantaggio (ovvero punteggioComputer - punteggioGiocatore > 0)
     		- se vantaggio maggiore di 20 pnt tira una sola volta dado
    		- altrimenti tira 5 volte*/
    if ( d >= 0 )
    {
      if ( d > 20 )
      {
        parziale = lanciaDado();
      }
      else
      {
        for ( i = 0; i < 6; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
          }
        }
      }
    }
    else
    {
      /* - se PC è in svantaggio (ovvero punteggioComputer - punteggioGiocatore <= 0)
      		- se svantaggio è compreso tra 0 e -20 tira 5 volte
      		- altrimenti tira finché lo svantaggio diminuisce e rientra nell'intervallo
      		  -20 e 0. */

      if ( d > -20 )
      {
        for ( i = 0; i < 5; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
          }
        }
      }
      else {
        for ( i = 0; ; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
            if ((d+parziale)>=-20){
              break;
            }
          }
        }
      }
    }
     printf( "\n*********************************\n" );
     printf( "\n*        TURNO PROGRAMMA        *\n" );
     printf( "\n*********************************\n\n" );
     printf( "il punteggio del programma e' %d \n", mio.pc+parziale);
     printf( " \n\n\n");
      return parziale;
    }*/

int strate( struct gioco mio )
{
    int d, dado;
    int parziale = 0; // tiene somma parziale di quando si tira dado
    int i;

    d = mio.pc - mio.pu;
    /* il computer in base a questi semplici criteri decideta sul come
       comportarsi:
       - se PC in vantaggio (ovvero punteggioComputer - punteggioGiocatore > 0)
     		- se vantaggio maggiore di 20 pnt tira una sola volta dado
    		- altrimenti tira 5 volte */
    if ( d >= 0 )
    {
      if ( d > 20 )
      {
        parziale = lanciaDado();
      }
      else
      {
        for ( i = 0; i < 6; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
          }
        }
      }
    }
    else
    {
      /* - se Programma è in svantaggio (ovvero punteggioComputer - punteggioGiocatore <= 0)
      		- se svantaggio è compreso tra 0 e -20 tira 5 volte
      		- altrimenti tira finché lo svantaggio diminuisce e rientra nell'intervallo
      		  -20 e 0. */

      if ( d > -20 )
      {
        for ( i = 0; i < 6; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
          }
        }
      }
      else {
        for ( i = 0; ; i++ )
        {
          dado = lanciaDado();
          if ( dado == 1 )
          {
            parziale = 0;
            break;
          }
          else
          {
            parziale = parziale + dado;
            if ((d+parziale)>=-20){
              break;
            }
          }
        }
      }
    }
     printf( "\n*********************************\n" );
     printf( "\n*        TURNO PROGRAMMA        *\n" );
     printf( "\n*********************************\n\n" );
     printf( "il punteggio del programma e' %d \n", mio.pc+parziale);
     printf( " \n \n\n");
      return parziale;
    }

int umano(struct gioco mio)
{
   int dado, temp;
   int parziale = 0; // tiene somma parziale di quando si tira dado
   int i=0;

   printf( "\n*********************************\n" );
   printf( "\n*           TURNO UOMO          *\n" );
   printf( "\n*********************************\n\n" );
   printf( "il tuo punteggio totale e' %d \n", mio.pu);
   printf( "il punteggio del programma e' %d \n", mio.pc);
   printf( "\ncon il primo lancio ");
   for (i=0;;i++){     // come while
   dado= lanciaDado();
   printf( "hai ottenuto %d\n", dado );
   if ( dado == 1 )
        {
          parziale = 0;
          printf( "\nhai perso i punti di questa mano, premi 'p' per passare la mano \n\n");
          while (getchar()!='p');
          break;
        }
   printf( "il tuo punteggio provvisorio e' %d\n", parziale+dado);
   printf( "\nse vuoi tirare ancora, premi 1[uno], altrimenti 0[zero]\n");
   scanf( "%d", & temp );
   if (temp==1){
     parziale=parziale+dado;
   }
   else {
     parziale=parziale+dado;
     printf( " con questa mano hai totalizzato %d punti, passa la mano \n",parziale );
     break;
     }
   }
   printf( " \n");
   return parziale;
}



struct gioco mano ( struct gioco mio )
{
     if ( mio.turno == 0 )
    {
      mio.pc = mio.pc+strate(mio);
    }
    else{
      mio.pu =mio.pu+ umano(mio);//strateprude( mio );
  }
  mio.turno=(mio.turno+1)%2;
  return mio;
}


//------------------MAIN-----------------------

int main( int argc, char * argv[] )
{
  struct gioco miogioco;
  int i,vincitore=0;
  srand ( time(NULL) );

  miogioco=menu(miogioco);

 for (i=0; ; i++){
   if ((miogioco.pu < 100) & (miogioco.pc < 100))
                {
                  miogioco=mano(miogioco);
                }
  else
      break;
    }

  if ( miogioco.pu < miogioco.pc){
  vincitore=1;}
  printf("*     GIOCO FINITO!     *\n");
  if (vincitore==0){
  printf("ha vinto l'umano! \n");}
  else{
    printf("ha vinto la macchina [l'umano che l'ha programmata] \n");}
  printf("\n Premere x per uscire ");

 while (getchar()!='x');
 return 0;
}




