import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.HashMap; public class GameServer { static HashMap moves; static HashMap plays; static HashMap scores; static HashMap transmits; static HashMap addresses; static HashMap ports; static DatagramSocket serverSocket; public static void main(String[] args) throws IOException { String l = "~"; serverSocket = new DatagramSocket(9876); moves = new HashMap(); plays = new HashMap(); scores = new HashMap(); transmits = new HashMap(); addresses = new HashMap(); ports = new HashMap(); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); String sentence = new String(receivePacket.getData()); sentence = sentence.trim(); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String[] tokens = sentence.split("~"); String status = tokens[0]; String player = tokens[1]; String opponent = tokens[2]; String move = tokens[3].toLowerCase(); int moveNum = Integer.parseInt(tokens[4]); if(!plays.containsKey(player)) { plays.put(player, new Integer(0)); scores.put(player, new Integer(0)); } if(plays.get(player).intValue() != moveNum ) //move not entered yet { addresses.put(player, IPAddress); ports.put(player, new Integer(port)); moves.put(player, move); plays.put(player, new Integer(moveNum)); transmits.put(player, moveNum); } //both players have moved but results have not been transmitted if(plays.get(player).equals(plays.get(opponent)) && transmits.get(player).equals(new Integer(moveNum))) { int winner = getWinner(moves.get(player).charAt(0), (char)moves.get(opponent).charAt(0)); String winningPlayer = "Tie"; if(winner == 1) { winningPlayer = player; int oldScore = scores.get(player); scores.put(player, new Integer(oldScore + 1)); } else if(winner == 2) { winningPlayer = opponent; int oldScore = scores.get(opponent); scores.put(opponent, new Integer(oldScore + 1)); } //transmit to String playerMove = moves.get(player); String opponentMove = moves.get(opponent); status = "moved"; if(scores.get(player).intValue() == 3 || scores.get(opponent).intValue() == 3) status = "gameover"; String xferPlayer = status +l+ player + l + playerMove + l + opponent + l + opponentMove + l + winningPlayer; String xferOpponent = status +l+ opponent + l + opponentMove + l + player + l + playerMove + l + winningPlayer; transmit(xferPlayer, player); transmit(xferOpponent, opponent); } if(scores.containsKey(opponent)&&(scores.get(player).intValue() == 3 || scores.get(opponent).intValue() == 3)) { System.out.println("Game over"); String winner; if(scores.get(player).intValue() ==3 ) winner = player; else winner = opponent; String xferPlayer = "gameover~" + player +l+ "x" +l+ opponent +l+ "x" +l+ winner; String xferOpponent = "gameover~" + opponent +l+ "x" +l+ player +l+ "x" +l+ winner; transmit(xferPlayer, player); transmit(xferOpponent, opponent); moves.remove(player); moves.remove(opponent); plays.remove(player); plays.remove(opponent); scores.remove(player); scores.remove(opponent); transmits.remove(player); transmits.remove(opponent); } } } public static void transmit(String sendMe, String toWho) throws java.io.IOException { byte[] sendData = sendMe.getBytes(); InetAddress IPAddress = addresses.get(toWho); int port = ports.get(toWho); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); System.out.println("Transmitted: " + new String(sendData)); } private static int getWinner(char move1, char move2) { int player1 = 1; int player2 = 2; int tie = 0; switch (move1) { case 'r': if (move2 == 'r') { return tie; } if (move2 == 'p') { return player2; } if (move2 == 's') { return player1; } if (move2 == 'l') { return player1; } if (move2 == 'k') { return player2; } break; case 'p': if (move2 == 'r') { return player1; } if (move2 == 'p') { return tie; } if (move2 == 's') { return player2; } if (move2 == 'l') { return player2; } if (move2 == 'k') { return player1; } break; case 's': if (move2 == 'r') { return player2; } if (move2 == 'p') { return player1; } if (move2 == 's') { return tie; } if (move2 == 'l') { return player1; } if (move2 == 'k') { return player2; } break; case 'l': if (move2 == 'r') { return player2; } if (move2 == 'p') { return player1; } if (move2 == 's') { return player2; } if (move2 == 'l') { return tie; } if (move2 == 'k') { return player1; } break; case 'k': if (move2 == 'r') { return player1; } if (move2 == 'p') { return player2; } if (move2 == 's') { return player1; } if (move2 == 'l') { return player2; } if (move2 == 'k') { return tie; } break; } System.exit(-1);//should not get this far return -1; } }