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