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

 

 

import java.net.*;
import java.io.*;  
class Server implements BelotConstants
{
	public static void main (String args[])
	{
		try
		{
			ServerSocket belotServer = new ServerSocket(41962);  // 0 .. 2^16
                        Socket client1 = belotServer.accept();
			Socket client2 = belotServer.accept();
			ServerThread server = new ServerThread();
			ClientHandler newClientOne = new ClientHandler(client1, PLAYER_1, server);
			ClientHandler newClientTwo = new ClientHandler(client2, PLAYER_2, server);
			server.setClients(newClientOne, newClientTwo);
			newClientOne.start();
			newClientTwo.start();
		}
		catch (Exception e)
		{
			System.out.println("Problems in Main");
			System.exit(1);
		}
	}
}  
class ServerThread implements BelotConstants
{
	ServerThread()
	{
		belotGame = new Game();
		startGame();
		numberAgains = 0;
	}  
	public void startGame()
	{
		belotGame.getPlayer(PLAYER_1).setTotalPoints(0);
		belotGame.getPlayer(PLAYER_2).setTotalPoints(0);
		belotGame.selectDealer();
		belotGame.dealFiveCards();
	}  
	public void setClients(ClientHandler client1, ClientHandler client2)
	{
		clients = new ClientHandler[2];
		clients[0] = client1;
		clients[1] = client2;
	}  
	private void trumpIsKnown()
	{
		int pointsZero;
		int pointsOne;  
		belotGame.finishDealing();
		belotGame.scoreBonuses();
		belotGame.startPlay();  
		pointsZero = belotGame.getPlayer(PLAYER_1).getRawPoints();
		pointsOne = belotGame.getPlayer(PLAYER_2).getRawPoints();
		sendMessage("#RAWPOINTS#" + pointsZero + "#" + pointsOne + "#", clients[PLAYER_1].clientOutput);
		sendMessage("#RAWPOINTS#" + pointsOne + "#" + pointsZero + "#", clients[PLAYER_2].clientOutput);  
		trickLeader = belotGame.getWhoseTurn();
	}  
	public void showCards(int client, int howMany)
	{  
		int imageIndex;  
		DataOutputStream clientOutput = clients[client].clientOutput;  
		if (howMany == 5)
		{
			int dealer = belotGame.getDealerNumber();
			sendMessage("#DEALER#" + dealer + "#", clientOutput);
		}  
		sendMessage("#CARDSTODISPLAY#" + howMany + "#", clientOutput);  
		for (int card = 0; card < howMany; card++)
		{  
			imageIndex = belotGame.getPlayer(client).getCard(card).getImageNumber();
		        sendMessage("#CARD#" + card + "#" + imageIndex + "#", clientOutput);
		}
		imageIndex = belotGame.getFlippedCard().getImageNumber();
		sendMessage("#CARD#8#28#", clientOutput);
		sendMessage("#CARD#9#28#", clientOutput); 
		sendMessage("#CARD#10#" + imageIndex + "#", clientOutput);
	        sendMessage("#PAINT#", clientOutput);
		}  
	public void makeBid ( int client, String bid, boolean firstBid)
	{
		int opponent = otherPlayer(client);
		int dealer = belotGame.getDealerNumber();  
		if (bid.equals("Pass"))
		{
			if ( firstBid )
			{
				sendMessage("#FIRSTBID#Pass#", clients[opponent].clientOutput);
			}
			else
			{
				sendMessage("#SECONDBID#Pass#", clients[opponent].clientOutput);
			}				
			sendMessage("#PAINT#", clients[opponent].clientOutput);
		}
		else if (bid.equals("Accept"))
		{
			int trump = belotGame.getFlippedCard().getSuit();
			String trumpName = "???";  
			if (trump == CLUBS) trumpName = "Clubs";
			else if (trump == DIAMONDS) trumpName = "Diamonds";
			else if (trump == HEARTS) trumpName = "Hearts";
			else if (trump == SPADES) trumpName = "Spades";
			else if (trump == NOTHING) trumpName = "Nothing";
			else if (trump == EVERYTHING) trumpName = "Everything";  
			belotGame.callTrump(trump, client);
			sendMessage("#FIRSTBID#" + trumpName + "#", clients[opponent].clientOutput);
			sendMessage("#TRUMP#" + trumpName + "#", clients[client].clientOutput);
			trumpIsKnown();
			sendMessage("#PLAYCARD#", clients[otherPlayer(dealer)].clientOutput);
			showCards(client, CARDS_IN_HAND);
			showCards(opponent, CARDS_IN_HAND);  
		}
		else
		{
			int trump;  
			if (bid.equals("Clubs")) trump = CLUBS;
			else if (bid.equals("Diamonds")) trump = DIAMONDS;
			else if (bid.equals("Hearts")) trump = HEARTS;
			else if (bid.equals("Spades")) trump = SPADES;
			else if (bid.equals("Nothing")) trump = NOTHING;
			else trump = EVERYTHING;  
			belotGame.callTrump(trump, client);
			sendMessage("#FIRSTBID#" + bid + "#", clients[opponent].clientOutput);
			trumpIsKnown();			
			sendMessage("#PLAYCARD#", clients[otherPlayer(dealer)].clientOutput);
			showCards(client, CARDS_IN_HAND);
			showCards(opponent, CARDS_IN_HAND);  
		}
	}  
	public void sendMessage (String message, DataOutputStream clientOutput)
	{
		System.out.println("sendMessage: " + message);
		try
		{
			clientOutput.writeUTF(message);
			clientOutput.flush();
		}
		catch (Exception e)
		{
			System.out.println("Error in run " + message);
			System.exit(1);
		}
	}  
	public void passOut()
	{			
		sendMessage("#SLEEP#", clients[PLAYER_1].clientOutput);
		sendMessage("#SLEEP#", clients[PLAYER_2].clientOutput);  
		belotGame.selectDealer();
		belotGame.dealFiveCards();			
		int dealer = belotGame.getDealerNumber();
		showCards(PLAYER_1, 5);
		showCards(PLAYER_2, 5);
		sendMessage("#STARTBIDDING#", clients[otherPlayer(dealer)].clientOutput);
		sendMessage("#PAINT#", clients[otherPlayer(dealer)].clientOutput);
	}  
	public void transmit(int client, String message)
	{
		sendMessage("#MESSAGE#" + message + "#", clients[otherPlayer(client)].clientOutput);
	}  
	public void makePlay(int client, int whichCard)
	{
		sendMessage("#FOLLOWCARD#" + whichCard + "#", clients[otherPlayer(client)].clientOutput);
		cardLed = whichCard;
		sendMessage("#PAINT#", clients[otherPlayer(client)].clientOutput);
	}  
	public void finishPlay(int cardFollowed, int follower)
	{
		int leader = otherPlayer(follower);
		Card cardOne = belotGame.getPlayer(leader).findCard(cardLed);
		Card cardTwo = belotGame.getPlayer(follower).findCard(cardFollowed);  
		belotGame.assignPlayerCard(cardOne, leader);
		belotGame.assignPlayerCard(cardTwo, follower);
		belotGame.determineWinner();  
		int scoreOne = belotGame.getPlayer(leader).getRawPoints();
		int scoreTwo = belotGame.getPlayer(follower).getRawPoints();
		int whoseTurn = belotGame.getWhoseTurn();  
		sendMessage("#CARD#9#" + cardFollowed + "#", clients[leader].clientOutput);  
		if (belotGame.getNumberCards() == 0)
		{
			belotGame.finishPlay();
			belotGame.calculateScores();
							  
			scoreOne = belotGame.getPlayer(leader).getRawPoints();
			scoreTwo = belotGame.getPlayer(follower).getRawPoints();
			int gameOne = belotGame.getPlayer(leader).getGamePoints();
			int gameTwo = belotGame.getPlayer(follower).getGamePoints();
			int totalOne = belotGame.getPlayer(leader).getTotalPoints();
			int totalTwo = belotGame.getPlayer(follower).getTotalPoints();  
			sendMessage("#RAWPOINTS#" + scoreOne + "#" + scoreTwo + "#", clients[leader].clientOutput);
			sendMessage("#RAWPOINTS#" + scoreTwo + "#" + scoreOne + "#", clients[follower].clientOutput);
			sendMessage("#GAMEPOINTS#" + gameOne + "#" + gameTwo + "#", clients[leader].clientOutput);
			sendMessage("#GAMEPOINTS#" + gameTwo + "#" + gameOne + "#", clients[follower].clientOutput);
			sendMessage("#TOTALPOINTS#" + totalOne + "#" + totalTwo + "#", clients[leader].clientOutput);
			sendMessage("#TOTALPOINTS#" + totalTwo + "#" + totalOne + "#", clients[follower].clientOutput);
			sendMessage("#PAINT#", clients[leader].clientOutput);
			sendMessage("#PAINT#", clients[follower].clientOutput);
			sendMessage("#SLEEP#", clients[leader].clientOutput);
			sendMessage("#SLEEP#", clients[follower].clientOutput);  
			if ((totalTwo == totalOne) || ((totalTwo < POINTS_TO_WIN) && (totalOne < POINTS_TO_WIN)))
			{
				belotGame.selectDealer();
				belotGame.dealFiveCards();			
				int dealer = belotGame.getDealerNumber();
				showCards(leader, 5);
				showCards(follower, 5);				
				sendMessage("#STARTBIDDING#", clients[otherPlayer(dealer)].clientOutput);
				sendMessage("#PAINT#", clients[otherPlayer(dealer)].clientOutput);
			}
		}
		else
		{		
			sendMessage("#RAWPOINTS#" + scoreOne + "#" + scoreTwo + "#", clients[leader].clientOutput);
			sendMessage("#RAWPOINTS#" + scoreTwo + "#" + scoreOne + "#", clients[follower].clientOutput);
			sendMessage("#PLAYCARD#", clients[whoseTurn].clientOutput);
			sendMessage("#PAINT#", clients[leader].clientOutput);
			sendMessage("#PAINT#", clients[follower].clientOutput);
		}
	}  
	public void quit (int client)
	{
		sendMessage("#QUIT#", clients[otherPlayer(client)].clientOutput);
	}  
	public void again ()
	{
		numberAgains++;  
		if (numberAgains == 2)
		{
			numberAgains = 0;
			startGame();
			sendMessage("#RAWPOINTS#0#0#", clients[PLAYER_1].clientOutput);
			sendMessage("#RAWPOINTS#0#0#", clients[PLAYER_2].clientOutput);
			sendMessage("#GAMEPOINTS#0#0#", clients[PLAYER_1].clientOutput);
			sendMessage("#GAMEPOINTS#0#0#", clients[PLAYER_2].clientOutput);
			sendMessage("#TOTALPOINTS#0#0#", clients[PLAYER_1].clientOutput);
			sendMessage("#TOTALPOINTS#0#0#", clients[PLAYER_2].clientOutput);
			showCards(PLAYER_1, 5);
			showCards(PLAYER_2, 5);				
			int dealer = belotGame.getDealerNumber();				
			sendMessage("#STARTBIDDING#", clients[otherPlayer(dealer)].clientOutput);
			sendMessage("#PAINT#", clients[PLAYER_1].clientOutput);
			sendMessage("#PAINT#", clients[PLAYER_2].clientOutput);
		}
	}  
	private int otherPlayer (int player)
	{
		return 1 - player;
	}  
	private Game belotGame;
	private ClientHandler clients[];
	private int trickLeader;  
	private int cardLed;
	private int numberAgains;  
}  
class ClientHandler extends Thread
{
	ClientHandler (Socket client, int number, ServerThread server)
	{	
		parent = server;
		clientNumber = number;  
		try
		{
			clientInput = new DataInputStream 
					(new BufferedInputStream ( client.getInputStream()));
			clientOutput = new DataOutputStream 
					(new BufferedOutputStream ( client.getOutputStream()));
		}
		catch (Exception e)
		{
			System.out.println("ClientHandler constructor error");
			System.exit(1);
		}
	}  
	public void run ()
	{
		String message;
		String command = "";
                String whichSuit = "";
		int cardOne = 0;
		int cardTwo = 0;  
		parent.sendMessage("#YOURNUMBER#" + clientNumber + "#", clientOutput);
		parent.showCards(clientNumber, 5);
		parent.sendMessage("#STARTBIDDING#", clientOutput);  
		while (!command.equals("QUIT"))
		{
			try
			{
				message = clientInput.readUTF();
				System.out.println(message);
				command = determineCommand ( message);
				message = shortenCommand(message, command);  
				if (command.equals("AGAIN"))
				{
					parent.again();
				}
				else if (command.equals("BID1"))
				{
					whichSuit = determineCommand(message);
					parent.makeBid(clientNumber, whichSuit, true);
				}
				else if (command.equals("BID2"))
				{
					whichSuit = determineCommand(message);
					parent.makeBid(clientNumber, whichSuit, false);
				}
				else if (command.equals("CARD1"))
				{
					cardOne = Integer.parseInt(determineCommand(message));
					parent.makePlay(clientNumber, cardOne);
				}
				else if (command.equals("CARD2"))
				{
					cardTwo = Integer.parseInt(determineCommand(message));
					parent.finishPlay(cardTwo, clientNumber);
				}
				else if (command.equals("MESSAGE"))
				{
					message = determineCommand(message);
					parent.transmit(clientNumber, message);
				}
				else if (command.equals("PASSOUT"))
				{
					parent.passOut();
				}
				else if (command.equals("QUIT"))
				{
					parent.quit(clientNumber);
				}
			}
			catch (Exception e) 
			{
				System.out.println("Exception in ClientHandler run");
				System.exit(1);
			}
		}
	}  
	private String determineCommand (String message)
	{
		int secondHash = message.indexOf("#", 1);  
		return message.substring(1, secondHash);
	}  
	private String shortenCommand (String message, String argument)
	{
		return message.substring(1 + argument.length());
	}
  
	private DataInputStream clientInput;
	protected DataOutputStream clientOutput;  
	private int clientNumber;
	private ServerThread parent;
}