#include <iostream>
#include <stdlib.h>
#include <time.h>
 /* Prototypy funkcji */
void ShowIntroScreen (void);
void ShowInformation (unsigned long Money);
short GetBet (void);
short DoDiceThrow (void);
unsigned short DoMoneyCalc (short Dice, short Bet, short BetMoney);
unsigned long GetAmount (void);
 /* Początek gry */
main (void)
{
 unsigned long MoneyEarned;
 unsigned long Money;

 short DiceValue;
 short Bet;
 short BetMoney;
  /* Pokaż ekran powitalny i zanicjuj grę */
 ShowIntroScreen ();
 Money = 1000;

  /* Graj dopóki gracz ma pieniądze  
     Zachowaj 100 zł na powrót taksówką do domu */
do
{
  ShowInformation (Money);
   // Pobierz informacje o typie zakładu */
  Bet         = GetBet ();
  BetMoney    = GetAmount ();
  DiceValue   = DoDiceThrow ();
  MoneyEarned = DoMoneyCalc (DiceValue, Bet, BetMoney);

  Money -= BetMoney;

   /* Pokaż wylosowaną liczbę */
  if (MoneyEarned == 0)
  {
   std::cout << "Przegrales. Wylosowano: " << DiceValue;
   std::cout << std::endl << std::endl;
  }
  else
  {
   std::cout << "Wygrales " << MoneyEarned  - BetMoney;
   std::cout << " zl. Wylosowano: " << DiceValue;
   std::cout << std::endl << std::endl;

   Money += MoneyEarned;
  }
 } 
 while (Money > 100);
 std::cout << "Koniec gry. Zatrzymaj" << Money << " zl na taksowke";
 std::cout << std::endl;

 return 0;
}
 /* Pokaż ekran początkowy */
void ShowIntroScreen (void)
{
 std::cout << "     Witaj w grze Craps 1.0";
 std::cout << std::endl << std::endl;
 std::cout << "Oto zasady gry:";
 std::cout << std::endl << std::endl;

 std::cout << "Na poczatku masz 1000 zlotych. ";
 std::cout << std::endl << std::endl;

 std::cout << "Mozliwe sa trzy rozne zaklady. Mozesz postawic na ";
 std::cout << "liczby 2 i 12 co da wygrana   ";
 std::cout << "w stosunku ";
 std::cout << "5 do 1 w przypadku trafienia. Mozesz rowniez postawic na liczby 4 ";
 std::cout << "i  10  ";
 std::cout << "co da wygrana w stosunku 2.5 do 1. ";
 std::cout << std::endl;
 std::cout << "Ostatnim typem zakladu jest postawienie na liczby 6 ";
 std::cout << "i 8 co da wygrana w stosunku 1.5 to 1.";
 std::cout << std::endl << std::endl;

 std::cout << "Minimalnie mozna postawic 10 zlotych a ";
 std::cout << "maksymalnie 100 zlotych.";
 std::cout << std::endl << std::endl;

 std::cout << "Dobrej zabawy!.";
 std::cout << std::endl << std::endl  << std::endl;
}
 /* Pokaż informację o pieniądzach */
void ShowInformation (unsigned long Money)
{
 std::cout << "Masz : " << Money << " zlotych.";
 std::cout << std::endl;
}
 /* Pobierz typ zakładu */
short GetBet (void)
{
 unsigned short BetType;

  /* Pobierz zakład */
 std::cout << "Podaj typ zakladu (1 = '6/8' 2 = '4/10' 3 = '2/12'): ";
 std::cin >> BetType;

  /* Jeżeli wprowadzono nieproawidłową wartość wybierz zakład 6/8 */
 if ((BetType == 1) || (BetType == 2) || (BetType == 3))
 {
  return BetType;
 }
 else
 {
  return 1;
 }
}
 /* Rzuć koścmi - wylosuj liczbę */
short DoDiceThrow (void)
{
 short DiceValue;

  /* Losowanie */
 srand (time (NULL));
 DiceValue = (rand () % 11) + 2;

  /* Jeżeli wypadło 4/10 wylosuj ponownie, aby zminiejszyć prawdopodobieństwo */
 if ((DiceValue == 4) || (DiceValue == 10))
 {
  srand (time (NULL));
  DiceValue = (rand () % 12) + 1;
 }

  /* Jeżeli wypadło 2/12 wylosuj ponownie, aby zmniejszyć prawdopodobieństwo */
 if ((DiceValue == 2) || (DiceValue == 12))
 {
  srand (time (NULL));
  DiceValue = (rand () % 12) + 1;

  if ((DiceValue == 2) || (DiceValue == 12))
  {
   srand (time (NULL));
   DiceValue = (rand () % 12) + 1;
  }
 }

 return DiceValue;
}
 /* Oblicz zyski */
unsigned short DoMoneyCalc (short Dice, short Bet, short BetMoney)
{
 unsigned long MoneyEarned = 0;
 
  /* Ustaw typ zakładu wybrany przez gracza */
 switch (Bet)
 {
  /* 6/8 - wypłata w stosunku 1.5:1 */
 case 1:
  if ((Dice == 6) || (Dice == 8))
  {
   MoneyEarned = BetMoney * 1.5;
  }
  break;  break;
  /* 4/10 - wypłata w stosunku 2.5:1 */
 case 2:
  if ((Dice == 10) || (Dice == 4))
  {
   MoneyEarned = BetMoney * 2.5;
  }
  break;  break;
  /* 2/12 - wypłata w stosunku 5:1 */
 case 3:
  if ((Dice == 2) || (Dice == 12))
  {
   MoneyEarned = BetMoney * 5;
  }
  break;
 default:
  MoneyEarned = 0;
  break;
 }
 
 return MoneyEarned;
}
 /* Pobierz postawioną sumę */
unsigned long GetAmount (void)
{
 unsigned short BetAmount;
  
  /* Pobierz sumę */
 std::cout << "Postaw sume (min 10 - maks 100): ";
 std::cin >> BetAmount;

  /* Korekta jeżeli podano wartość spoza zakresu */
 if (BetAmount < 10)
 {
  BetAmount = 10;
 }

 if (BetAmount > 100)
 {
  BetAmount = 100;
 }

 return BetAmount;
}
