中国象棋源码

代码的结构挺好的,mvc模式架构的,给大家分享出来!

中国象棋源码_第1张图片

原创不易,转载请注明出处:中国象棋源码

部分代码

Controller.java

[java]  view plain copy
  1. package com.zuidaima.chess.controller;  
  2. import java.awt.event.MouseAdapter;  
  3. import java.awt.event.MouseEvent;  
  4. import com.yaoyun.chess.entity.ChessBoard;  
  5. import com.yaoyun.chess.entity.ChessMan;  
  6. import com.yaoyun.chess.panel.GamePanel;  
  7. import com.yaoyun.chess.util.MusicUtil;  
  8.   
  9. public class Controller extends MouseAdapter {  
  10.   
  11.     private static ChessBoard chessBoard;  
  12.     private static ChessMan chessMan;  
  13.     private static GamePanel gamePanel;  
  14.     private static boolean gameover = false;  
  15.       
  16.     /* 
  17.      * 重新显示游戏界面 
  18.      */  
  19.     public Controller(GamePanel gamePanel, ChessBoard chess, ChessMan chessMan) {  
  20.         Controller.chessBoard = chess;  
  21.         Controller.chessMan = chessMan;  
  22.         Controller.gamePanel = gamePanel;  
  23.     }  
  24.       
  25.     /* 
  26.      *  功能:响应鼠标点击事件 
  27.      */  
  28.     public void mouseClicked(MouseEvent e) {  
  29.         // 获取鼠标的位置,20代表的是菜单栏的高度  
  30.         int x = e.getX();  
  31.         int y = e.getY()-20;  
  32.   
  33.         // 如果鼠标点击的坐标有效  
  34.         if ((x >= 40 && x <= 570) && (y >= 40 && y <= 630) && !gameover) {  
  35.               
  36.             // 把鼠标的坐标转换成棋子数组的下标,25代表棋子的半径  
  37.             int newi = (y + 25) / 60 - 1;  
  38.             int newj = (x + 25) / 60 - 1;  
  39.               
  40.             // 获取鼠标上一步点击位置数组的下标  
  41.             int oldi = chessMan.getOldX();  
  42.             int oldj = chessMan.getOldY();  
  43.   
  44.             // 获取保存棋子位置的数组  
  45.             int[][] chessFlag = chessMan.getChessFlag();  
  46.   
  47.             // 判断选中的地方是否有棋子  
  48.             if (chessFlag[newi][newj] == 0) {  
  49.                 // 判断上一步是否有选中棋子  
  50.                 if (oldi != -1 && oldj != -1) {  
  51.                     // 判断棋子是否能移动  
  52.                     if (isChessManMove(chessFlag, newi, newj)) {  
  53.                         //播放下棋声音  
  54.                         if(MusicUtil.isGameMusic()){  
  55.                             MusicUtil.playMusic("go");  
  56.                         }     
  57.                           
  58.                         // 移动棋子  
  59.                         chessMan.setChessFlag(newi, newj, chessFlag[oldi][oldj]);  
  60.                         chessMan.setChessFlag(oldi, oldj, 0);  
  61.                           
  62.                         // 移动成功后,清除上一步选中的棋子  
  63.                         chessMan.setOldX(-1);  
  64.                         chessMan.setOldY(-1);  
  65.                         gamePanel.dispaly(chessBoard, chessMan);  
  66.                         // 轮到对方下棋  
  67.                         chessMan.setRedMove(!chessMan.isRedMove());  
  68.                     }   
  69.                 }   
  70.   
  71.             } else {  
  72.                 // 判断上一步是否有棋子  
  73.                 if (oldi == -1 && oldj == -1) { // 上一步没有棋子  
  74.                     // 如果有棋子,并且是自己  
  75.                     if ((oldi == newi && oldj == newj)) {  
  76.                     } else {  
  77.                         // 把选中的棋子设为选中状态  
  78.                         chessMan.setSelect(newi, newj);  
  79.   
  80.                         // 并把其保存为上一颗棋子  
  81.                         chessMan.setOldX(newi);  
  82.                         chessMan.setOldY(newj);  
  83.                         showGame();  
  84.   
  85.                     }  
  86.   
  87.                 } else { // 如果上一步有棋子  
  88.   
  89.                     // 判断是否吃的到下一步的棋子  
  90.                     if (isChessManMove(chessFlag, newi, newj)) {  
  91.                         // 判断是否是自己一方的棋子  
  92.                         if ((chessFlag[oldi][oldj] >= 8 && chessFlag[newi][newj] < 8) || (chessFlag[oldi][oldj] < 8 && chessFlag[newi][newj] >= 8)) {  
  93.                             if (chessFlag[newi][newj] == 5) {  
  94.                                 gamePanel.setMessage(1);  
  95.                                 gameover = true;  
  96.                             } else if (chessFlag[newi][newj] == 14) {  
  97.                                 gamePanel.setMessage(2);  
  98.                                 gameover = true;  
  99.                             }  
  100.                             //播放吃棋子的声音  
  101.                             if(MusicUtil.isGameMusic()){  
  102.                                 MusicUtil.playMusic("eat");  
  103.                             }     
  104.                             // 吃棋子  
  105.                             chessMan.setChessFlag(newi, newj,chessFlag[oldi][oldj]);  
  106.                             chessMan.setChessFlag(oldi, oldj, 0);  
  107.                             // 轮到对方下棋  
  108.                             chessMan.setRedMove(!chessMan.isRedMove());  
  109.                         }   
  110.                     }  
  111.   
  112.                     // 并清除上一步棋子  
  113.                     chessMan.setOldX(-1);  
  114.                     chessMan.setOldY(-1);  
  115.                     // 重新显示界面  
  116.                     showGame();  
  117.                 }  
  118.             }  
  119.         }   
  120.   
  121.     }  
  122.   
  123.     /* 
  124.      * 功能:重新显示界面 
  125.      */  
  126.     public static void showGame(){  
  127.         gamePanel.dispaly(chessBoard, chessMan);  
  128.     }  
  129.       
  130.     /* 
  131.      *  判断棋子是否能移动 
  132.      *  chessFlag:棋盘棋子坐标 
  133.      *  newi、newj:棋子下一步的坐标 
  134.      */  
  135.     public boolean isChessManMove(int[][] chessFlag, int newi, int newj) {  
  136.           
  137.         // 默认棋子不能移动  
  138.         boolean b = false;  
  139.           
  140.         // 获取上一步选中的棋子坐标  
  141.         int oldi = chessMan.getOldX();  
  142.         int oldj = chessMan.getOldY();  
  143.   
  144.         // 默认该棋子是红方的  
  145.         boolean redFlag = true;  
  146.           
  147.         // 棋子不是为红方的  
  148.         if (chessFlag[oldi][oldj] >= 8) {  
  149.             redFlag = false;  
  150.         }  
  151.           
  152.         // 如果棋子是红方且不是红方下棋,则返回  
  153.         if(redFlag != chessMan.isRedMove()){  
  154.             System.out.println("还没轮到你下呢!");  
  155.             return false;  
  156.         }  
  157.           
  158.         // 获取棋盘中所有的棋子  
  159.         String[] chessStr = chessMan.getChessStr();  
  160.           
  161.         // 获取上一步选中的是什么棋子  
  162.         String name = chessStr[chessFlag[oldi][oldj] - 1];  
  163.   
  164.         // 根据棋子名称选择棋子的走法  
  165.         if(name.equals("兵")) {  
  166.             if (oldi >= 5) { // 没有过河  
  167.                 if ((oldi - newi == 1) && (newj == oldj)) {  
  168.                     b = true;  
  169.                 }  
  170.             } else { // 已过河  
  171.                 if ((oldi - newi == 1) && (newj == oldj)) {  
  172.                     b = true;  
  173.                 } else if ((Math.abs(newj - oldj) == 1) && (newi == oldi)) {  
  174.                     b = true;  
  175.                 } else {  
  176.                     return false;  
  177.                 }  
  178.             }  
  179.         }  
  180.         else if(name.equals("卒")) {  
  181.             if (oldi < 5) { // 没有过河  
  182.                 if ((newi - oldi == 1) && (newj == oldj)) {  
  183.                     b = true;  
  184.                 }  
  185.             } else { // 已过河  
  186.                 if ((newi - oldi == 1) && (newj == oldj)) {  
  187.                     b = true;  
  188.                 } else if ((Math.abs(newj - oldj) == 1) && (newi == oldi)) {  
  189.                     b = true;  
  190.                 } else {  
  191.                     return false;  
  192.                 }  
  193.             }  
  194.         }  
  195.         else if(name.equals("车")) {  
  196.             if (newi == oldi) {  
  197.                 int k = 0;  
  198.                 if (newj > oldj) { // 红车水平向右方向移动  
  199.                     for (int i = oldj; i <= newj; i++) {  
  200.                         if (chessFlag[oldi][i] > 0) {  
  201.                             k++;  
  202.                         }  
  203.                     }  
  204.                 } else {  
  205.                     for (int i = oldj; i >= newj; i--) { // 红车水平向左方向移动  
  206.                         if (chessFlag[oldi][i] > 0) {  
  207.                             k++;  
  208.                         }  
  209.                     }  
  210.                 }  
  211.                 if (k <= 2) {  
  212.                     b = true;  
  213.                 }  
  214.             } else if (newj == oldj) { // 红车垂直下方向移动  
  215.                 int k = 0;  
  216.                 if (newi > oldi) {  
  217.                     for (int i = oldi; i <= newi; i++) {  
  218.                         if (chessFlag[i][oldj] > 0) {  
  219.                             k++;  
  220.                         }  
  221.                     }  
  222.                 } else {  
  223.                     for (int i = oldi; i >= newi; i--) { // 红车垂直上方向移动  
  224.                         if (chessFlag[i][oldj] > 0) {  
  225.                             k++;  
  226.                         }  
  227.                     }  
  228.                 }  
  229.                 if (k <= 2) {  
  230.                     b = true;  
  231.                 }  
  232.             }  
  233.         }  
  234.         else if(name.equals("炮")) {  
  235.             int s = 0;  
  236.             if (newi == oldi) {  
  237.                 if (newj > oldj) {  
  238.                     for (int i = oldj; i <= newj; i++) {  
  239.                         if (chessFlag[oldi][i] > 0) {  
  240.                             s++;  
  241.                         }  
  242.                     }  
  243.                 } else {  
  244.                     for (int i = oldj; i >= newj; i--) {  
  245.                         if (chessFlag[oldi][i] > 0) {  
  246.                             s++;  
  247.                         }  
  248.                     }  
  249.                 }  
  250.             } else if (newj == oldj) {  
  251.                 if (newi > oldi) {  
  252.                     for (int i = oldi; i <= newi; i++) {  
  253.                         if (chessFlag[i][oldj] > 0) {  
  254.                             s++;  
  255.                         }  
  256.                     }  
  257.                 } else {  
  258.                     for (int i = oldi; i >= newi; i--) {  
  259.                         if (chessFlag[i][oldj] > 0) {  
  260.                             s++;  
  261.                         }  
  262.                     }  
  263.                 }  
  264.             }  
  265.             if (s == 1 || (s == 3 && chessFlag[newi][newj] > 0)) {  
  266.                 b = true;  
  267.             }  
  268.         }  
  269.         else if(name.equals("帅")||name.equals("将")) {  
  270.             if (newj == oldj && (Math.abs(newi - oldi) >= 5)) {  
  271.                 int flag = 0;  
  272.                 if (newi > oldi) { // 将吃帅  
  273.                     for (int i = oldi; i <= newi; i++) {  
  274.                         if ((chessFlag[oldi][oldj] == 5)  
  275.                                 && (chessFlag[newi][newj] == 14)) {  
  276.                             if (chessFlag[i][oldj] > 0) {  
  277.                                 flag++;  
  278.                             }  
  279.                         }  
  280.                     }  
  281.                 } else { // 帅吃将  
  282.                     for (int i = newi; i <= oldi; i++) {  
  283.                         if ((chessFlag[oldi][oldj] == 14)  
  284.                                 && (chessFlag[newi][newj] == 5)) {  
  285.                             if (chessFlag[i][oldj] > 0) {  
  286.                                 flag++;  
  287.                             }  
  288.                         }  
  289.                     }  
  290.                 }  
  291.                 if (flag == 2) {  
  292.                     b = true;  
  293.                 }  
  294.             } else if (((newi <= 2 && redFlag == true) || (newi >= 7 && redFlag == false))  
  295.                     && (newj <= 5 && newj >= 3)) {  
  296.                 if (Math.abs(newi - oldi) == 1 && newj == oldj) {  
  297.                     b = true;  
  298.                 } else if (Math.abs(newj - oldj) == 1 && newi == oldi) {  
  299.                     b = true;  
  300.                 }  
  301.             }  
  302.         }  
  303.         else if(name.equals("士")) {  
  304.             if (redFlag) { // 红方棋子  
  305.                 if (newi <= 2 && newj <= 5 && newj >= 3) {  
  306.                     if (Math.abs(newi - oldi) == 1  
  307.                             && Math.abs(newj - oldj) == 1) {  
  308.                         b = true;  
  309.                     }  
  310.                 }  
  311.             } else { // 黑方棋子  
  312.                 if (newi >= 7 && newj <= 5 && newj >= 3) {  
  313.                     if (Math.abs(newi - oldi) == 1  
  314.                             && Math.abs(newj - oldj) == 1) {  
  315.                         b = true;  
  316.                     }  
  317.                 }  
  318.             }  
  319.         }  
  320.         else if(name.equals("象")||name.equals("相")) {  
  321.             if ((newi >= 5 && redFlag == false)  
  322.                     || (newi < 5 && redFlag == true)) {  
  323.                 if ((newi - oldi) == 2 && (newj - oldj) == 2) { // 移到右下方  
  324.                     if (chessFlag[oldi + 1][oldj + 1] == 0) {  
  325.                         b = true;  
  326.                     }  
  327.                 } else if ((newi - oldi) == -2 && (newj - oldj) == 2) { // 移到右上方  
  328.                     if (chessFlag[oldi - 1][oldj + 1] == 0) {  
  329.                         b = true;  
  330.                     }  
  331.                 } else if ((newi - oldi) == 2 && (newj - oldj) == -2) { // 移到左下方  
  332.                     if (chessFlag[oldi + 1][oldj - 1] == 0) {  
  333.                         b = true;  
  334.                     }  
  335.                 } else if ((newi - oldi) == -2 && (newj - oldj) == -2) { // 移到左上方  
  336.                     if (chessFlag[oldi - 1][oldj - 1] == 0) {  
  337.                         b = true;  
  338.                     }  
  339.                 }  
  340.             }  
  341.         }  
  342.         else if(name.equals("马")) {  
  343.             if ((newi - oldi) == -2 && (newj - oldj) == 1) { // 移到NE方  
  344.                 if (chessFlag[oldi - 1][oldj] == 0) {  
  345.                     b = true;  
  346.                 }  
  347.             } else if ((newi - oldi) == -2 && (newj - oldj) == -1) { // 移到NW方  
  348.                 if (chessFlag[oldi - 1][oldj] == 0) {  
  349.                     b = true;  
  350.                 }  
  351.             } else if ((newi - oldi) == 2 && (newj - oldj) == 1) { // 移到SE方  
  352.                 if (chessFlag[oldi + 1][oldj] == 0) {  
  353.                     b = true;  
  354.                 }  
  355.             } else if ((newi - oldi) == 2 && (newj - oldj) == -1) { // 移到SW方  
  356.                 if (chessFlag[oldi + 1][oldj] == 0) {  
  357.                     b = true;  
  358.                 }  
  359.             } else if ((newi - oldi) == -1 && (newj - oldj) == 2) { // 移到EN方  
  360.                 if (chessFlag[oldi][oldj + 1] == 0) {  
  361.                     b = true;  
  362.                 }  
  363.             } else if ((newi - oldi) == 1 && (newj - oldj) == 2) { // 移到ES方  
  364.                 if (chessFlag[oldi][oldj + 1] == 0) {  
  365.                     b = true;  
  366.                 }  
  367.             } else if ((newi - oldi) == -1 && (newj - oldj) == -2) { // 移到WN方  
  368.                 if (chessFlag[oldi][oldj - 1] == 0) {  
  369.                     b = true;  
  370.                 }  
  371.             } else if ((newi - oldi) == 1 && (newj - oldj) == -2) { // 移到WS方  
  372.                 if (chessFlag[oldi][oldj - 1] == 0) {  
  373.                     b = true;  
  374.                 }  
  375.             }  
  376.         }  
  377.         return b;  
  378.     }  
  379.   
  380.     /* 
  381.      * 功能:设置游戏状态 
  382.      */  
  383.     public static void setGameover(boolean gameover) {  
  384.         Controller.gameover = gameover;  
  385.     }  
  386.       
  387. }  
  388.   
  389.                       

ChessMan.java

[java]  view plain copy
  1. package com.zuidaima.chess.entity;  
  2.   
  3. import java.awt.BasicStroke;  
  4. import java.awt.Color;  
  5. import java.awt.Graphics;  
  6. import java.awt.Graphics2D;  
  7. import java.awt.Stroke;  
  8. import java.io.Serializable;  
  9.   
  10. import com.yaoyun.chess.util.FontUtil;  
  11.   
  12. @SuppressWarnings("serial")  
  13. public class ChessMan implements Serializable {  
  14.   
  15.     private int oldX = -1// 棋子上一步所在位置的x坐标  
  16.     private int oldY = -1// 棋子上一步所在位置的y坐标  
  17.     private int newX = -1// 棋子现在所在位置的x坐标  
  18.     private int newY = -1// 棋子现在所在位置的y坐标  
  19.     private boolean redMove = true// 红棋先行  
  20.     private String[] chessStr = { "车""马""象""士""将""炮""卒""兵""炮""车""马""相""士""帅" };  
  21.     private static int[][] chessFlag = new ChessFlag().getChessFlag();  
  22.     private boolean[][] select = new boolean[10][9]; // 保存棋子被选中的坐标  
  23.   
  24.     /* 
  25.      * 功能: 画出象棋棋盘中的棋子 
  26.      */  
  27.     public void drawChessMan(Graphics g) {  
  28.         // 转成2D模式  
  29.         Graphics2D g2d = (Graphics2D) g;  
  30.         // 获取当前的画刷  
  31.         Stroke stroke = g2d.getStroke();  
  32.   
  33.         // 遍历棋盘中所有的位置  
  34.         for (int i = 0; i < chessFlag.length; i++) {  
  35.             for (int j = 0; j < chessFlag[i].length; j++) {  
  36.                 // 判断指定位置是否有棋子  
  37.                 if (chessFlag[i][j] != 0) {  
  38.   
  39.                     // 把棋子数组的下标转换成棋子的坐标  
  40.                     int x = (j + 1) * 60;  
  41.                     int y = (i + 1) * 60;  
  42.   
  43.                     // 判断指定位置的棋子是否被选中  
  44.                     if (select[i][j]) {  
  45.                         // 设置画刷的颜色  
  46.                         g2d.setColor(new Color(02000));  
  47.                         // 设置画刷的大小  
  48.                         g2d.setStroke(new BasicStroke(3));  
  49.                         // 画选中棋子时的棋子边框  
  50.                         g2d.drawLine(x - 25, y - 20, x - 25, y - 25);  
  51.                         g2d.drawLine(x - 25, y + 20, x - 25, y + 25);  
  52.                         g2d.drawLine(x - 20, y - 25, x - 25, y - 25);  
  53.                         g2d.drawLine(x - 20, y + 25, x - 25, y + 25);  
  54.                         g2d.drawLine(x + 25, y - 20, x + 25, y - 25);  
  55.                         g2d.drawLine(x + 25, y + 20, x + 25, y + 25);  
  56.                         g2d.drawLine(x + 25, y + 25, x + 20, y + 25);  
  57.                         g2d.drawLine(x + 25, y - 25, x + 20, y - 25);  
  58.                         // 还原为默认画刷  
  59.                         g2d.setStroke(stroke);  
  60.   
  61.                         // 把棋子设为没有选中的状态  
  62.                         select[i][j] = !select[i][j];  
  63.                     }  
  64.   
  65.                     // 画内圆  
  66.                     g2d.setColor(new Color(219196154));  
  67.                     g2d.fillOval(x - 25, y - 255050);  
  68.   
  69.                     // 画大外圆  
  70.                     g2d.setColor(new Color(1099877));  
  71.                     g2d.drawOval(x - 25, y - 255050);  
  72.   
  73.                     // 根据棋子的所属一方,显示不同的棋子颜色  
  74.                     if (chessFlag[i][j] < 8) {  
  75.                         g2d.setColor(Color.RED);  
  76.                     } else {  
  77.                         g2d.setColor(Color.BLACK);  
  78.                     }  
  79.                     // 画小外圆  
  80.                     g2d.drawOval(x - 20, y - 204040);  
  81.   
  82.                     g2d.setFont(FontUtil.myFont2);  
  83.                     String newstring = new String(chessStr[chessFlag[i][j] - 1]);  
  84.                     g2d.drawString(newstring, x - 20, y + 10);  
  85.   
  86.                 }  
  87.             }  
  88.         }  
  89.     }  
  90.   
  91.     public int getOldX() {  
  92.         return oldX;  
  93.     }  
  94.   
  95.     public boolean isRedMove() {  
  96.         return redMove;  
  97.     }  
  98.   
  99.     public void setRedMove(boolean redMove) {  
  100.         this.redMove = redMove;  
  101.     }  
  102.   
  103.     public void setOldX(int oldX) {  
  104.         this.oldX = oldX;  
  105.     }  
  106.   
  107.     public int getOldY() {  
  108.         return oldY;  
  109.     }  
  110.   
  111.     public void setOldY(int oldY) {  
  112.         this.oldY = oldY;  
  113.     }  
  114.   
  115.     public int getNewX() {  
  116.         return newX;  
  117.     }  
  118.   
  119.     public void setNewX(int newX) {  
  120.         this.newX = newX;  
  121.     }  
  122.   
  123.     public int getNewY() {  
  124.         return newY;  
  125.     }  
  126.   
  127.     public void setNewY(int newY) {  
  128.         this.newY = newY;  
  129.     }  
  130.   
  131.     // 获取棋子对应的字符串  
  132.     public String[] getChessStr() {  
  133.         return chessStr;  
  134.     }  
  135.   
  136.     // 获取棋盘中所有棋子的位置  
  137.     public int[][] getChessFlag() {  
  138.         return chessFlag;  
  139.     }  
  140.   
  141.     // 设置棋子对应的字符串  
  142.     public void setChessFlag(int[][] chessFlag) {  
  143.         ChessMan.chessFlag = chessFlag;  
  144.     }  
  145.   
  146.     // 设置棋子的坐标  
  147.     public void setChessFlag(int i, int j, int z) {  
  148.         chessFlag[i][j] = z;  
  149.     }  
  150.   
  151.     // 获取选中状态  
  152.     public boolean[][] getSelect() {  
  153.         return select;  
  154.     }  
  155.   
  156.     // 设置选中状态  
  157.     public void setSelect(int i, int j) {  
  158.         select[i][j] = !select[i][j];  
  159.     }  
  160.   
  161. }  
  162.   
  163.                       


 代码下载地址:http://www.zuidaima.com/share/1550463398644736.htm

你可能感兴趣的:(java,源码,中国象棋,源码分享)