想学习TCP/UDP网络通信,用联网五子棋来练练手吧。 未添加人机对战算法,估计麻烦但不难。 今中午和同事对站,一平一败(主要为了看结局处理~哈哈~) 玩了几把,不少需要改进的地方,暂时不改了,为了学习么 主要两点: 1 Socket连接 参考这一篇 2 五子棋的相关逻辑 (见楼下代码) 相关代码优快云下载 五子棋逻辑代码(UI代码就不贴了): package FiveChessRefactoring; /** * Author:lazybone * Email:lgtwboy@sina.com * 2009-08 */ import java.awt.*; import java.awt.event.*; @SuppressWarnings("serial") class FiveChessCanvas_s extends Canvas implements MouseListener { static int blackOrWhite = 1;// 1为黑子(server),2为白子(client), static final int chessManSize = 10;// 棋子大小 static final int chessSize = 10, gridSize = 20;// 格数,每个像素数 ChatServer chatServer;// 主程句柄 int[][] chess = new int[chessSize][chessSize];// 棋盘数组 int chessCount = 0;// 已下棋子 Graphics g;// 图像 int isWin = 0;// 棋局状态,判断输赢,1为黑子赢(server),2为白子赢(client), int pos_x = -1, pos_y = -1;// 当前点击位置 public FiveChessCanvas_s(ChatServer chatServer) { addMouseListener(this); this.chatServer = chatServer; init(); } // 判断输赢,1为黑子赢(自己),2为白子赢(对方), int checkIsWin(int x, int y) { int count = 1; int tmp = chess[x][y]; if (x < 0 || x > chessSize || y < 0 || y > chessSize) return 0; // 左边 if (x - 4 > 0) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x - i][y] == tmp) count++; if (count == 5) return tmp; } } // 上边 if (y - 4 > 0) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x][y - i] == tmp) count++; if (count == 5) return tmp; } } // 右边 if (x + 4 < chessSize) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x + i][y] == tmp) count++; if (count == 5) return tmp; } } // 下边 if (y + 4 < chessSize) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x][y + i] == tmp) count++; if (count == 5) return tmp; } } // 左上 if (x - 4 > 0 && y - 4 > 0) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x - i][y - i] == tmp) count++; if (count == 5) return tmp; } } // 右上 if (x + 4 < chessSize && y - 4 > 0) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x + i][y - i] == tmp) count++; if (count == 5) return tmp; } } // 右下 if (x + 4 < chessSize && y + 4 < chessSize) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x + i][y + i] == tmp) count++; if (count == 5) return tmp; } } // 左下 if (x - 4 > 0 && y + 4 < chessSize) { count = 1; for (int i = 1; i <= 4; i++) { if (chess[x - i][y + i] == tmp) count++; if (count == 5) return tmp; } } return 0; } // 对方落棋子, public void drawAChessman(int x, int y) { if (chess[x][y] == 0) { chess[x][y] = (blackOrWhite == 1 ? 2 : 1); repaint(); whoIsWin(); } } // 画棋盘 void drawChess(Graphics g) { int tmp = chessManSize / 2; for (int i = 0; i < chessSize; i++) { for (int j = 0; j < chessSize; j++) { g.drawLine(tmp + i, tmp + j * gridSize, tmp + (chessSize - 1) * gridSize, tmp + j * gridSize); g.drawLine(tmp + i * gridSize, tmp + j, tmp + i * gridSize, tmp + (chessSize - 1) * gridSize); } } } // 根据棋盘数组画棋子 void drawChessMan(Graphics g) { for (int i = 0; i < chessSize; i++) { for (int j = 0; j < chessSize; j++) { if (chess[i][j] != 0) { g.setColor((chess[i][j] == 1) ? Color.black : Color.blue); g.fillArc(i * gridSize, j * gridSize, chessManSize, chessManSize, 0, 360); } } } } // 初始化 public void init() { pos_x = -1; pos_y = -1;// 当前点击位置 isWin = 0;// 棋局状态 chessCount = 0;// 已下棋子 for (int i = 0; i < chessSize; i++) {// 棋盘数组初始化 for (int j = 0; j < chessSize; j++) { chess[i][j] = 0; } } repaint(); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } void dropAChessMan(int x, int y) { } // 得到落子的位置,并将数组置为blackOrWhite public void mousePressed(MouseEvent e) { if (isWin != 0 || !chatServer.canMove) { return; } int tmp = chessManSize / 2 - gridSize / 2;// 棋盘调整 pos_x = (e.getX() - tmp) / gridSize; pos_y = (e.getY() - tmp) / gridSize; // 判断位置是否在0-chessSize内 if (pos_x < 0 || pos_x > chessSize || pos_y < 0 || pos_y > chessSize) return; if (chess[pos_x][pos_y] == 0) {// 未落子 chess[pos_x][pos_y] = blackOrWhite;// 落子 chessCount++;// 棋子计数+1 whoIsWin();// 是否赢了 chatServer.sendChessMessage(pos_x, pos_y); } repaint(); } public void mouseReleased(MouseEvent e) { } public void paint(Graphics g) { this.g = g; g.setColor(Color.black); drawChess(g);// 画棋盘 drawChessMan(g);// 根据棋盘数组画棋子 showState(); if (isWin == 1) { System.out.println(isWin + "is win."); } if (chessCount == 100) { System.out.println("Nobody win."); } } public void showState() { if (!chatServer.isConnected) { chatServer.fiveChess_s.state.setText("等待别人加入..."); } else if (isWin != 0) { String s = ((isWin == 1) ? "你赢了" : "你个笨蛋~输了~"); chatServer.fiveChess_s.state.setText(s); } else { if (chessSize * chessSize == chessCount) { chatServer.fiveChess_s.state.setText("白下了半天~没输没赢~"); return; } String s1, s2; if (blackOrWhite == 1) { s1 = "你是黑子"; } else { s1 = "你是蓝子"; } if (chatServer.canMove) { s2 = "该你下了"; } else { s2 = "等待对方落子..."; } chatServer.fiveChess_s.state.setText(s1 + " " + s2); } } void whoIsWin() { for (int i = 0; i < chessSize; i++) { for (int j = 0; j < chessSize; j++) { if (isWin == 0 && chess[i][j] != 0) {// 未出胜负,继续判断 isWin = checkIsWin(i, j); } } } if (isWin != 0 || chessCount == chessSize * chessSize) { chatServer.canMove = false; } } }