java 明棋妙重新循环_Java实现中国象棋(人机对战)

目录

简介

成品视频

实现思路

界面实现分为了三块

棋盘抽象类

按钮组抽象类

棋子绘制接口

棋盘界面实现

棋子的实现

按钮组的实现

监听工厂和监听类

棋盘绘制类的实现

开始游戏实现

停止游戏实现

游戏抽象类

游戏实现类

可走路线和吃棋判断实现

车(ju)

兵/卒

相/象

仕/士

人机AI实现

实现思路

结尾

简介

Hello,I'm Shendi

花了五天时间用 Java 写了一个中国象棋.

拥有大概如下功能

象棋基本功能

可走路线点显示

人机对战

移动动画

我方永远是下方

成品视频

Java制作的中国象棋+简单AI

更多实战内容请进入我的实战专栏:https://blog.csdn.net/qq_41806966/category_9656338.html

点个关注吧~

需要源码点这里: https://github.com/1711680493/Application

右上角有个小星星(star),点一下~

实现思路

刚开始写的时候没想太多,想得很简单(于是最终我写了五天才写完)

如往常一样,我写桌软喜欢用两个类,一个类用于启动,一个代表窗体

于是启动类代码就如下

17a77618f8ce91e57bb15916125adabd.png

我们初始化都在构造方法中完成,初始化完成后在显示.

但是有一些东西是不能在构造方法内使用的(比如需要在类初始化完成在用的东西)

所以我格外写了一个onCreate函数,在类创建完后调用此函数

界面实现分为了三块

为了扩展,我将界面实现分为了三块

棋盘

绘制棋子

按钮组

这三大界面在 MainView 中创建初始化,并以静态的方式提供出去(因为不需要运行时改变)

通过反射+配置文件形式获取到对应的三个类(对扩展开放)

353489b57f1b301eb6fbba5a3877deea.png

窗体布局为绝对布局,设置了棋盘颜色和按钮组颜色,并给三块都进行了初始化

既然分了三块,那就需要三个接口/抽象类

棋盘抽象类

棋盘继承JPanel,所以需要是抽象类.

主要功能是绘制棋盘

代码如下

4a761c988549c221406bd848409575a2.png

按钮组抽象类

按钮组就是右边那一块,用于显示和实现功能按钮

代码如下

79c5decbbc74acd8cf5787f40643224f.png

棋子绘制接口

主要功能是绘制和保存棋子,以及开始游戏和结束游戏逻辑实现,里面包含具体游戏逻辑类

代码如下

2319b9e4c3f9bf4d810e4c04cb63e90e.png

棋盘界面实现

因为三大界面都是可扩展的,所以我只做了一套默认的

绘制其实没什么难度,棋盘如下

1c28bf2f23863d30603c6ccce1334159.png

不管背景颜色(背景颜色是设置JPanel的),具体的就是画线条

棋盘是 9*10的

有十条横线,所以可以直接循环

竖线也是,但是要在和中间停一次,下面继续绘制

中间的文字就是直接写上去的,设置一下字体,位置

代码如下

0fc7301bf1de4a8b3061c23b3e6edb5c.png

棋子的实现

棋子也容易实现

通过观察象棋,其实就是两个实心圆+一个空心圆+一个字

我做了可以自适应大小的象棋,有一段测试代码,在 ChessFactory 类里,我没有删掉,运行起来结果是这样的

0900fef02b5e00f8abfde2d125ce2bf9.png

并且改一下大小,绘制的棋子也会跟着改变大小

03b29173c9d8f425c6ea06e6e9b7d71a.png

测试的代码如下

/**

* 测试 棋子.

* @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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值