想學習TCP/UDP網路通訊,用連網五子棋來練練手吧。
未添加人機對戰演算法,估計麻煩但不難。
今中午和同事對站,一平一敗(主要為了看結局處理~哈哈~)
玩了幾把,不少需要改進的地方,暫時不改了,為了學習麼
主要兩點:
1 Socket串連 參考這一篇
2 五子棋的相關邏輯 (見樓下代碼)
相關代碼CSDN下載
五子棋邏輯代碼(UI代碼就不貼了):
package FiveChessRefactoring;</p><p>/**<br /> * Author:lazybone<br /> * Email:lgtwboy@sina.com<br /> * 2009-08<br /> */<br />import java.awt.*;<br />import java.awt.event.*;</p><p>@SuppressWarnings("serial")<br />class FiveChessCanvas_s extends Canvas implements MouseListener {</p><p>static int blackOrWhite = 1;// 1為黑子(server),2為白子(client),<br />static final int chessManSize = 10;// 棋子大小<br />static final int chessSize = 10, gridSize = 20;// 格數,每個像素數<br />ChatServer chatServer;// 主程控制代碼<br />int[][] chess = new int[chessSize][chessSize];// 棋盤數組<br />int chessCount = 0;// 已下棋子<br />Graphics g;// 映像<br />int isWin = 0;// 棋局狀態,判斷輸贏,1為黑子贏(server),2為白子贏(client),<br />int pos_x = -1, pos_y = -1;// 當前點擊位置</p><p>public FiveChessCanvas_s(ChatServer chatServer) {<br />addMouseListener(this);<br />this.chatServer = chatServer;<br />init();<br />}</p><p>// 判斷輸贏,1為黑子贏(自己),2為白子贏(對方),<br />int checkIsWin(int x, int y) {<br />int count = 1;<br />int tmp = chess[x][y];<br />if (x < 0 || x > chessSize || y < 0 || y > chessSize)<br />return 0;<br />// 左邊<br />if (x - 4 > 0) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x - i][y] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 上邊<br />if (y - 4 > 0) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x][y - i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 右邊<br />if (x + 4 < chessSize) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x + i][y] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 下邊<br />if (y + 4 < chessSize) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x][y + i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 左上<br />if (x - 4 > 0 && y - 4 > 0) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x - i][y - i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 右上<br />if (x + 4 < chessSize && y - 4 > 0) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x + i][y - i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 右下<br />if (x + 4 < chessSize && y + 4 < chessSize) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x + i][y + i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />// 左下<br />if (x - 4 > 0 && y + 4 < chessSize) {<br />count = 1;<br />for (int i = 1; i <= 4; i++) {<br />if (chess[x - i][y + i] == tmp)<br />count++;<br />if (count == 5)<br />return tmp;<br />}<br />}<br />return 0;<br />}</p><p>// 對方落棋子,<br />public void drawAChessman(int x, int y) {<br />if (chess[x][y] == 0) {<br />chess[x][y] = (blackOrWhite == 1 ? 2 : 1);<br />repaint();<br />whoIsWin();<br />}<br />}</p><p>// 畫棋盤<br />void drawChess(Graphics g) {<br />int tmp = chessManSize / 2;<br />for (int i = 0; i < chessSize; i++) {<br />for (int j = 0; j < chessSize; j++) {<br />g.drawLine(tmp + i, tmp + j * gridSize, tmp + (chessSize - 1)<br />* gridSize, tmp + j * gridSize);<br />g.drawLine(tmp + i * gridSize, tmp + j, tmp + i * gridSize, tmp<br />+ (chessSize - 1) * gridSize);<br />}<br />}</p><p>}</p><p>// 根據棋盤數組畫棋子<br />void drawChessMan(Graphics g) {<br />for (int i = 0; i < chessSize; i++) {<br />for (int j = 0; j < chessSize; j++) {<br />if (chess[i][j] != 0) {<br />g.setColor((chess[i][j] == 1) ? Color.black : Color.blue);<br />g.fillArc(i * gridSize, j * gridSize, chessManSize,<br />chessManSize, 0, 360);<br />}<br />}<br />}<br />}</p><p>// 初始化<br />public void init() {<br />pos_x = -1;<br />pos_y = -1;// 當前點擊位置<br />isWin = 0;// 棋局狀態<br />chessCount = 0;// 已下棋子<br />for (int i = 0; i < chessSize; i++) {// 棋盤數組初始化<br />for (int j = 0; j < chessSize; j++) {<br />chess[i][j] = 0;<br />}<br />}<br />repaint();<br />}</p><p>public void mouseClicked(MouseEvent e) {<br />}</p><p>public void mouseEntered(MouseEvent e) {<br />}</p><p>public void mouseExited(MouseEvent e) {<br />}</p><p>void dropAChessMan(int x, int y) {</p><p>}</p><p>// 得到落子的位置,並將數組置為blackOrWhite<br />public void mousePressed(MouseEvent e) {<br />if (isWin != 0 || !chatServer.canMove) {<br />return;<br />}<br />int tmp = chessManSize / 2 - gridSize / 2;// 棋盤調整<br />pos_x = (e.getX() - tmp) / gridSize;<br />pos_y = (e.getY() - tmp) / gridSize;<br />// 判斷位置是否在0-chessSize內<br />if (pos_x < 0 || pos_x > chessSize || pos_y < 0 || pos_y > chessSize)<br />return;<br />if (chess[pos_x][pos_y] == 0) {// 未落子<br />chess[pos_x][pos_y] = blackOrWhite;// 落子<br />chessCount++;// 棋子計數+1<br />whoIsWin();// 是否贏了<br />chatServer.sendChessMessage(pos_x, pos_y);<br />}<br />repaint();<br />}</p><p>public void mouseReleased(MouseEvent e) {<br />}</p><p>public void paint(Graphics g) {<br />this.g = g;<br />g.setColor(Color.black);<br />drawChess(g);// 畫棋盤<br />drawChessMan(g);// 根據棋盤數組畫棋子<br />showState();<br />if (isWin == 1) {<br />System.out.println(isWin + "is win.");<br />}<br />if (chessCount == 100) {<br />System.out.println("Nobody win.");<br />}<br />}</p><p>public void showState() {<br />if (!chatServer.isConnected) {<br />chatServer.fiveChess_s.state.setText("等待別人加入...");<br />} else if (isWin != 0) {<br />String s = ((isWin == 1) ? "你贏了" : "你個笨蛋~輸了~");<br />chatServer.fiveChess_s.state.setText(s);<br />} else {<br />if (chessSize * chessSize == chessCount) {<br />chatServer.fiveChess_s.state.setText("白下了半天~沒輸沒贏~");<br />return;<br />}<br />String s1, s2;<br />if (blackOrWhite == 1) {<br />s1 = "你是黑子";<br />} else {<br />s1 = "你是藍子";<br />}<br />if (chatServer.canMove) {<br />s2 = "該你下了";<br />} else {<br />s2 = "等待對方落子...";<br />}<br />chatServer.fiveChess_s.state.setText(s1 + " " + s2);<br />}<br />}</p><p>void whoIsWin() {<br />for (int i = 0; i < chessSize; i++) {<br />for (int j = 0; j < chessSize; j++) {<br />if (isWin == 0 && chess[i][j] != 0) {// 未出勝負,繼續判斷<br />isWin = checkIsWin(i, j);<br />}<br />}<br />}<br />if (isWin != 0 || chessCount == chessSize * chessSize) {<br />chatServer.canMove = false;<br />}<br />}<br />}<br />