JAVA实现中国象棋
1.效果图
2.main程序创建JFrame并将JPanel添加到JFrame中
public static void main(String[] args) {
JFrame jFrame = new JFrame("中国象棋");
jFrame.setResizable(false);
jFrame.setSize(900,1000); //窗口大小
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
ChessJPanel ch =new ChessJPanel();
jFrame.add(ch);
jFrame.setVisible(true);
}
3.添加素材元素
//------------------------- //载入棋盘和棋子图片 // --------------------------//
import javax.swing.*;
import java.net.URL;
public class Data {
public static URL qipanUrl = Data.class.getResource("./static/qipan.png"); //棋盘
//黑棋
public static URL b_juUrl = Data.class.getResource("./static/b-ju.png"); //車
public static URL b_maUrl = Data.class.getResource("./static/b-ma.png"); //馬
public static URL b_xiangUrl = Data.class.getResource("./static/b-xiang.png"); //象
public static URL b_shiUrl = Data.class.getResource("./static/b-shi.png"); //士
public static URL b_paoUrl = Data.class.getResource("./static/b-pao.png"); //炮
public static URL b_zuUrl = Data.class.getResource("./static/b-zu.png"); //卒
public static URL b_jiangUrl = Data.class.getResource("./static/b-jiang.png"); //將
//红棋
public static URL r_juUrl = Data.class.getResource("./static/r-ju.png"); //車
public static URL r_maUrl = Data.class.getResource("./static/r-ma.png"); //馬
public static URL r_xiangUrl = Data.class.getResource("./static/r-xiang.png"); //象
public static URL r_shiUrl = Data.class.getResource("./static/r-shi.png"); //士
public static URL r_paoUrl = Data.class.getResource("./static/r-pao.png"); //炮
public static URL r_bingUrl = Data.class.getResource("./static/r-bing.png"); //卒
public static URL r_shuaiUrl = Data.class.getResource("./static/r-shuai.png"); //將
public static ImageIcon qipan = new ImageIcon(qipanUrl); //棋盘
//黑棋
public static ImageIcon b_ju = new ImageIcon(b_juUrl);
public static ImageIcon b_ma = new ImageIcon(b_maUrl);
public static ImageIcon b_xiang = new ImageIcon(b_xiangUrl);
public static ImageIcon b_shi = new ImageIcon(b_shiUrl);
public static ImageIcon b_pao = new ImageIcon(b_paoUrl);
public static ImageIcon b_zu = new ImageIcon(b_zuUrl);
public static ImageIcon b_jiang = new ImageIcon(b_jiangUrl);
//红棋
public static ImageIcon r_ju = new ImageIcon(r_juUrl);
public static ImageIcon r_ma = new ImageIcon(r_maUrl);
public static ImageIcon r_xiang = new ImageIcon(r_xiangUrl);
public static ImageIcon r_shi = new ImageIcon(r_shiUrl);
public static ImageIcon r_pao = new ImageIcon(r_paoUrl);
public static ImageIcon r_bing = new ImageIcon(r_bingUrl);
public static ImageIcon r_shuai = new ImageIcon(r_shuaiUrl);
}
4.将棋子图片添加到jLabel中
//------------------------- //将棋子和棋盘格子加入Jlable组件 // --------------------------//
import javax.swing.*;
public class BlackRedLabel extends JLabel {
JLabel[] jLabel = {
new JLabel(Data.r_shuai), //红棋
new JLabel(Data.r_ju),
new JLabel(Data.r_ju),
new JLabel(Data.r_ma),
new JLabel(Data.r_ma),
new JLabel(Data.r_xiang),
new JLabel(Data.r_xiang),
new JLabel(Data.r_shi),
new JLabel(Data.r_shi),
new JLabel(Data.r_pao),
new JLabel(Data.r_pao),
new JLabel(Data.r_bing),
new JLabel(Data.r_bing),
new JLabel(Data.r_bing),
new JLabel(Data.r_bing),
new JLabel(Data.r_bing),
new JLabel(Data.b_jiang), //黑棋
new JLabel(Data.b_ju),
new JLabel(Data.b_ju),
new JLabel(Data.b_ma),
new JLabel(Data.b_ma),
new JLabel(Data.b_xiang),
new JLabel(Data.b_xiang),
new JLabel(Data.b_shi),
new JLabel(Data.b_shi),
new JLabel(Data.b_pao),
new JLabel(Data.b_pao),
new JLabel(Data.b_zu),
new JLabel(Data.b_zu),
new JLabel(Data.b_zu),
new JLabel(Data.b_zu),
new JLabel(Data.b_zu),
};
JLabel[][] route = new JLabel[9][10]; //将棋盘坐标划分为二维JLable数组
public BlackRedLabel(){
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 10; j++) {
route[i][j] = new JLabel();
}
}
}
}
5.将素材展现到到画板中
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏
this.setBackground(Color.lightGray);
this.setBounds(0,0,900,1000);
this.add(winner);
winner.setBounds(button[1][0],button[1][1],500,200);
for (int i = 0; i < 4; i++) {
this.add(jButton[i]);
}
Data.qipan.paintIcon(this,g,94,70); // 画棋盘
for (int i = 0; i < 32; i++) { //画棋子
this.add(brl.jLabel[i]);
brl.jLabel[i].setBackground(Color.blue);
brl.jLabel[i].setBounds(brData.blackRedChess[i][0],brData.blackRedChess[i][1],80,80);
}
for (int i = 0; i < 9; i++) { //画棋格
for (int j = 0; j < 10; j++) {
this.add(brl.route[i][j]);
brl.route[i][j].setBounds(54 + i * 89,40 + j * 88,80,80);
}
}
jButton[0].setBounds(200,5,150,30);
jButton[1].setBounds(450,5,300,30);
jButton[2].setBounds(button[2][0],button[2][1],200,100);
jButton[3].setBounds(button[3][0],button[3][1],200,100);
}
6.属性变量初始化
//------------------------- //定义并初始化数据 // --------------------------//
public class BlackRedData {
//定义并初始化数据 Y轴差距88,X轴差距89
int[][] blackRedChess = {
{410,832}, //帅 0
{54,832}, //車 1
{766,832}, //車 2
{143,832}, //馬 3
{677,832}, //馬 4
{232,832}, //相 5
{588,832}, //相 6
{321,832}, //仕 7
{499,832}, //仕 8
{143,656}, //炮 9
{677,656}, //炮 10
{54,568}, //兵 11
{232,568}, //兵 12
{410,568}, //兵 13
{588,568}, //兵 14
{766,568}, //兵 15
//黑棋
{410,40}, //将 16
{54,40}, //車 17
{766,40}, //車 18
{143,40}, //馬 19
{677,40}, //馬 20
{232,40}, //象 21
{588,40}, //象 22
{321,40}, //士 23
{499,40}, //士 24
{143,216}, //炮 25
{677,216}, //炮 26
{54,304}, //卒 27
{232,304}, //卒 28
{410,304}, //卒 29
{588,304}, //卒 30
{766,304}, //卒 31
};
}
7.棋子的移动规则
-
帅,将移动规则
public boolean shuaiMove(int X, int Y, BlackRedData blackRedData, int Num) { boolean isSuccess = false; if (Num == 0) { //红帅 if (X >= 321 && X <= 499 && Y >= 656 && Y <= 832) { if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && blackRedData.blackRedChess[Num][1] == Y) { blackRedData.blackRedChess[Num][0] = X; isSuccess = true; } else if (Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && blackRedData.blackRedChess[Num][0] == X) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } else if (Num == 16) { //黑将 if (X >= 321 && X <= 499 && Y >= 40 && Y <= 216) { if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && blackRedData.blackRedChess[Num][1] == Y) { blackRedData.blackRedChess[Num][0] = X; isSuccess = true; } else if (Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && blackRedData.blackRedChess[Num][0] == X) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } return isSuccess; }
-
車,炮移动规则
public boolean juMove(int X, int Y, BlackRedData blackRedData, int Num) { boolean isSuccess = false; boolean isMove = true; if (X >= 54 && X <= 766 && Y >= 40 && Y <= 832) { if (Num == 1 || Num == 2 || Num == 17 || Num == 18 || Num == 9 || Num == 10 || Num == 25 || Num == 26) { //红車 if (Y == blackRedData.blackRedChess[Num][1]) { for (int i = 0; i < 32; i++) { if (X < blackRedData.blackRedChess[Num][0]){ if (blackRedData.blackRedChess[i][1] == Y && blackRedData.blackRedChess[i][0] > X && blackRedData.blackRedChess[i][0] < blackRedData.blackRedChess[Num][0]){ isMove = false; } }else if (X > blackRedData.blackRedChess[Num][0]){ if (blackRedData.blackRedChess[i][1] == Y && blackRedData.blackRedChess[i][0] < X && blackRedData.blackRedChess[i][0] > blackRedData.blackRedChess[Num][0]){ isMove = false; } } } if (isMove){ blackRedData.blackRedChess[Num][0] = X; isSuccess = true; } } else if (X == blackRedData.blackRedChess[Num][0]) { for (int i = 0; i < 32; i++) { if (Y < blackRedData.blackRedChess[Num][1]){ if (blackRedData.blackRedChess[i][0] == X && blackRedData.blackRedChess[i][1] > Y && blackRedData.blackRedChess[i][1] < blackRedData.blackRedChess[Num][1]){ isMove = false; } }else if (Y > blackRedData.blackRedChess[Num][1]){ if (blackRedData.blackRedChess[i][0] == X && blackRedData.blackRedChess[i][1] < Y && blackRedData.blackRedChess[i][1] > blackRedData.blackRedChess[Num][1]){ isMove = false; } } } if (isMove){ blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } } return isSuccess; }
-
兵,卒移动规则
//兵,卒移动规则 public boolean zuMove(int X, int Y, BlackRedData blackRedData, int Num) { boolean isSuccess = false; if (Num >= 11 && Num <= 15) { //红兵 if (Y <= 568 && Y >= 54 && X >= 54 && X <= 766) { if (Y >= 480) { //未过河之前只能向前 if (X == blackRedData.blackRedChess[Num][0] && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Y < blackRedData.blackRedChess[Num][1]) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } else { //过河后可横可向前 if (X == blackRedData.blackRedChess[Num][0] && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Y < blackRedData.blackRedChess[Num][1]) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } else if (Y == blackRedData.blackRedChess[Num][1] && Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89) { blackRedData.blackRedChess[Num][0] = X; isSuccess = true; } } } } else if (Num >= 27 && Num <= 31) { //黑卒 if (Y >= 304 && Y <= 832 && X >= 54 && X <= 766) { if (Y <= 392) { //未过河之前只能向前 if (X == blackRedData.blackRedChess[Num][0] && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Y > blackRedData.blackRedChess[Num][1]) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } else { //过河后可横可向前 if (X == blackRedData.blackRedChess[Num][0] && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Y > blackRedData.blackRedChess[Num][1]) { blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } else if (Y == blackRedData.blackRedChess[Num][1] && Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89) { blackRedData.blackRedChess[Num][0] = X; isSuccess = true; } } } } return isSuccess; }
-
馬移动规则
//馬移动规则 public boolean maMove(int X, int Y, BlackRedData blackRedData, int Num) { boolean isSuccess = false; boolean isMove = true; //判断有没有别马脚,马能不能走 if (X >= 54 && X <= 766 && Y >= 40 && Y <= 832) { if (Num == 3 || Num == 4) { //红马 if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 176) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == blackRedData.blackRedChess[Num][0] && blackRedData.blackRedChess[i][1] == ((blackRedData.blackRedChess[Num][1] + Y) / 2)) { isMove = false; break; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } else if (Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Math.abs(X - blackRedData.blackRedChess[Num][0]) == 178) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][1] == blackRedData.blackRedChess[Num][1] && (blackRedData.blackRedChess[Num][0] + X) / 2 == blackRedData.blackRedChess[i][0]) { isMove = false; break; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } else if (Num == 19 || Num == 20) { //黑马 if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 176) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == blackRedData.blackRedChess[Num][0] && (blackRedData.blackRedChess[Num][1] + Y) / 2 == blackRedData.blackRedChess[i][1]) { isMove = false; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } else if (Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 && Math.abs(X - blackRedData.blackRedChess[Num][0]) == 178) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][1] == blackRedData.blackRedChess[Num][1] && (blackRedData.blackRedChess[Num][0] + X) / 2 == blackRedData.blackRedChess[i][0]) { isMove = false; break; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } } return isSuccess; }
-
象,相移动规则
//相,象移动规则 public boolean xiangMove(int X, int Y, BlackRedData blackRedData, int Num) { boolean isSuccess = false; boolean isMove = true; //判断有没有别阻象心,能不能移动 if (Num == 5 || Num == 6 && Y >= 480) { if (Math.abs(blackRedData.blackRedChess[Num][0] - X) == 178 && Math.abs(blackRedData.blackRedChess[Num][1] - Y) == 176) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == ((X + blackRedData.blackRedChess[Num][0]) / 2) && blackRedData.blackRedChess[i][1] == ((Y + blackRedData.blackRedChess[Num][1]) / 2)) { isMove = false; break; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } else if (Num == 22 || Num == 21 && Y <= 392) { //黑象 if (Math.abs(blackRedData.blackRedChess[Num][0] - X) == 178 && Math.abs(blackRedData.blackRedChess[Num][1] - Y) == 176) { for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == (X + blackRedData.blackRedChess[Num][0]) / 2 && blackRedData.blackRedChess[i][1] == (Y + blackRedData.blackRedChess[Num][1]) / 2) { isMove = false; break; } } if (isMove) { blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } return isSuccess; }
-
士,仕移动规则
//士移动规则 public boolean shiMove(int X, int Y, BlackRedData blackRedData, int Num){ boolean isSuccess = false; if (X >= 321 && X <= 499){ if (Num == 7 || Num == 8 && Y >= 656 && Y <= 832){ if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 ){ blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } }else if (Num == 23 || Num == 24 && Y >= 40 && Y <= 216){ if (Math.abs(X - blackRedData.blackRedChess[Num][0]) == 89 && Math.abs(Y - blackRedData.blackRedChess[Num][1]) == 88 ){ blackRedData.blackRedChess[Num][0] = X; blackRedData.blackRedChess[Num][1] = Y; isSuccess = true; } } } return isSuccess; }
8. 棋子吃子规则
棋子吃子规则即被吃棋子在符合该棋子移动规则的路径下(炮除外),所以除炮外其他棋子只需要目标坐标满足棋子移动规则即可
MoveRule mr = new MoveRule(); public boolean eat(int X, int Y, BlackRedData blackRedData, int Num){ boolean isEat = false; switch (Num){ case 0: //帅,将 case 16: isEat = mr.shuaiMove(X,Y,blackRedData,Num); break; case 1: //車 case 2: case 17: case 18: isEat = mr.juMove(X,Y,blackRedData,Num); break; case 9: //炮 case 10: case 25: case 26: isEat = paoEatRule(X,Y,blackRedData,Num); break; case 11: //卒,兵 case 12: case 13: case 14: case 15: case 27: case 28: case 29: case 30: case 31: isEat = mr.zuMove(X,Y,blackRedData,Num); break; case 3: case 4: case 19: case 20: isEat = mr.maMove(X,Y,blackRedData,Num); break; case 5: case 6: case 21: case 22: isEat = mr.xiangMove(X,Y,blackRedData,Num); break; case 7: case 8: case 23: case 24: isEat = mr.shiMove(X,Y,blackRedData,Num); break; } return isEat; }
-
炮吃子规则
//炮吃子规则 public boolean paoEatRule(int X, int Y, BlackRedData blackRedData, int Num){ boolean isPaoEat = false; int num = 0; if (X >= 54 && X <= 766 && Y >= 40 && Y <= 832){ if (blackRedData.blackRedChess[Num][0] == X){ if (Y > blackRedData.blackRedChess[Num][1]){ for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == X && blackRedData.blackRedChess[i][1] < Y && blackRedData.blackRedChess[i][1] > blackRedData.blackRedChess[Num][1]){ num ++; } } if (num == 1){ blackRedData.blackRedChess[Num][1] = Y; isPaoEat = true; } }else if (Y < blackRedData.blackRedChess[Num][1]){ for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == X && blackRedData.blackRedChess[i][1] > Y && blackRedData.blackRedChess[i][1] < blackRedData.blackRedChess[Num][1]){ num ++; } } if (num == 1){ blackRedData.blackRedChess[Num][1] = Y; isPaoEat = true; } } }else if (blackRedData.blackRedChess[Num][1] == Y){ if (X > blackRedData.blackRedChess[Num][0]){ for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][1] == Y && blackRedData.blackRedChess[i][0] < X && blackRedData.blackRedChess[i][0] > blackRedData.blackRedChess[Num][0]){ num ++; } } if (num == 1){ blackRedData.blackRedChess[Num][0] = X; isPaoEat = true; } }else if (X < blackRedData.blackRedChess[Num][0]){ for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][1] == Y && blackRedData.blackRedChess[i][0] > X && blackRedData.blackRedChess[i][0] < blackRedData.blackRedChess[Num][0]){ num ++; } } if (num == 1){ blackRedData.blackRedChess[Num][1] = Y; isPaoEat = true; } } } } return isPaoEat; }
8.判军
- 将军即为将或帅的坐标满足对方棋子的吃子规则(除双王见面)
public boolean isGeneral(boolean isBlackOrRed,int[][] copyData){ //判断是否被将军
BlackRedData bed = new BlackRedData();
boolean isGen = false;
copyBrdata(bed,copyData);
if (isBlackOrRed){
for (int i = 16; i < 32; i++) {
if (eat(bed.blackRedChess[0][0],bed.blackRedChess[0][1],bed,i)){
isGen = true;
break;
}
}
}else{
for (int i = 0; i < 16; i++) {
if (eat(bed.blackRedChess[16][0],bed.blackRedChess[16][1],bed,i)){
isGen = true;
break;
}
}
}
if (isMeet(bed)){
isGen = true;
}
return isGen;
}
-
双王见面
public boolean isMeet(BlackRedData blackRedData){ //判断是否双王见面 boolean ismeet = true; if (blackRedData.blackRedChess[0][0] == blackRedData.blackRedChess[16][0]){ for (int i = 0; i < 32; i++) { if (blackRedData.blackRedChess[i][0] == blackRedData.blackRedChess[0][0] && blackRedData.blackRedChess[i][1] > blackRedData.blackRedChess[16][1] && blackRedData.blackRedChess[i][1] < blackRedData.blackRedChess[0][1]){ ismeet = false; } } }else{ ismeet = false; } return ismeet; }
9.判断是否绝杀
public boolean isKillGen(boolean isBlackOrRed,int[][] copyData){
boolean isKill = true;
BlackRedData blackRedData = new BlackRedData();
copyBrdata(blackRedData,copyData);
if (isBlackOrRed){ //红棋是否被绝杀
for (int i = 0; i < 16; i++) {
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 10; y++) {
if (!Consistent(blackRedData,(54 + x * 89),(40 + y * 88),isBlackOrRed)){
if (eat((54 + x * 89),(40 + y * 88),blackRedData,i)){
if (!isGeneral(isBlackOrRed,blackRedData.blackRedChess)){
isKill = false;
break;
}else{
copyBrdata(blackRedData,copyData);
}
}
}
}
}
}
}else{ //黑棋是否被绝杀
for (int i = 16; i < 32; i++) {
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 10; y++) {
if (!Consistent(blackRedData,(54 + x * 89),(40 + y * 88),isBlackOrRed)){
if (eat((54 + x * 89),(40 + y * 88),blackRedData,i)){
if (!isGeneral(isBlackOrRed,blackRedData.blackRedChess)){
isKill = false;
break;
}else{
copyBrdata(blackRedData,copyData);
}
}
}
}
}
}
}
return isKill;
}
10.创建棋子的监听事件,并将棋子的吃子,是否将军,绝杀等情况
private void selectChess(){ //点击选中棋子
for (int i = 0; i < 32; i++) {
int num = i;
brl.jLabel[i].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (isBlackOrRed){
if (!isSelectChess){ //没有选中棋子
if (num < 16){
chessNum = num;
isSelectChess = true;
}else{
System.out.println("该红棋落子");
}
}else { //已选中棋子
if (num < 16){
chessNum = num;
}else{
aboveX = brData.blackRedChess[chessNum][0];
aboveY = brData.blackRedChess[chessNum][1];
if (er.eat(brData.blackRedChess[num][0],brData.blackRedChess[num][1],brData,chessNum)){
brData.blackRedChess[num][0] = -100;
brData.blackRedChess[num][1] = -100;
if (general.isGeneral(isBlackOrRed,brData.blackRedChess)){
System.out.println("红棋将会送将!");
brData.blackRedChess[num][0] = brData.blackRedChess[chessNum][0];
brData.blackRedChess[num][1] = brData.blackRedChess[chessNum][1];
brData.blackRedChess[chessNum][0] = aboveX;
brData.blackRedChess[chessNum][1] = aboveY;
}else{
isBlackOrRed = false;
isSelectChess = false;
}
}
if (general.isGeneral(isBlackOrRed,brData.blackRedChess)){
if (general.isKillGen(isBlackOrRed,brData.blackRedChess)){
button[1][0] = 250;
button[1][1] = 350;
winner.setText("绝杀!红棋获胜!");
}else{
System.out.println("将军");
}
}
}
}
}else {
if (!isSelectChess){ //没有选中棋子
if (num >= 16){
chessNum = num;
isSelectChess = true;
}else{
System.out.println("该黑棋落子");
}
}else { //已选中棋子
if (num >= 16){
chessNum = num;
}else{
aboveX = brData.blackRedChess[chessNum][0];
aboveY = brData.blackRedChess[chessNum][1];
if (er.eat(brData.blackRedChess[num][0],brData.blackRedChess[num][1],brData,chessNum)){
brData.blackRedChess[num][0] = -200;
brData.blackRedChess[num][1] = -200;
if (general.isGeneral(isBlackOrRed,brData.blackRedChess)){
System.out.println("黑棋将会送将!");
brData.blackRedChess[num][0] = brData.blackRedChess[chessNum][0];
brData.blackRedChess[num][1] = brData.blackRedChess[chessNum][1];
brData.blackRedChess[chessNum][0] = aboveX;
brData.blackRedChess[chessNum][1] = aboveY;
}else{
isBlackOrRed = true;
isSelectChess = false;
}
}
if (general.isGeneral(isBlackOrRed,brData.blackRedChess)){
if (general.isKillGen(isBlackOrRed,brData.blackRedChess)){
button[1][0] = 250;
button[1][1] = 350;
winner.setText("绝杀!黑棋获胜!");
}else{
System.out.println("将军");
}
}
}
}
}
repaint();
}
});
}
}
11.在选中棋子的情况下移动棋子,并对将军和绝杀情况做出判定
private void selectRoute(){ //点击选择移动的位置
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 10; j++) {
int x = i,y = j;
brl.route[i][j].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (isSelectChess) {
int X = 54 + x * 89;
int Y = 40 + y * 88;
aboveX = brData.blackRedChess[chessNum][0];
aboveY = brData.blackRedChess[chessNum][1];
switch (chessNum){
case 0:
case 16:
if (mr.shuaiMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
case 1:
case 2:
case 17:
case 18:
case 9:
case 10:
case 25:
case 26:
if (mr.juMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 27:
case 28:
case 29:
case 30:
case 31:
if (mr.zuMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
case 3:
case 4:
case 19:
case 20:
if (mr.maMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
case 5:
case 6:
case 21:
case 22:
if(mr.xiangMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
case 7:
case 8:
case 23:
case 24:
if (mr.shiMove(X,Y,brData,chessNum)){
isBlackOrRed = !isBlackOrRed;
}
break;
}
if (general.isGeneral(isBlackOrRed,brData.blackRedChess)){
if (general.isKillGen(isBlackOrRed,brData.blackRedChess)){
button[1][0] = 250;
button[1][1] = 350;
if (!isBlackOrRed){
winner.setText("绝杀!红棋获胜!");
}else{
winner.setText("绝杀!黑棋获胜!");
}
}else{
System.out.println("将军!-----------------------------------------------------");
}
}
if (general.isGeneral(!isBlackOrRed,brData.blackRedChess)){
brData.blackRedChess[chessNum][0] = aboveX;
brData.blackRedChess[chessNum][1] = aboveY;
System.out.println("将会送将!");
isBlackOrRed = !isBlackOrRed;
}else{
isSelectChess = false;
}
repaint();
}
}
});
}
}
}
12.添加认输,再来一局等按钮的鼠标监听事件
private void selectStart(){
jButton[0].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
button[1][0] = 300;
button[1][1] = 350;
winner.setFont(new java.awt.Font("华文行楷",0,65));
if (!isBlackOrRed){
winner.setText("红棋获胜!");
}else{
winner.setText("黑棋获胜!");
}
}
});
jButton[1].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
button[1][0] = 250;
button[1][1] = 350;
button[2][0] = 300;
button[3][0] = 460;
button[2][1] = button[3][1] = 550;
winner.setFont(new java.awt.Font("华文行楷",0,50));
winner.setText("对方邀请您再来一局!");
}
});
jButton[2].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.exit(0);
}
});
jButton[3].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
for (int i = 0; i < 32; i++) {
brData.blackRedChess[i][0] = aaa[i][0];
brData.blackRedChess[i][1] = aaa[i][1];
}
for (int i = 1; i < 4; i++) {
for (int j = 0; j < 2; j++) {
button[i][j] = -200;
}
}
isSelectChess = false;
isBlackOrRed = true;
}
});
repaint();
}
}
});
jButton[2].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
System.exit(0);
}
});
jButton[3].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
for (int i = 0; i < 32; i++) {
brData.blackRedChess[i][0] = aaa[i][0];
brData.blackRedChess[i][1] = aaa[i][1];
}
for (int i = 1; i < 4; i++) {
for (int j = 0; j < 2; j++) {
button[i][j] = -200;
}
}
isSelectChess = false;
isBlackOrRed = true;
}
});
repaint();
}