Game.java
Home Up BelotConstants.java Card.java Cards.java RunInfo.java Player.java Game.java Belot.java

 

 

// ----------------------------------
// Game.java
// CS 334
// John Paxton
// ----------------------------------
class Game implements BelotConstants  
{
        // ----------- constructor ---------

	Game ()
	{
		belotCards = new Cards();  
		players = new Player[NUMBER_OF_PLAYERS];  
		players[0] = new Player("Player One");
		players[1] = new Player("Player Two");  
		dealer = 0;
	}  

        // --------------- methods -----------
	public void dealFiveCards()
	{
		whoseTurn = dealer;
		dealer = otherPlayer(dealer);  
		trump = UNKNOWN;
		belotCards.assignValues(trump);  
		belotCards.shuffle();  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
		{
			players[i].dealCards(belotCards, 5);
			players[i].sortCards(trump, USE_TRUMP);
		}  
		flippedCard = belotCards.showNextCard();
	}  
	public void callTrump()
	{
		trump = EVERYTHING;
		caller = 0;  
		belotCards.assignValues(trump);
	}  
	public void finishDealing()
	{
		players[caller].dealCards(belotCards, 3);
		players[otherPlayer(caller)].dealCards(belotCards, 3);  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
		{
			players[i].sortCards(trump, USE_TRUMP);
		}  
		flippedCard = belotCards.showNextCard();
	}  
	public void scoreBonuses()
	{
		boolean bonusesDone = false;
		int numberBelots;
		int card = 0;  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
		{
			numberBelots = players[i].findNumberBelots(trump);
			if (numberBelots > 0)
			{
				System.out.println(players[i].getName() + " has " +
					numberBelots + " belot(s)");
				players[i].addToRawGamePoints(numberBelots * BELOT_BONUS);
			}
		}  
		while ((!bonusesDone) && (card < ALL_FOUR.length))
		{
			for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
			{
				if ( players[i].hasALL_FOUR(ALL_FOUR[card]) )
				{
					System.out.println(players[i].getName() + 
						" has all four " + RANK_NAMES[card] + "s");
					players[i].addToRawGamePoints(ALL_FOUR_BONUSES[card]);
					bonusesDone = true;
				}
			}
			card++;
		}  
		RunInfo bestRun = new RunInfo();
		RunInfo currentRunInfo;
		int winner = -1;  
		if (!bonusesDone)
		{
			for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
			{
				currentRunInfo = players[i].findRunInfo(trump);
				if ( currentRunInfo.betterThan(bestRun, trump) )
				{
					winner = i;
					bestRun = currentRunInfo;
				}
			}
			if ( winner >= 0 )
			{
				System.out.print(players[winner].getName() + " has a ");
				bestRun.print();
				players[winner].addToRawGamePoints(bestRun.calculateValue());
			}
		}  
		System.out.println();
	}
	  
	public void playCards()
	{
		Card [] cards = new Card [NUMBER_OF_PLAYERS];
		int otherPlayer;
		int [] wins = new int [NUMBER_OF_PLAYERS];  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
			wins[i] = 0;  
		for (int i = 0; i < CARDS_IN_HAND; i++)
		{
			otherPlayer = otherPlayer(whoseTurn);  
			cards[whoseTurn] = players[whoseTurn].getCard(0);
			cards[otherPlayer]= players[otherPlayer].findPlay(cards[whoseTurn]);  
			printResult(cards[whoseTurn], cards[otherPlayer], 
							whoseTurn, otherPlayer, trump);  
			if (!cards[whoseTurn].isHigher(cards[otherPlayer], trump))
				whoseTurn = otherPlayer;  
			for (int j = 0; j < NUMBER_OF_PLAYERS; j++)
			{
				players[j].discard(cards[j]);
				players[whoseTurn].addToRawGamePoints(cards[j]);
			}  
			wins[whoseTurn]++;  
			printStatus(false);  
		}  
		players[whoseTurn].addToRawGamePoints(LAST_TRICK_BONUS);
		if (wins[whoseTurn] == CARDS_IN_HAND)
		{
			otherPlayer = otherPlayer(whoseTurn);
			players[whoseTurn].addToRawGamePoints(ALL_TRICKS_BONUS);
			players[whoseTurn].addToRawGamePoints
				(players[otherPlayer].getRawGamePoints());
			players[otherPlayer].setRawGamePoints(0);
		}
		printStatus(false);
	}  
	public void calculateScores()
	{
		int defender = otherPlayer(caller);  
		int pointsForCaller = players[caller].getRawGamePoints();
		int pointsForDefender = players[defender].getRawGamePoints();  
		if (pointsForDefender >= pointsForCaller)
		{
			if (pointsForDefender > pointsForCaller)
			{
				players[defender].setRawGamePoints
				   (pointsForCaller + pointsForDefender);
			}
			players[caller].setRawGamePoints(0);
		}  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
		{
			players[i].addToConvertedGamePoints
				(((players[i].getRawGamePoints() + 5) / 10) * trump);
		}
	}  
	public void printStatus(boolean printPlayers)
	{
		if (printPlayers)
		{
			System.out.println();
			System.out.print("Flipped card = ");
			flippedCard.print();
			System.out.println("Trump = " + TRUMP_NAMES[trump]);
			if (trump != UNKNOWN)
				System.out.println("Caller = " + players[caller].getName());
		}  
		for (int i = 0; i < NUMBER_OF_PLAYERS; i++)
		{  
			System.out.println();
			System.out.print(players[i].getName());
			System.out.println(", current game points: " + 
				players[i].getRawGamePoints() +
			    ", total match points: " + 
				players[i].getConvertedGamePoints());
			  
			if (printPlayers)
				players[i].print();
		}  
		System.out.println("**************************");
   
		pause();
	}  
	private int otherPlayer (int player)
	{
		return NUMBER_OF_PLAYERS - player - 1;
	}  
	private void printResult (Card cardLed, Card cardFollowed, 
						int leader, int follower, int trump)
	{		
		if (cardLed.isHigher(cardFollowed, trump))
			System.out.print(" * ");
		else
			System.out.print("   ");  
		System.out.print(players[leader].getName() + " plays ");
		cardLed.print();  
		if (!cardLed.isHigher(cardFollowed, trump))
			System.out.print(" * ");
		else
			System.out.print("   ");  
		System.out.print(players[follower].getName() + " plays ");
		cardFollowed.print();
	}  
	private void pause()
	{
		// synchronized (this) { try {wait(5000);}
		// catch (InterruptedException e) {}
		try 
		{
			System.in.read();
		} 
		catch (java.io.IOException e) {}
	}  
        // -------------- instance variables --------------
	private Cards belotCards;     // deck of cards
	private Player[] players;     // each player
	private int dealer;           // who deals
	private int trump;            // signifies trump
	private Card flippedCard;     // card on top of deck
	private int whoseTurn;        // whose turn to bid or play
	private int caller;           // caller of trump
}