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

/*
Lanciate due dadi a sei facce. Dopo il lancio si calcola la somma dei punti: 
se è 7 o 11 al primo lancio, vincete. 
Se la somma è 2, 3 o 12 al primo lancio (detto "craps"), perdete (vince il banco). 
Se la somma è 4, 5, 6, 8, 9 o 10, la somma diventa il vostro "punteggio". 

Per vincere dovete continuare a lanciare i dadi finché non "fate il punteggio" 
(ovvero ottenete nuovamente lo stesso valore). Se in questa seconda fase 
lanciate un sette prima di aver "fatto il punteggio" avete perduto.
*/

typedef enum {falso, vero} boolean;

int numerocasuale (int inf, int sup);
// restituisce un numero intero positivo compreso tra inf e sup

int lanciadadi (int numdadi, int numfacce);
// lancia un numero specificato di dadi che hanno un numero specificato di facce
// e restituisce la somma dei risultati

boolean craps (void);
// esegue una partita di craps e restituisco come boolean in risultato della partita

boolean continuazione (int primolancio);
// metodo di supporto per il secondo ciclo di tiri in craps()

int main () {
int capitale = 100; int puntata;

// inizializza il generatore di numeri casuali
srand((unsigned int)(time(NULL)%10000));
     
/* 
si parte con 100 euro; a ogni ciclo si punta su una partita di craps
contro il banco. A 0 si perde, a 200 si vince. Buona fortuna!
*/

while (capitale > 0 && capitale < 200) {
   printf ("\n\ninserisci la puntata:");
   scanf ("%d", &puntata);
   // naturalmente dovremmo filtrare opportunamente quest'input:
   // ad es. potremmo rifiutare le puntate superiori al capitale
   // come MINIMO dovremmo richiedere una puntata positiva :)
      
   if (craps() == vero) {
       capitale += puntata;        
       printf ("\n\ndiamine hai vinto! Il tuo capitale ora e' %d", capitale); }
   else {
       capitale -= puntata;        
       printf ("\n\nahahahaha hai perso... il tuo capitale ora e' %d", capitale);
       }   
   getch();
   }

if (capitale < 0) printf ("\n\nLOOOOOOSER!!!"); 
if (capitale > 200) printf ("\n\nanvedi aho', m'hai sbancato");
getch();
}

/ definizioni funzioni

int numerocasuale (int inf, int sup) {
     return (rand() % (sup-inf+1) ) + inf;
}

int lanciadadi (int numdadi, int numfacce) {
    int j; 
    int somma = 0;
    for (j=0; j<numdadi; j++) 
        somma += numerocasuale (1, numfacce);
    
    return somma;
}

boolean craps (void) {
int lancio;
lancio = lanciadadi (2, 6);
if (lancio == 7 || lancio == 11) { 
   printf ("\nhai tirato %d, vinci al primo lancio", lancio);
   return vero;
   }
else if (lancio == 2 || lancio == 3 || lancio == 12) { 
   printf ("\nCRAPS!!! hai perso con %d", lancio);
   return falso;
   }
else return continuazione (lancio);
}


// questa funzione di supporto mi consente di separare nettamente le due fasi 
// di gioco e scrivere codice molto più semplice e leggibile.
// Naturalmente non è obbligatorio utilizzarla... l'altra soluzione
// utilizza una funzione craps() unica con il ciclo while nell'ultimo ramo else

boolean continuazione (int primolancio) {
int altrolancio;

printf ("\ncol primo lancio hai fatto %d", primolancio);
       while (1) // ciclo infinito
       {
           
           altrolancio = lanciadadi (2, 6);

           if (altrolancio == primolancio) 
              { printf ("\nhai tirato ancora %d, diamine! Vinci!!!", altrolancio);
                return vero;
              }
           else if (altrolancio == 7)
              { printf ("\nhai tirato 7, sfigattoooooouuu");
                return falso;
              }
           else printf ("\n hai tirato %d, ritira", altrolancio);
       }
}





