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