All pastes #930013 Raw Edit

Untitled

public text v1 · immutable
·published 2008-03-06 05:54 UTC
rendered paste body
import java.util.*;


public class Game 
{
	//fields
	public static int numPlayers = 5;									//the number of players that started in the game.
	public static int playersActive = 5;								//the number of players still in the game.
	private static int initialChips = 50;								//this is the number of chips per player per game.
	public static DealerIMPL dealer = new DealerIMPL();					//the dealer to be used throughout the game.
	public static Object gameOver = new Object();						//lock object on if the game is over.
	public static int gameNumber = 1;
	public static Object readyForNewGame = new Object();				//monitor for when the players are ready for a new game.
	
	public static ArrayList<PlayerIMPL> players = new ArrayList<PlayerIMPL>();	//create the array list fo rhte players.
	
	//constructor
	public static void main (String args[]) throws InterruptedException
	{	
		//create the inital deck.
		dealer.newHand();
		//DEBUGING INFO System.out.println("New deck created.");
		
		//create the players threads
		for(int i=0; i < numPlayers; i++)
		{
			PlayerIMPL player = new PlayerIMPL(initialChips, i, players);
			players.add(player);
		}

		//start all of the threads
		for(int r=0; r < numPlayers; r++)
		{
			Thread playerThread = new Thread(players.get(r));
			playerThread.start();
 		}
		
		//wait for the game to be over... when it is run this stuff.
		newGame();
	}
	
	
	public static void newGame()
	{
		//ready for a new game, is everyone else??
		synchronized(readyForNewGame)
		{
			//not every player is ready for a new game.
			while(PlayerIMPL.numberForNewGame < 5)
			{
				try {
					readyForNewGame.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			gameNumber++;
			dealer.newHand();

			//reset the counter.
			PlayerIMPL.numberForNewGame = 0;
		}
		newGame();
	}
}































import java.util.ArrayList;

public class PlayerIMPL implements Player, Runnable
{	
	//fields
	private ArrayList <PlayerIMPL> players;								//the array of players
	private int chips = 0;												//the player's number of chips.
	private int playerNumber;											//the player's number.
	private int numCards;												//current number of cards given.
	private Card[] hand = new Card[Card.HAND_SIZE];						//the player's hand of cards.
	private int[] payment = new int[Game.numPlayers ];					//total of payments you owe.
	public static int numberForNewGame = 0;							//number of players ready for a new game	
	
	//monitors
	private Object readyToCompare = new Object();						//monitor for having all of the threads ready to compute.
	private Object myChipsLock = new Object();							//monitor for my chips
	private Object theirChipsLock = new Object();						//monitor for the other player's chips.
	private Object newGame = new Object();								//monitor for creating the new game.
	
	//constructor 
	public PlayerIMPL(int chips, int playerNumber, ArrayList <PlayerIMPL> players)
	{
		this.players = players;
		this.chips = chips;
		this.playerNumber = playerNumber + 1;
	}
	
	//threaded method.
	public void run()
	{
		while(Game.numPlayers > 1)
		{
			int totalPayments = 0; //this will be used to get the total that the players paid out.
			
			//Get the cards for all of the players.
			for (int i=0; i < Card.HAND_SIZE; i++)
			{
				synchronized (readyToCompare)
				{
					hand[i] = Game.dealer.drawCard();
					numCards++;
					readyToCompare.notifyAll();
				}
			}
			
			//compare the hands
			for(int x=0; x < Game.numPlayers; x++)
			{
				if (x+1 != playerNumber)
				{
					//get the totals.
					PlayerIMPL opponent = players.get(x);
					payment[x] = opponent.compareHands(hand);
					
					//pay your opponent if you lost. (negative means the player lost)
					if (payment[x] < 0)
					{
						payment[x] *= -1; //make the amounts paid positive.	
						
						//remove from your stack
						synchronized(myChipsLock)
						{
							chips -= payment[x];
						}
						
						//add to their stack.
						opponent.receivePayment(payment[x]);
						
						//add to the total paid out
						totalPayments += payment[x];
					}
				}
			}
			
			//determine if the player is the winner
			String output = Game.gameNumber + " " + playerNumber + " " + Card.toString(hand) + " " + chips;
			if(totalPayments == 0)
			{
				output += "*";
			}
			
			//output the final game info.
			System.out.println(output);
			

			//notify to start a new Game.
			synchronized(Game.readyForNewGame)
			{
				PlayerIMPL.numberForNewGame++; //update that there is yet another one ready.
				Game.readyForNewGame.notifyAll();
			}
		}
	}
	
	public int compareHands(Card[] opponentsCards) 
	{	
		//wait until everony has a card to cp
		
		synchronized (readyToCompare)
		{
			//wait until every player has their cards.
			while (numCards < Card.HAND_SIZE)
			{
				try {
					readyToCompare.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			//return the amount of cash that is owed.
			return Card.compareHands(opponentsCards, hand);
		}
	}

	public boolean hasRetired() 
	{
		Game.playersActive--;
		Game.gameOver.notify();
		return false;
	}

	public void receivePayment(int payment) 
	{
		synchronized(theirChipsLock)
		{
			//give the payment to the opponent.
			chips = chips + payment;
		}
	}
}