package com.interview.flag.g; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; /** * Created_By: stefanie * Date: 15-1-3 * Time: 下午11:01 */ public class G19_InternetGomokuGame { class Move{ int x; int y; int playerID; } class Board{ int rows; int cols; int[][] board; int successCount; public boolean update(Move move){ board[move.x][move.y] = move.playerID; return isSuccess(move.x, move.y, move.playerID); } private boolean isSuccess(int x, int y, int flag){ return continuousRows(x, y, flag) || continuousCols(x, y, flag) || continuousDiagonally(x, y, flag); } private boolean continuousRows(int x, int y, int flag){ int count = 1; for(int i = x + 1; i < rows && board[i][y] == flag; i++) count++; for(int i = x - 1; i >= 0 && board[i][y] == flag; i--) count++; return count >= successCount; } private boolean continuousCols(int x, int y, int flag){ int count = 1; for(int j = y + 1; j < cols && board[x][j] == flag; j++) count++; for(int j = y - 1; j >= 0 && board[x][j] == flag; j--) count++; return count >= successCount; } private boolean continuousDiagonally(int x, int y, int flag){ int count = 1; for(int i = 1; x+i < rows && y+i < cols && board[x+i][y+i] == flag; i++) count++; for(int i = 1; x-i >= 0 && y-i >= 0 && board[x-i][y-i] == flag; i++) count++; if(count >= successCount) return true; count = 1; for(int i = 1; x+i < rows && y-i >= 0 && board[x+i][y-i] == flag; i++) count++; for(int i = 1; x-i >= 0 && y+i < cols && board[x-i][y+i] == flag; i++) count++; if(count >= successCount) return true; return false; } } class Message{ boolean start; int sender; boolean isFinished; int winner; Move lastMove; public Message(){ } public Message(String input){ //de-serialize from input } public String toString(){ //serialize to output return ""; } } class Display{ public void showFailMessage(){ } public void showSuccessMessage(){ } public void paint(Board board){ } } class ClientConnection{ String serverIP; int serverPort; Player player; Socket socket; PrintWriter out; BufferedReader in; public ClientConnection(String serverIP, int serverPort, Player player){ this.serverIP = serverIP; this.serverPort = serverPort; this.player = player; } public void connect(){ try { this.socket = new Socket(serverIP, serverPort); this.out = new PrintWriter(socket.getOutputStream(), true); this.in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String input; while ((input = in.readLine()) != null) { Message message = new Message(input); player.receiveMessage(message); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void sendMessage(Message message){ out.println(message.toString()); } } class Player{ ClientConnection conn; int playerID; Board board; Display display; public void joinGame(String serverIP, int serverPort){ conn = new ClientConnection(serverIP, serverPort, this); Message message = new Message(); message.sender = playerID; conn.sendMessage(message); } public void receiveMessage(Message message){ if(message.isFinished){ if(message.winner == playerID) display.showSuccessMessage(); else display.showFailMessage(); } else { if(!message.start){ board.update(message.lastMove); } display.paint(board); Move move = getUserMove(); message.lastMove = move; sendMessage(message); } } private Move getUserMove() { //blocking wait for user's input return null; } public void sendMessage(Message message){ message.sender = playerID; conn.sendMessage(message); } } class ServerConnection{ private int portNumber; private Server server; private ServerSocket serverSocket; private Socket clientSocket; private PrintWriter out; private BufferedReader in; public ServerConnection(int portNumber, Server server){ this.portNumber = portNumber; this.server = server; start(); } public void start(){ try{ serverSocket = new ServerSocket(portNumber); clientSocket = serverSocket.accept(); out = new PrintWriter(clientSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String input; while ((input = in.readLine()) != null) { Message message = new Message(input); server.receiveMessage(message); } } catch (IOException e) { e.printStackTrace(); } } public void sendMessage(Message message){ out.println(message.toString()); } } class Server{ int serverIdentify; int currentPlayer; Board board; int[] players; ServerConnection[] conns; public Server(){ conns = initConnections(); } private ServerConnection[] initConnections() { ServerConnection[] conns = new ServerConnection[2]; //init conns based on config files return conns; } private void joinGame(String playerID){ //add playerID in players; if(players[0] != 0 || players[1] != 0) startPlay(); } public void startPlay(){ this.currentPlayer = 0; Message message = new Message(); message.start = true; sendMessage(message, currentPlayer); } public void receiveMessage(Message message){ if(message.sender != players[currentPlayer]) return; boolean isSuccess = board.update(message.lastMove); if(isSuccess){ message.isFinished = true; message.winner = players[currentPlayer]; for(int i = 0; i < players.length; i++){ sendMessage(message, players[i]); } } else { currentPlayer = players[(currentPlayer + 1)% players.length]; sendMessage(message, currentPlayer); } } public void sendMessage(Message message, int player){ message.sender = serverIdentify; //send message to player conns[player].sendMessage(message); } } }