java实现中国象棋3:走棋规则的实现

news/2024/11/7 21:35:03/

前言

之前我们已经实现了棋子的移动,但是可以发现棋子可以任意移动,不遵循中国象棋的规则,这篇博客便是为了实现中国象棋的走棋规则。在这里默认大家都已经知道中国象棋走棋的规则,如果不知道请自行百度学习。

一、设计 findnumb() 方法

此方法用来找出开始位置和点击位置在一条直线上时中间的棋子数目,用来判断炮和车(車)是否可以移动。代码如下:

	// 找到某一起点到终点中含有的棋子数public int findnumb(int r1, int c1, int r2, int c2) {int numb = 0;if (r1 == r2) {for (int i = Math.min(c1, c2) + 1; i < Math.max(c1, c2); i++) {if (flag[r1][i] > 0) {numb++;}}} else if (c1 == c2) {for (int i = Math.min(r1, r2) + 1; i < Math.max(r1, r2); i++) {if (flag[i][c1] > 0) {numb++;}}}return numb;}

其中 r 1 , c 1 , r 2 , c 2 r1,c1,r2,c2 r1,c1,r2,c2分别为开始位置的行列数和点击位置的行列数,返回的 n u m b numb numb为直线上的棋子数。

二、设计 ifwalk() 方法

ifwalk() 方法判断选中的棋子是否可以移动到现在选择的位置,根据中国象棋的走棋规则,可以很容易地写出以下代码。

	public int ifwalk(int who) {int ifflag = 0;// 将的走法if (who == 5) {if (r < 3 & c < 6 & c > 2) {if (beforechess[0] == curchess[0] & Math.abs(beforechess[1] - curchess[1]) == 1| beforechess[1] == curchess[1] & Math.abs(beforechess[0] - curchess[0]) == 1) {ifflag = 1;}}}// 帅的走法else if (who == 55) {if (r > 6 & c < 6 & c > 2) {if (beforechess[0] == curchess[0] & Math.abs(beforechess[1] - curchess[1]) == 1| beforechess[1] == curchess[1] & Math.abs(beforechess[0] - curchess[0]) == 1) {ifflag = 1;}}}// 車的走法else if (who == 1 | who == 11) {if (beforechess[0] == curchess[0] | beforechess[1] == curchess[1]) {if (findnumb(beforechess[0], beforechess[1], curchess[0], curchess[1]) == 0) {ifflag = 1;}}}// 马的走法else if (who == 2 | who == 22) {if(beforechess[0] > 0) {if (beforechess[0] - curchess[0] == 2 & Math.abs(beforechess[1] - curchess[1]) == 1& flag[beforechess[0] - 1][beforechess[1]] == 0) {ifflag = 1;// 向上走日}}if(beforechess[0] < 9) {if (beforechess[0] - curchess[0] == -2 & Math.abs(beforechess[1] - curchess[1]) == 1& flag[beforechess[0] + 1][beforechess[1]] == 0) {ifflag = 1;// 向下走日}}if(beforechess[1] < 8) {if (beforechess[1] - curchess[1] == -2 & Math.abs(beforechess[0] - curchess[0]) == 1& flag[beforechess[0]][beforechess[1] + 1] == 0) {ifflag = 1;// 向右走日}}if(beforechess[1] > 0) {if (beforechess[1] - curchess[1] == 2 & Math.abs(beforechess[0] - curchess[0]) == 1& flag[beforechess[0]][beforechess[1] - 1] == 0) {ifflag = 1;// 向左走日}}}// 象的走法else if (who == 3 | who == 33) {if(beforechess[0] > 0&beforechess[1] > 0) {if (beforechess[0] - curchess[0] == 2 & beforechess[1] - curchess[1] == 2& flag[beforechess[0] - 1][beforechess[1] - 1] == 0) {ifflag = 1;// 向左上角走田}}if(beforechess[0] < 9&beforechess[1]  > 0) {if (beforechess[0] - curchess[0] == -2 & beforechess[1] - curchess[1] == 2& flag[beforechess[0] + 1][beforechess[1] - 1] == 0) {ifflag = 1;// 向左下角走田}}if(beforechess[0] > 0&beforechess[1] < 8) {if (beforechess[0] - curchess[0] == 2 & beforechess[1] - curchess[1] == -2& flag[beforechess[0] - 1][beforechess[1] + 1] == 0) {ifflag = 1;// 向右上角走田}}if(beforechess[0] < 9&beforechess[1] < 8) {if (beforechess[0] - curchess[0] == -2 & beforechess[1] - curchess[1] == -2& flag[beforechess[0] + 1][beforechess[1] + 1] == 0) {ifflag = 1;// 向右下角走田}}}// 士的走法else if (who == 4) {if (r < 3 & c < 6 & c > 2) {if(Math.abs(beforechess[1] - curchess[1])==1 & Math.abs(beforechess[0] - curchess[0])==1) {ifflag = 1;}}}// 仕的走法else if(who == 44) {if (r > 6 & c < 6 & c > 2) {if(Math.abs(beforechess[1] - curchess[1])==1 & Math.abs(beforechess[0] - curchess[0])==1) {ifflag = 1;}}}// 炮的走法else if(who == 6|who == 66) {if (beforechess[0] == curchess[0] | beforechess[1] == curchess[1]) {if (findnumb(beforechess[0], beforechess[1], curchess[0], curchess[1]) == 1&curchess[2]!=0|findnumb(beforechess[0], beforechess[1], curchess[0], curchess[1]) == 0&curchess[2]==0) {ifflag = 1;}}}// 卒的走法else if(who == 7) {if(beforechess[0]<5&beforechess[1]==curchess[1]&beforechess[0]-curchess[0]==-1|beforechess[0]>4&beforechess[1]==curchess[1]&beforechess[0]-curchess[0]==-1|beforechess[0]>4&beforechess[0]==curchess[0]&Math.abs(beforechess[1]-curchess[1])==1) {ifflag = 1;	}}// 兵的走法else if(who == 77) {if(beforechess[0]>4&beforechess[1]==curchess[1]&beforechess[0]-curchess[0]==1|beforechess[0]<5&beforechess[1]==curchess[1]&beforechess[0]-curchess[0]==1|beforechess[0]<5&beforechess[0]==curchess[0]&Math.abs(beforechess[1]-curchess[1])==1) {ifflag = 1;	}}System.out.println("ifflag="+ifflag);return ifflag;}

代码里的注释很详细,很容易就可以看懂。
输入的参数 w h o who who即选中的棋子的编号,返回值 i f f l a g ifflag ifflag用来判断是否可以移动,如果返回值为1,则可以移动;返回值为0,则不可以移动。

三、修改 mouseClicked() 方法

整个棋子移动的核心就在此方法上,因之前没有考虑到移动规则,所以现在需要进行改动来使用之前写好的方法。改动后的代码如下

	public void mouseClicked(MouseEvent e) {System.out.println("点击");x1 = e.getX();y1 = e.getY();if (x1 > init.x0 - init.size / 2 && y1 > init.y0 - init.size / 2&& x1 < init.x0 + init.size / 2 + init.column * init.size&& y1 < init.y0 + init.row * init.size + init.size / 2) {x2 = ((x1 - init.x0 + init.size / 2) / init.size) * init.size + init.x0;y2 = ((y1 - init.y0 + init.size / 2) / init.size) * init.size + init.y0;// 当前点击的位置getcr();// 获得此时点击处的位置System.out.println("grtcr"+flag[r][c]);rebec();// 更新前一颗棋子ui.repaint();recurchess();if (r != -1) {if (curchess[2] == 0 & chessflag == 1 & beforechess[2] > 10 & ifwalk(beforechess[2]) == 1| curchess[2] == 0 & chessflag == 2 & beforechess[2] < 10 & ifwalk(beforechess[2]) == 1) {// 如果此时点的地方没有棋子,直接替换System.out.println("走空位");walk();} else if (beforechess[2] > 10 & curchess[2] < 10 & chessflag == 1 & flag[r][c] < 10& ifwalk(beforechess[2]) == 1) {if (curchess[2] != 0) {// 如果手中有棋子System.out.println("红棋吃黑棋");walk();}} else if (beforechess[2] < 10 & curchess[2] > 10 & beforechess[2] > 0 & chessflag == 2& flag[r][c] > 10 & ifwalk(beforechess[2]) == 1) {if (curchess[2] != 0) {// 如果手中有棋子System.out.println("黑棋吃红棋");walk();}}}}}

在移动的判断上添加 i f w a l k ( ) ifwalk() ifwalk() 方法判断是否可以移动即可。

后记

现在我们实现了遵循规则地移动棋子,下一篇博客将会实现悔棋的功能,敬请期待。

关注微信公众号:图灵完备,回复中国象棋即可获得图片及代码资源。


http://www.ppmy.cn/news/430075.html

相关文章

Java课程设计—中国象棋(源代码及视频)

你好&#xff0c;我是罡罡同学&#xff01; 代码谱第一页忘掉心上人&#xff0c;最后一页。。。。。。 打赏一点钱&#xff0c;帮我买包辣条&#xff0c;继续创作&#xff0c;谢谢大家&#xff01; 大家关注微信公众号 罡罡同学 回复中国象棋 就可以免费获得压缩包啦&#xf…

阿尔法贝塔剪枝——中国象棋人机对战

alpha-beta剪枝算法实现中国象棋人机对战 Github仓库&#xff1a;https://github.com/dick20/Artificial-Intelligence 问题介绍 本实验要求编写一个中国象棋博弈程序&#xff0c;使用alpha-beta剪枝算法&#xff0c;实现人机对弈。因为是人机博弈&#xff0c;因此我们需要使…

【C++】C++下的简易中国象棋

参考自Originum学长的博客&#xff0c;个人进行了一些小修改&#xff0c; 原博客地址&#xff1a;https://blog.csdn.net/Originum/article/details/80356452 联系邮箱&#xff1a;Originum126.com 本人博客地址&#xff1a;Megalomania 一个简单的中国象棋游戏&#xff0c;主要…

matlab识别中国象棋棋盘,一种基于图像处理的中国象棋识别系统及方法与流程

本发明涉及计算机图像识别技术,具体涉及一种基于图像处理的中国象棋识别系统及方法。 背景技术: 数字图像处理技术在机器感知领域应用十分广泛,主要目标是通过一些图像处理技术从图像中提取信息,该信息类似于人们采用语言和文字解释图像内容的过程,使用图像处理技术的典型…

中国象棋-单机游戏-微信小程序的项目开发流程详解

关于此文章能看懂的条件&#xff1a;对使用微信开发工具熟悉一点即可 在微信开发工具中&#xff0c;用小程序方式新建或打卡项目&#xff0c; 注意&#xff1a;如果是下载来的项目&#xff0c;解压后&#xff0c;要选小程序打开&#xff0c;选错是打不开的哦~ 如图 项目源代码…

软件测试 因果+决策案例--中国象棋中走马

软件测试 因果决策案例–中国象棋中走马 题目&#xff1a; 因果决策案例 中国象棋中走马的实际情况&#xff1a; 1&#xff0e;如果落点在棋盘外&#xff0c;则不移动棋子&#xff1b; 2&#xff0e;如果落点与起点不构成日字型&#xff0c;则不移动棋子&#xff1b; 3&am…

中国象棋(react hooks版)

文章目录 前言功能展示新增模块功能搭建项目框架配置React Router配置React Store配置i18n配置主题色React动画React ColorPicker打谱记录单元测试 核心功能优化落子音效dom解耦小结 结语 前言 它终于来了。终于来了&#xff0c;在第一版的基础上&#xff0c;历时近两个月终于…

中国象棋博弈

文章目录 棋盘表示着法生成搜索算法最小值-最大值搜索搜索alpha-beta剪枝优化 棋局评估棋子子力棋子位置 棋盘UI不足参考文献 棋盘表示 中国象棋的棋盘为10*9的矩形&#xff0c;一般采用10*9的二维数组来表示。 chessBoard: [["BR1","BN1","BB1&quo…