/*
Name: Seth Hopper				Date: 12/15/00  			Box # 918

This is blackjack, it works fine except there is some problem getting the cards.  I get the same ones everytime and that should not be.  I've looked for the problemfor many moons now and I have no clue, I am very frustrated and I am very tired, this is what you get.  Sorry.
*/
#include <iostream.h>
#include "./random/randgen.h"
#include <unistd.h>

int value (int number)
{	
	number = number + 1;
	
	while (number > 13)
	{
		number = number - 13;
	}
	if (number == 1) number = 11;
	if (number == 11) number = 10;
	if (number == 12) number = 10;
	if (number == 13) number = 10;

	return number;
}

void get_card (int card)
{
	int suit, number;
	
	suit = card / 13;
			
	number = card + 1;	
	
	while (number > 13)
	{
		number = number - 13;
	}
		
	if (number == 1) cout << "Ace";
	else if (number == 11) cout << "Jack";
	else if (number == 12) cout <<  "Queen";
	else if (number == 13) cout <<  "King";
	else cout << number;

	cout << " of ";

	if (suit == 0) cout << "Spades";
	else if (suit == 1) cout << "Hearts";
	else if (suit == 2) cout << "Diamonds";
	else if (suit == 3) cout << "Clubs";
}

int check_card(int card, int number_used)
{
	int cardy[53], i;

	if (number_used % 52 == 0)
	{
		for (i = 1; i < 52; i++)
		{
			cardy[i] = 0;
		}
	}
	
	for (i = 1; i < 52; i++)
	{	
		if (card == i) 
		{
			if (cardy[i] == 0) return 1;
			
			cardy[i] = 1;
		}
	}
	return 0;
}

int bet()
{	
	int bet, chances = 0;
	
	cout << "\n\nWhat would you like to bet? ";
	cin >> bet;
		
	while (bet > 20)
	{
		cout << "Please enter a bet $20 or less: ";
		cin >> bet;
			
		chances++;
			
		if (chances == 3)
		{
			cout << "You've entered the wrong number one too many times buster!\n";
			cout << "Your blackjack career has come to an 
end!\n";
			exit(1);
		}
	}
	return bet;
}	

void aces(int card1, int card2, int card3, int card4, int card5, int card_total)
{
	int ace = 0;
	
	if (card1 == 11) ace++;
	if (card2 == 11) ace++;
	if (card3 == 11) ace++;
	if (card4 == 11) ace++;
	if (card5 == 11) ace++;
	
	if (ace > 0)
	{
		while (ace > 0)
		{
			cout << card_total - (10 * ace);
			if (ace > 1) cout << ", ";
			else cout << " or ";
			ace--;
		}	
		
		if (card_total > 21) cout << "  (I don't reccomend any totals above 21.)";
	}
	else cout << card1 + card2 + card3 + card4 + card5;
}

int get_number(int number_used)
{
	int used = 0, number;
	//srandom(time(NULL));
	
	while (used == 0)
	{
		number = 1 + lrand48() % 52; //random() % 52;
			
		used = check_card(number, number_used);
	}

	return number;
}

void dealer_hand(int card1, int card2)
{	
	cout << "\n\nThe dealer had: ";
	
	get_card(card1);
	cout << ", "; 
	get_card(card2);	
}
	 

int best_total(int card1, int card2, int card3, int card4, int card5)
{
	int best = 0, ace = 0, card_total;
	
	if (card1 == 11) ace++;
	if (card2 == 11) ace++;
	if (card3 == 11) ace++;
	if (card4 == 11) ace++;
	if (card5 == 11) ace++;
	
	card_total = card1 + card2 + card3 + card4 + card5;
	
	if(card_total > 21)
	{
		while (best <= 21)
		{
			best = card_total - (10 * ace);
			ace--;
		}
	}
	else best = card_total;
	
	return best;
}

void compare1(int total1, int total2)
{
	if ((total1 <= 21) && (total2 > 21)) cout << "\n\nDealer busts, you win!\n\n";
	
	if ((total2 > total1) && (total2 <= 21)) cout << "\n\nYou lose this hand.\n\n";

	if (total1 > total2) cout << "\n\nYou win this hand.\n\n";
	
	if (total1 == total2) cout << "\n\nThe hands are even, nobody wins.\n\n";
}
	
int compare2(int total1, int total2, int money, int bet)
{
	if ((total1 <= 21) && (total2 > 21)) 
	{
		money = money + bet;
		
		cout << "You now have $" << money << endl;
	}
	
	if ((total2 > total1) && (total2 <= 21)) 
	{
		money = money - bet;
		
		cout << "You now have $" << money << endl;
	}

	if (total1 > total2) 
	{
		money = money + bet;
		
		cout << "You now have $" << money << endl;
	}
		
	return money;	
}	
	
int main ()
{	
	int money = 100, dealer_total, dealer1, dealer2, dealer3, dealer4, dealer5;
	int player1, player2, player3, player4, player5, player_total, number, cards = 0, dnumber1;
	int dnumber2, dnumber3, dnumber4, dnumber5, bet1;
	char hit_choice;

	cout << "\nHello and welcome to Blackjack!  Let the showdown begin.\n";
	cout << "You start with $100 and there is a maximum bet of $20.\n";
	
	while (money > 0) 
	{
		bet1 = bet();
		
		cout << "Dealer: ";
			
		dnumber1 = get_number(cards);
		dealer1 = value(dnumber1);
			
		cards++;
	
		cout << "? and ";
		
		dnumber2 = get_number(cards);
		dealer2 = value(dnumber2);
		
		cards++;
		
		get_card(dnumber2);
			
		dealer_total = dealer1 + dealer2;
			
		cout << "  Dealer showing " << dealer2;
		cout << "\n\nYou: ";
		
		number = get_number(cards);
		player1 = value(number);
		
		cards++;
		
		get_card(number);
		
		cout << " and ";
		
		number = get_number(cards);
		player2 = value(number);
		
		cards++;
		
		get_card(number);
		
		player_total = player1 + player2;
		
		cout << "   Your total: ";
		aces(player1, player2, 0, 0, 0, player_total);
		
		if ((dealer_total == 21) && (player_total == 21))
		{
			cout << "\n\nYou both have blackjack, no money changes hands.";
			
			dealer_hand (dnumber1, dnumber2);

			cout << "\n\nYou still have $" << money << " left.";
		}
		
		if ((dealer_total == 21) && (player_total != 21))
		{
			cout << "\n\nToo bad, dealer has blackjack, you lose this hand :(";
			
			dealer_hand (dnumber1, dnumber2);
		
			money = money - bet1;
			
			cout << "\n\nYou now have $" << money << " left.";
		}
		
		cout << "\n\nWould you like a hit (h) or to stay (s)";
		
		if ((player1 == 11) || (player2 == 11) || (player_total == 9) || (player_total == 10) ||(player_total == 11))
		{
			cout << " or to double (d)";
		}
		
		cout << "? ";
		cin >> hit_choice;
		
		if ((hit_choice == 'd') || (hit_choice == 'D'))
		{
			bet1 = bet1 * 2;
			
			number = get_number (cards);
			player3 = value(number);
		
			cards++;
			
			cout << "Your double hit:\n\n";
			
			sleep(1);//hesitate(1);
			
			get_card(number);
			
		}
		
		if ((hit_choice == 'h') || (hit_choice == 'H'))
		{
			cout << "\n\nYour hit: ";
			
			number = get_number (cards);
			player3 = value(number);
		
			cards++;
			
			get_card(number);
			
			cout << "     Making your new total: ";
			
			player_total = best_total(player1, player2, player3, 0, 0);
			aces(player1, player2, player3, 0, 0, player_total);

			if (player_total > 21)
			{
				cout << "\n\nOops, you busted.  Sorry, but you lose this hand.";
				
				dealer_hand (dnumber1, dnumber2);
			
				money = money - bet1;
				
				cout << "\n\nYou now have $" << money << " left.";
			}
				
			else
			{
				cout << "\nHit (h) or stay (s)? ";
				cin >> hit_choice;
			
				if ((hit_choice == 'h') || (hit_choice == 'H'))
				{	
					cout << "\n\nYour hit: ";
				
					number = get_number (cards);
					player4 = value(number);
				
					cards++;
					
					get_card(number);
				
					cout << "     Making your new total: ";
					
					player_total = best_total(player1, player2, player3, player4, 0);
					aces(player1, player2, player3, player4, 0, player_total);

					if (player_total > 21)
					{
						cout << "\n\nOops, you busted.  Sorry, but you lose this hand.";
						
						dealer_hand (dnumber1, dnumber2);
						
						money = money - bet1;
						
						cout << "\n\nYou now have $" << money << " left.";
					}
				
					else
					{
						cout << "\nHit (h) or stay (s)? ";
						cin >> hit_choice;
					
						if ((hit_choice == 'h') || (hit_choice == 'H'))
						{	
							cout << "\n\nYour hit: ";
								
							number = get_number (cards);
							player5 = value(number);
					
							cards++;
						
							get_card(number);
						
							cout << "     Making your new total: ";
							
							player_total = best_total (player1, player2, player3, player4, player5);
							aces (player1, player2, player3, player4, player5, player_total);

							if (player_total > 21)
							{
								cout << "\n\nOops, you busted.  Sorry ,but you lose this hand.";
					
								dealer_hand (dnumber1, dnumber2);
									
								money = money - bet1;
					
								cout << "\n\nYou now have $" << money << " left.";
							}
							else
							{
								cout << "Five cards down without exceeding 21, YOU WIN!";
								
								dealer_hand (dnumber1, dnumber2);
							}
						}
					}
				}
			}			
		}				
						
		if (player_total <= 21)
		{
			dealer_hand (dnumber1, dnumber2);
			dealer_total = best_total (dealer1, dealer2, 0, 0, 0);
						
			if (dealer_total < 17)
			{	
				cout << "\n\nDealer hitting ...\n\n";
		
				dnumber3 = get_number (cards);
				dealer3 = value (dnumber3);
			
				sleep(1); //hesitate(1);
				
				cards++;
				
				get_card(dnumber3);
				
				dealer_total = best_total (dealer1, dealer2, dealer3, 0, 0);
				
				if (dealer_total >= 17)		
				{
					cout << "    Total: ";
					aces (dealer1, dealer2, dealer3, 0, 0, dealer_total);
				}
																				
				if (dealer_total < 17)
				{
					cout << "\n\nDealer hitting ...\n\n";
					
					dnumber4 = get_number (cards);
					dealer4 = value (dnumber4);
					
					sleep(1); //hesitate(1);
										
					cards++;
										
					get_card(dnumber4);
						
					dealer_total = best_total (dealer1, dealer2, dealer3, dealer4, 0);

					if (dealer_total >= 17)		
					{
						cout << "    Total: ";
						aces (dealer1, dealer2, dealer3, dealer4, 0, dealer_total);
					}
					
					sleep(2); //hesitate(1);
					//hesitate(1);
	
					if (dealer_total < 17)
					{	
						cout << "\n\nDealer hitting ...\n\n";
																		
						dnumber5 = get_number (cards);
						dealer5 = value (dnumber5);
						
						sleep(1);//hesitate(1);
					
						cards++;
							
						get_card(dnumber5);
						
						dealer_total = best_total (dealer1, dealer2, dealer3, dealer4, dealer5);	
					
						cout << "    Total: ";
						aces (dealer1, dealer2, dealer3, dealer4, dealer5, dealer_total);
					}
				}
			}	
									
			compare1 (player_total, dealer_total);
			money = compare2 (player_total, dealer_total, money, bet1);
		}	
	
	}	
	return 0;
}

