/*########################################
#  .-------.    ______    Programme   : Jeux CRAPS
# /   o   /|   /\     \   Auteur      : Martin Robinson
#/_______/o|  /o \  o  \  Conception  : 31 Janvier 2012
#| o     | | /   o\_____\ Description : Jeux de hasard
#|   o   |o/ \o   /o    /               douteux avec des
#|     o |/   \ o/  o  /				dés et des regles
#'-------'     \/____o/					malhonnete. Le jeux
#										consiste à brasser
#										deux dés et reproduire
#										la même somme une deuxieme
#										fois. Le joueur perd s'il
#										obtient un sept au deuxieme
#										jet ou 2,3 12 au premier
#										jet. Le joueur gagne 
#										instantanément sil obtient
#										7 au premier jet
##########################################
         (\_/)   directive du preprocesseur
        ( . . ) /
###########################################*/

#include <iostream>
#include <time.h>

#include "martinrobinson.hpp"

using namespace std;

/*       (\_/)   prototype de fonction
        ( . . ) /
###########################################*/

void sept();
void onze();
void looser();
void afficherDeuxDeSix(int, int);
int brasserDeuxDeSix(int &, int &);
bool rejouer();

/*       (\_/)   Programme Principal
        ( . . ) /
###########################################*/

int main ()
{
	/*  (\_/) initialisation
	___( . . )_/________________*/
	int DeeUn,				//premier Dée
		DeeDeux,			//deuxième Dée
		total,				//total du premier lancé
		nouveauTotal;		//total du deuxième lancé

	srand ( time(NULL) );	//initialisé le randomizer

	/*  (\_/) programme principal
	___( . . )_/________________*/

	do
	{
		viderEcran();		//clear screen
		cout << "commencer la partie \n";
		attendre();			//attendre que l'utilisateur appuis sur entrer

		total = brasserDeuxDeSix(DeeUn,DeeDeux);	//nombre alléatoire 1 a 6
		afficheDeuxDeSix(DeeUn, DeeDeux);			//dessine les dés
		if (total == 7)				//le joueur gagne sur un 7
			sept();					
		else if (total == 11)		//le joueur gagne sur un 11
			onze();
		else if (total == 2 || total == 3 || total == 12)	//le joueur perd sur 2 3 ou 12
		{
			cout << total << " = PERDRE !!!!\n";
			looser();
		}
		else				
		{
			cout << total << " : tente de reproduire ce score, mais si vous avez 7, vous perdez\n";
			cout << "============================================\n";
			do
			{
				cout << "-------------------------------------------------\n";
				cout << "le score a atteindre est " << total << '\n';

				attendre();										//appuyer sur entrer pour brasser les dés

				nouveauTotal = brasserDeuxDeSix(DeeUn,DeeDeux);	//nombre alléatoire 1 a 6
				afficheDeuxDeSix(DeeUn, DeeDeux);				//dessine les dés
				cout << "Total = " << nouveauTotal << "\n";
			}while (nouveauTotal != 7 && nouveauTotal != total);//le joueur doit reproduir sont résultat 
																//et eviter un total de 7
			if (nouveauTotal == total)			//gagne si il a reproduit sont total
				cout << " Gagner\n";
			else if (nouveauTotal == 7)			//perd sur un 7
				looser();
		}

		viderCin();
	}while(questionOuiNon("\nvoulez vous jouer encore (O/N) \n"));

	/*  (\_/)  fin
	___( . . )_/________________*/

	cout << bulle << lapin << "Fin du programme\n";
	viderCin();
	attendre();
	return 0;
}

/*       (\_/)   fonction
        ( . . ) /
###########################################*/

/*  récompense le joueur avec
    un gros 7*/
void sept()
{
	cout << "############\n"
		 << "############\n"
		 << "##       ###\n"
		 << "         ###\n"
		 << "       ###\n"
		 << "     ###\n"
		 << "    ###\n"
		 << "    ###\n"
		 << "    ###\n"
		 <<	"    ###\n";
}

/*  récompense le joueur avec
    un gros 11*/
void onze()
{
	cout << "  ###   ###\n"
		 << " ####  ####\n"
		 << "##### #####\n"
		 << "  ###   ###\n"
		 << "  ###   ###\n"
		 << "  ###   ###\n"
		 << "  ###   ###\n"
		 << "  ###   ###\n"
		 << "  ###   ###\n"
		 <<	" ##### #####\n"
		 << " ##### #####\n";
}

//traite le joueur de perdant
//et l'insite au suicide
void looser()
{
	cout << "###        ##########   ##########   ##########  ############ ########### \n"
		 << "###       ############ ############ ############ ############ ############\n"
		 << "###       ###      ### ###      ### ###      ### ###          ###      ###\n"
		 << "###       ###      ### ###      ### ###          ###          ###      ###\n"
		 << "###       ###      ### ###      ### ###          ###          ###      ###\n"
		 << "###       ###      ### ###      ### ##########   ########     ##########  \n"
		 << "###       ###      ### ###      ###  ##########  ########     ########### \n"
		 << "###       ###      ### ###      ###          ### ###          ###      ###\n"
		 << "###       ###      ### ###      ### ###      ### ###          ###      ###\n"
		 <<	"######### ############ ############ ############ ############ ###      ###\n"
		 << "#########  ##########   ##########   ##########  ############ ###      ###\n"
		 << "Loto Quebec recommende le pont Jacque Cartier si vous n'avez plus d'argent!\n";
}

//brasse les deux dés , utilise les references , retourne la somme
int brasseDeuxDeSix(int &un, int &deux)
{
	un = rand()%6+1;	//aléatoire de 1 a 6
	deux = rand()%6+1;
	return un+deux;		//somme
}

/* dessiner deux dés en ascii
   les deux arguments sont les
   valeur de chaques dés
   
	je suis très désolé de l'apparence
	de ce code , mais je ne vois pas de
	meilleur facon de le faire*/
void afficheDeuxDeSix(int un, int deux)
{
	cout << "----- -----\n"
		 << "|" 
		 << (un>1?'o':' ') 
		 << (un==6?'o':' ') 
		 << (un>3?'o':' ') 
		 << "| |"
		 << (deux>1?'o':' ') 
		 << (deux==6?'o':' ') 
		 << (deux>3?'o':' ')
		 << "|\n"
		 << "| " 
		 << (un%2==1?'o':' ')
		 << " | | "
		 << (deux%2==1?'o':' ')
		 << " |\n"
		 << "|" 
		 << (un>3?'o':' ')  
		 << (un==6?'o':' ') 
		 << (un>1?'o':' ')  
		 << "| |"
		 << (deux>3?'o':' ')  
		 << (deux==6?'o':' ') 
		 << (deux>1?'o':' ') 
		 << "|\n"
		 << "----- -----\n";
	return ;
}

/*       (\_/)   fini
        ( . . ) /
###########################################*/