代码的结构挺好,mvc模式的,给大家分享出来
原创不易,转载请注明出处:分享网上找到的一个中国象棋源码
部分代码
Controller.java
package com.zuidaima.chess.controller; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import com.yaoyun.chess.entity.ChessBoard; import com.yaoyun.chess.entity.ChessMan; import com.yaoyun.chess.panel.GamePanel; import com.yaoyun.chess.util.MusicUtil; public class Controller extends MouseAdapter { private static ChessBoard chessBoard; private static ChessMan chessMan; private static GamePanel gamePanel; private static boolean gameover = false; /* * 重新显示游戏界面 */ public Controller(GamePanel gamePanel, ChessBoard chess, ChessMan chessMan) { Controller.chessBoard = chess; Controller.chessMan = chessMan; Controller.gamePanel = gamePanel; } /* * 功能:响应鼠标点击事件 */ public void mouseClicked(MouseEvent e) { // 获取鼠标的位置,20代表的是菜单栏的高度 int x = e.getX(); int y = e.getY()-20; // 如果鼠标点击的坐标有效 if ((x >= 40 && x <= 570) && (y >= 40 && y <= 630) && !gameover) { // 把鼠标的坐标转换成棋子数组的下标,25代表棋子的半径 int newi = (y + 25) / 60 - 1; int newj = (x + 25) / 60 - 1; // 获取鼠标上一步点击位置数组的下标 int oldi = chessMan.getOldX(); int oldj = chessMan.getOldY(); // 获取保存棋子位置的数组 int[][] chessFlag = chessMan.getChessFlag(); // 判断选中的地方是否有棋子 if (chessFlag[newi][newj] == 0) { // 判断上一步是否有选中棋子 if (oldi != -1 && oldj != -1) { // 判断棋子是否能移动 if (isChessManMove(chessFlag, newi, newj)) { //播放下棋声音 if(MusicUtil.isGameMusic()){ MusicUtil.playMusic("go"); } // 移动棋子 chessMan.setChessFlag(newi, newj, chessFlag[oldi][oldj]); chessMan.setChessFlag(oldi, oldj, 0); // 移动成功后,清除上一步选中的棋子 chessMan.setOldX(-1); chessMan.setOldY(-1); gamePanel.dispaly(chessBoard, chessMan); // 轮到对方下棋 chessMan.setRedMove(!chessMan.isRedMove()); } } } else { // 判断上一步是否有棋子 if (oldi == -1 && oldj == -1) { // 上一步没有棋子 // 如果有棋子,并且是自己 if ((oldi == newi && oldj == newj)) { } else { // 把选中的棋子设为选中状态 chessMan.setSelect(newi, newj); // 并把其保存为上一颗棋子 chessMan.setOldX(newi); chessMan.setOldY(newj); showGame(); } } else { // 如果上一步有棋子 // 判断是否吃的到下一步的棋子 if (isChessManMove(chessFlag, newi, newj)) { // 判断是否是自己一方的棋子 if ((chessFlag[oldi][oldj] >= 8 && chessFlag[newi][newj] < 8) || (chessFlag[oldi][oldj] < 8 && chessFlag[newi][newj] >= 8)) { if (chessFlag[newi][newj] == 5) { gamePanel.setMessage(1); gameover = true; } else if (chessFlag[newi][newj] == 14) { gamePanel.setMessage(2); gameover = true; } //播放吃棋子的声音 if(MusicUtil.isGameMusic()){ MusicUtil.playMusic("eat"); } // 吃棋子 chessMan.setChessFlag(newi, newj,chessFlag[oldi][oldj]); chessMan.setChessFlag(oldi, oldj, 0); // 轮到对方下棋 chessMan.setRedMove(!chessMan.isRedMove()); } } // 并清除上一步棋子 chessMan.setOldX(-1); chessMan.setOldY(-1); // 重新显示界面 showGame(); } } } } /* * 功能:重新显示界面 */ public static void showGame(){ gamePanel.dispaly(chessBoard, chessMan); } /* * 判断棋子是否能移动 * chessFlag:棋盘棋子坐标 * newi、newj:棋子下一步的坐标 */ public boolean isChessManMove(int[][] chessFlag, int newi, int newj) { // 默认棋子不能移动 boolean b = false; // 获取上一步选中的棋子坐标 int oldi = chessMan.getOldX(); int oldj = chessMan.getOldY(); // 默认该棋子是红方的 boolean redFlag = true; // 棋子不是为红方的 if (chessFlag[oldi][oldj] >= 8) { redFlag = false; } // 如果棋子是红方且不是红方下棋,则返回 if(redFlag != chessMan.isRedMove()){ System.out.println("还没轮到你下呢!"); return false; } // 获取棋盘中所有的棋子 String[] chessStr = chessMan.getChessStr(); // 获取上一步选中的是什么棋子 String name = chessStr[chessFlag[oldi][oldj] - 1]; // 根据棋子名称选择棋子的走法 if(name.equals("兵")) { if (oldi >= 5) { // 没有过河 if ((oldi - newi == 1) && (newj == oldj)) { b = true; } } else { // 已过河 if ((oldi - newi == 1) && (newj == oldj)) { b = true; } else if ((Math.abs(newj - oldj) == 1) && (newi == oldi)) { b = true; } else { return false; } } } else if(name.equals("卒")) { if (oldi < 5) { // 没有过河 if ((newi - oldi == 1) && (newj == oldj)) { b = true; } } else { // 已过河 if ((newi - oldi == 1) && (newj == oldj)) { b = true; } else if ((Math.abs(newj - oldj) == 1) && (newi == oldi)) { b = true; } else { return false; } } } else if(name.equals("车")) { if (newi == oldi) { int k = 0; if (newj > oldj) { // 红车水平向右方向移动 for (int i = oldj; i <= newj; i++) { if (chessFlag[oldi][i] > 0) { k++; } } } else { for (int i = oldj; i >= newj; i--) { // 红车水平向左方向移动 if (chessFlag[oldi][i] > 0) { k++; } } } if (k <= 2) { b = true; } } else if (newj == oldj) { // 红车垂直下方向移动 int k = 0; if (newi > oldi) { for (int i = oldi; i <= newi; i++) { if (chessFlag[i][oldj] > 0) { k++; } } } else { for (int i = oldi; i >= newi; i--) { // 红车垂直上方向移动 if (chessFlag[i][oldj] > 0) { k++; } } } if (k <= 2) { b = true; } } } else if(name.equals("炮")) { int s = 0; if (newi == oldi) { if (newj > oldj) { for (int i = oldj; i <= newj; i++) { if (chessFlag[oldi][i] > 0) { s++; } } } else { for (int i = oldj; i >= newj; i--) { if (chessFlag[oldi][i] > 0) { s++; } } } } else if (newj == oldj) { if (newi > oldi) { for (int i = oldi; i <= newi; i++) { if (chessFlag[i][oldj] > 0) { s++; } } } else { for (int i = oldi; i >= newi; i--) { if (chessFlag[i][oldj] > 0) { s++; } } } } if (s == 1 || (s == 3 && chessFlag[newi][newj] > 0)) { b = true; } } else if(name.equals("帅")||name.equals("将")) { if (newj == oldj && (Math.abs(newi - oldi) >= 5)) { int flag = 0; if (newi > oldi) { // 将吃帅 for (int i = oldi; i <= newi; i++) { if ((chessFlag[oldi][oldj] == 5) && (chessFlag[newi][newj] == 14)) { if (chessFlag[i][oldj] > 0) { flag++; } } } } else { // 帅吃将 for (int i = newi; i <= oldi; i++) { if ((chessFlag[oldi][oldj] == 14) && (chessFlag[newi][newj] == 5)) { if (chessFlag[i][oldj] > 0) { flag++; } } } } if (flag == 2) { b = true; } } else if (((newi <= 2 && redFlag == true) || (newi >= 7 && redFlag == false)) && (newj <= 5 && newj >= 3)) { if (Math.abs(newi - oldi) == 1 && newj == oldj) { b = true; } else if (Math.abs(newj - oldj) == 1 && newi == oldi) { b = true; } } } else if(name.equals("士")) { if (redFlag) { // 红方棋子 if (newi <= 2 && newj <= 5 && newj >= 3) { if (Math.abs(newi - oldi) == 1 && Math.abs(newj - oldj) == 1) { b = true; } } } else { // 黑方棋子 if (newi >= 7 && newj <= 5 && newj >= 3) { if (Math.abs(newi - oldi) == 1 && Math.abs(newj - oldj) == 1) { b = true; } } } } else if(name.equals("象")||name.equals("相")) { if ((newi >= 5 && redFlag == false) || (newi < 5 && redFlag == true)) { if ((newi - oldi) == 2 && (newj - oldj) == 2) { // 移到右下方 if (chessFlag[oldi + 1][oldj + 1] == 0) { b = true; } } else if ((newi - oldi) == -2 && (newj - oldj) == 2) { // 移到右上方 if (chessFlag[oldi - 1][oldj + 1] == 0) { b = true; } } else if ((newi - oldi) == 2 && (newj - oldj) == -2) { // 移到左下方 if (chessFlag[oldi + 1][oldj - 1] == 0) { b = true; } } else if ((newi - oldi) == -2 && (newj - oldj) == -2) { // 移到左上方 if (chessFlag[oldi - 1][oldj - 1] == 0) { b = true; } } } } else if(name.equals("马")) { if ((newi - oldi) == -2 && (newj - oldj) == 1) { // 移到NE方 if (chessFlag[oldi - 1][oldj] == 0) { b = true; } } else if ((newi - oldi) == -2 && (newj - oldj) == -1) { // 移到NW方 if (chessFlag[oldi - 1][oldj] == 0) { b = true; } } else if ((newi - oldi) == 2 && (newj - oldj) == 1) { // 移到SE方 if (chessFlag[oldi + 1][oldj] == 0) { b = true; } } else if ((newi - oldi) == 2 && (newj - oldj) == -1) { // 移到SW方 if (chessFlag[oldi + 1][oldj] == 0) { b = true; } } else if ((newi - oldi) == -1 && (newj - oldj) == 2) { // 移到EN方 if (chessFlag[oldi][oldj + 1] == 0) { b = true; } } else if ((newi - oldi) == 1 && (newj - oldj) == 2) { // 移到ES方 if (chessFlag[oldi][oldj + 1] == 0) { b = true; } } else if ((newi - oldi) == -1 && (newj - oldj) == -2) { // 移到WN方 if (chessFlag[oldi][oldj - 1] == 0) { b = true; } } else if ((newi - oldi) == 1 && (newj - oldj) == -2) { // 移到WS方 if (chessFlag[oldi][oldj - 1] == 0) { b = true; } } } return b; } /* * 功能:设置游戏状态 */ public static void setGameover(boolean gameover) { Controller.gameover = gameover; } }
package com.zuidaima.chess.entity; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Stroke; import java.io.Serializable; import com.yaoyun.chess.util.FontUtil; @SuppressWarnings("serial") public class ChessMan implements Serializable { private int oldX = -1; // 棋子上一步所在位置的x坐标 private int oldY = -1; // 棋子上一步所在位置的y坐标 private int newX = -1; // 棋子现在所在位置的x坐标 private int newY = -1; // 棋子现在所在位置的y坐标 private boolean redMove = true; // 红棋先行 private String[] chessStr = { "车", "马", "象", "士", "将", "炮", "卒", "兵", "炮", "车", "马", "相", "士", "帅" }; private static int[][] chessFlag = new ChessFlag().getChessFlag(); private boolean[][] select = new boolean[10][9]; // 保存棋子被选中的坐标 /* * 功能: 画出象棋棋盘中的棋子 */ public void drawChessMan(Graphics g) { // 转成2D模式 Graphics2D g2d = (Graphics2D) g; // 获取当前的画刷 Stroke stroke = g2d.getStroke(); // 遍历棋盘中所有的位置 for (int i = 0; i < chessFlag.length; i++) { for (int j = 0; j < chessFlag[i].length; j++) { // 判断指定位置是否有棋子 if (chessFlag[i][j] != 0) { // 把棋子数组的下标转换成棋子的坐标 int x = (j + 1) * 60; int y = (i + 1) * 60; // 判断指定位置的棋子是否被选中 if (select[i][j]) { // 设置画刷的颜色 g2d.setColor(new Color(0, 200, 0)); // 设置画刷的大小 g2d.setStroke(new BasicStroke(3)); // 画选中棋子时的棋子边框 g2d.drawLine(x - 25, y - 20, x - 25, y - 25); g2d.drawLine(x - 25, y + 20, x - 25, y + 25); g2d.drawLine(x - 20, y - 25, x - 25, y - 25); g2d.drawLine(x - 20, y + 25, x - 25, y + 25); g2d.drawLine(x + 25, y - 20, x + 25, y - 25); g2d.drawLine(x + 25, y + 20, x + 25, y + 25); g2d.drawLine(x + 25, y + 25, x + 20, y + 25); g2d.drawLine(x + 25, y - 25, x + 20, y - 25); // 还原为默认画刷 g2d.setStroke(stroke); // 把棋子设为没有选中的状态 select[i][j] = !select[i][j]; } // 画内圆 g2d.setColor(new Color(219, 196, 154)); g2d.fillOval(x - 25, y - 25, 50, 50); // 画大外圆 g2d.setColor(new Color(109, 98, 77)); g2d.drawOval(x - 25, y - 25, 50, 50); // 根据棋子的所属一方,显示不同的棋子颜色 if (chessFlag[i][j] < 8) { g2d.setColor(Color.RED); } else { g2d.setColor(Color.BLACK); } // 画小外圆 g2d.drawOval(x - 20, y - 20, 40, 40); g2d.setFont(FontUtil.myFont2); String newstring = new String(chessStr[chessFlag[i][j] - 1]); g2d.drawString(newstring, x - 20, y + 10); } } } } public int getOldX() { return oldX; } public boolean isRedMove() { return redMove; } public void setRedMove(boolean redMove) { this.redMove = redMove; } public void setOldX(int oldX) { this.oldX = oldX; } public int getOldY() { return oldY; } public void setOldY(int oldY) { this.oldY = oldY; } public int getNewX() { return newX; } public void setNewX(int newX) { this.newX = newX; } public int getNewY() { return newY; } public void setNewY(int newY) { this.newY = newY; } // 获取棋子对应的字符串 public String[] getChessStr() { return chessStr; } // 获取棋盘中所有棋子的位置 public int[][] getChessFlag() { return chessFlag; } // 设置棋子对应的字符串 public void setChessFlag(int[][] chessFlag) { ChessMan.chessFlag = chessFlag; } // 设置棋子的坐标 public void setChessFlag(int i, int j, int z) { chessFlag[i][j] = z; } // 获取选中状态 public boolean[][] getSelect() { return select; } // 设置选中状态 public void setSelect(int i, int j) { select[i][j] = !select[i][j]; } }
代码下载地址:http://www.zuidaima.com/share/1550463398644736.htm