代码的结构挺好,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;}}

ChessMan.java

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

分享网上找到的一个中国象棋源码相关推荐

  1. C++基础升华:编写的中国象棋源码

    VC++编写的中国象棋源码,支持悔棋功能,而且我觉得这象棋的智商相当高,玩了下竟然每次都输,可能我象棋水平太菜.本游戏源代码开源,在VC6.0下可顺利编译,游戏可选择难易程序,运行界面也挺友好. 项目 ...

  2. VC++源码分析 - 中国象棋源码分析

    下载自 http://www.newxing.com/Code/VC/game/1750.html 运行界面如下: 看下类图: 资源: 主对话框: 源码说明: 本人机对弈程序采用了多种搜索算法.以下是 ...

  3. 中国象棋源码c语言,中国象棋C语言源代码.doc

    中国象棋C语言源代码 *chess.c*/ #include "dos.h" #include "stdio.h" /**/ #define RED 7 #de ...

  4. 朋友写的一个中国象棋游戏,JAVA代码

    朋友写的一个中国象棋游戏,JAVA代码.有兴趣的可以这里下载:中国象棋下载 (1)地址,不知现在还能下否....中国象棋历史悠久,吸引了无数的人研究,现对中国象棋的对战和实现棋谱的制作做如下的设计和说 ...

  5. 设计一个中国象棋游戏,ChessPiece为抽象类,提供代表一个棋子位置的属性和方法,和isMoveLegal();设计ChessPiece的具体实现类(如车,马,帅等)

    设计一个中国象棋游戏,ChessPiece为抽象类,提供代表一个棋子位置的属性和方法,和isMoveLegal():设计ChessPiece的具体实现类(如车,马,帅等),这些类能够根据自身特点实现不 ...

  6. 分享一个电影网站源码。自动抓取

    分享一个电影网站源码.下面是演示地址,可能UI方面有些不同. www.qwdianying.top 下载地址:https://pan.baidu.com/s/1VU16AkklpCZ-tiPCAZ51 ...

  7. 创建一个中国象棋的阿法狗——阿法象(0)

    创建一个中国象棋的阿法狗--阿法象(0) 最近,阿法狗与李世石九段的人机大战深受关注.我就借着这股东风来写一个系列博客--<创建一个中国象棋的阿法狗--阿法象>. 早在几年前,就在一本书上 ...

  8. 如何用Python画一个中国象棋棋盘?

    今天试着画了一个中国象棋棋盘! #绘制象棋盘 import turtle      t=turtle.Pen() t.speed(100) def angle(x,y):     t.penup() ...

  9. android中国象棋游戏源码,经典的android 象棋源码,象棋规则完整。

    [实例简介] 经典的android 象棋源码,实现简单的人机对战,机器端算法简单,但象棋规则值得学习. [实例截图] [核心代码] Chess └── Chess ├── AndroidManifes ...

最新文章

  1. java 字符串乱码_这份Java面试题含答案解析竟然真的让你不用在面试上“如履薄冰”...
  2. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题
  3. golang 线程 Java线程_Golang 学习笔记(06)—— 多线程
  4. 列表_月隐学python第6课
  5. wince 6.0 pb
  6. Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片
  7. django -- 联合索引
  8. 1.java-谈谈接口
  9. linux下设置set位权限,网络安全系列之四十 在Linux中设置SET位权限
  10. apollo源码分析 感知_Scikit-Learn 源码研读 (第一期)项目结构介绍
  11. 简单爬虫爬取知乎日报并保存日报网页到本地
  12. 英文视频字幕自动生成
  13. raw格式怎么打开转换成jpg?迅捷图片转换器3步搞定
  14. 360wifi使用方法|360wifi使用教程
  15. 【电力电子技术DC-AC】三相SPWM逆变器Simulink仿真(设置死区时间)
  16. 获取当前位置的经度纬度
  17. word2vec的应用:gensim相似度检测(附代码)
  18. apk 进行系统签名
  19. 从懵懂娃娃到社会行业大佬,这中间经历的过程的概括性思考
  20. pwm控制电机转速原理浅析

热门文章

  1. 程序员容易读错的IT专业术语词典
  2. 黑苹果2k显示器开启hidpi_黑苹果MAC系统1080P显示模糊问题处理
  3. 【论文阅读】Learning with Hypergraphs: Clustering, Classification, and Embedding
  4. centos服务器操作命令
  5. 【驾驶技巧】 汽车驾驶经验交流——倒车技巧
  6. 互联网时代内容分发四宗罪
  7. steam搬砖项目,月利润9000+
  8. vue-directive 自定义指令实现popover气泡弹窗
  9. 计算机导论期末考试知识点,计算机导论期末复习(知识点).doc
  10. 题解:最长回文子串(4种解法)