|
// ----------------------------------
// 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
}
|