目录
简介
成品视频
实现思路
界面实现分为了三块
棋盘抽象类
按钮组抽象类
棋子绘制接口
棋盘界面实现
棋子的实现
按钮组的实现
监听工厂和监听类
棋盘绘制类的实现
开始游戏实现
停止游戏实现
游戏抽象类
游戏实现类
可走路线和吃棋判断实现
车(ju)
炮
将
马
兵/卒
相/象
仕/士
人机AI实现
实现思路
结尾
简介
Hello,I'm Shendi
花了五天时间用 Java 写了一个中国象棋.
拥有大概如下功能
象棋基本功能
可走路线点显示
人机对战
移动动画
我方永远是下方
成品视频
Java制作的中国象棋+简单AI
更多实战内容请进入我的实战专栏:https://blog.csdn.net/qq_41806966/category_9656338.html
点个关注吧~
需要源码点这里: https://github.com/1711680493/Application
右上角有个小星星(star),点一下~
实现思路
刚开始写的时候没想太多,想得很简单(于是最终我写了五天才写完)
如往常一样,我写桌软喜欢用两个类,一个类用于启动,一个代表窗体
于是启动类代码就如下
我们初始化都在构造方法中完成,初始化完成后在显示.
但是有一些东西是不能在构造方法内使用的(比如需要在类初始化完成在用的东西)
所以我格外写了一个onCreate函数,在类创建完后调用此函数
界面实现分为了三块
为了扩展,我将界面实现分为了三块
棋盘
绘制棋子
按钮组
这三大界面在 MainView 中创建初始化,并以静态的方式提供出去(因为不需要运行时改变)
通过反射+配置文件形式获取到对应的三个类(对扩展开放)
窗体布局为绝对布局,设置了棋盘颜色和按钮组颜色,并给三块都进行了初始化
既然分了三块,那就需要三个接口/抽象类
棋盘抽象类
棋盘继承JPanel,所以需要是抽象类.
主要功能是绘制棋盘
代码如下
按钮组抽象类
按钮组就是右边那一块,用于显示和实现功能按钮
代码如下
棋子绘制接口
主要功能是绘制和保存棋子,以及开始游戏和结束游戏逻辑实现,里面包含具体游戏逻辑类
代码如下
棋盘界面实现
因为三大界面都是可扩展的,所以我只做了一套默认的
绘制其实没什么难度,棋盘如下
不管背景颜色(背景颜色是设置JPanel的),具体的就是画线条
棋盘是 9*10的
有十条横线,所以可以直接循环
竖线也是,但是要在和中间停一次,下面继续绘制
中间的文字就是直接写上去的,设置一下字体,位置
代码如下
棋子的实现
棋子也容易实现
通过观察象棋,其实就是两个实心圆+一个空心圆+一个字
我做了可以自适应大小的象棋,有一段测试代码,在 ChessFactory 类里,我没有删掉,运行起来结果是这样的
并且改一下大小,绘制的棋子也会跟着改变大小
测试的代码如下
/**
* 测试 棋子.
* @author Shendi QQ
* @param args null
*/
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
JLabel chess = new JLabel();
chess.setBounds(0, 0, 200, 200);
int width = 100;
int height = 100;
BufferedImage img = new BufferedImage(200,200,BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.setColor(Color.BLACK);
g.fillRoundRect(0, 0, width, height, 180, 180);
g.setColor(Color.YELLOW);
int backgroundX = (int)(width - width * 0.9) / 2;
int backgroundWidth = (int)(width * 0.9);
int backgroundHeight = (int)(height * 0.8);
g.fillRoundRect(backgroundX, 0, backgroundWidth, backgroundHeight, 180, 180);
g.setColor(Color.RED);
g.drawRoundRect(backgroundX << 1, backgroundX, backgroundHeight, backgroundHeight - (backgroundX << 1), 180, 180);
g.setFont(new Font("仿宋", Font.BOLD, (width + height) >> 2));
g.drawString("车", width >> 2, (int)(height * 0.6));
g.dispose();
ches