前言

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

一、设计 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;}

其中r1,c1,r2,c2r1,c1,r2,c2r1,c1,r2,c2分别为开始位置的行列数和点击位置的行列数,返回的numbnumbnumb为直线上的棋子数。

二、设计 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;}

代码里的注释很详细,很容易就可以看懂。
输入的参数whowhowho即选中的棋子的编号,返回值ifflagifflagifflag用来判断是否可以移动,如果返回值为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();}}}}}

在移动的判断上添加 ifwalk()ifwalk()ifwalk() 方法判断是否可以移动即可。

后记

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

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

java实现中国象棋3:走棋规则的实现相关推荐

  1. java中国象棋兵吃棋规则_中国象棋吃子的规则

    中国象棋吃子的规则 在中国喜欢玩象棋的朋友有很多,那么对于新手来说,可能还不知道象棋如何吃子,现在小编向大家讲解一下象棋的吃子. 中国象棋吃子的规则 先从攻击力最强的棋子:车,开始讲解,车的走棋规则是 ...

  2. java实现中国象棋 源代码

    java实现中国象棋 在网上找了很久中国象棋实现的源代码,终于找到了,下面就是源代码. /**中国象棋Java版V3.0*源文件:Chess.java*添加功能:实现了当前棋局的保存*/import ...

  3. java中国象棋网络对弈_基于JAVA的中国象棋对弈系统(附答辩记录)

    基于JAVA的中国象棋对弈系统(附答辩记录)(包含选题审批表,任务书,开题报告,中期报告,毕业论文7100字,程序) 摘  要:本毕业设计采用Java实现中国象棋对弈,可以由两个玩家操作来进行.其图形 ...

  4. 教你怎么用Python和Qt5编写中国象棋AI版——规则模块

    提示:该模块用于实现规则模块 教你怎么用Python和Qt5编写中国象棋AI版--规则模块 前言 一.中国象棋大致规则? 二.各棋子规则实现思路 1.兵 注意事项 过河兵合法偏移 未过河兵合法偏移 2 ...

  5. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

  6. Java实现中国象棋(联机版)

    Java实现中国象棋(联机版) 该版本的中国象棋,程序有点复杂,是基于网络通信的基础上实现的.由于代码带太长,我这里就只做简单的演示,下面会给出链接地址的. 一.程序结构: 客户端: 服务端: 二.操 ...

  7. java实现中国象棋1:界面的制作

    java实现中国象棋1:界面的制作 前言 界面思路 棋盘 棋子 按钮和Logo 前言 中国象棋的界面主要有三个部分:棋盘,棋子和按钮.棋盘在网上可以找到许多相关的图片,但是棋子和按钮就找不到,或者找到 ...

  8. java实现中国象棋2:移动棋子

    java实现中国象棋2:移动棋子 我在"java实现中国象棋1"的博客中说了一下如何把棋子画在棋盘上,使用一个flagflagflag二维数组即可实现.因此如果我们想让棋子移动,只 ...

  9. 基于java的中国象棋的设计与实现

    技术:Java等 摘要: 中国象棋作为中华民族的文化瑰宝,千百年来常盛不衰,在中国有非常广泛的大众基础,在社会上有广泛的认同,它不仅是人们茶余饭后消遣娱乐的工具,其本身更是具有严密的逻辑和教育功能.随 ...

  10. 基于Java的中国象棋游戏的设计与实现

    技术:Java等 摘要: 近些年,Java技术日趋成熟,它的跨平台性,健壮性以及使用人数的增多都表明了它的受欢迎程度不断攀升,因此选用了Java语言作为中国象棋游戏的开发语言.并且中国象棋文化源远流长 ...

最新文章

  1. 面向云原生的混沌工程工具-ChaosBlade
  2. php tp3 操作绑定到类,操作绑定到类 · ThinkPHP3.2.3完全开发手册 · 看云
  3. python函数进阶小结_python之函数进阶
  4. java memcached incr_Memcached incr/decr 命令
  5. 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。
  6. 小甲鱼python课后题简书_MOOC_Python语言程序设计(嵩天)课后练习_第二周
  7. 路径的形式不合法解决方案
  8. 极客大学架构师训练营 微服务网关 领域驱动设计 DDD OAuth 2.0 中台架构 第20课 听课总结
  9. ipop映射到ftp服务器,设备作为FTP客户端进行文件传输-IPOP
  10. 最小二乘法计算平面度
  11. 微信群聊在哪个服务器,微信怎么找附近的群聊?微信群不见了怎么找?
  12. 微信小程序开发--uniapp
  13. flash 旋转效果
  14. 对token(令牌)的理解
  15. 【python学习笔记】关于python Flask前后端分离跨域问题
  16. Dsolve PDE基础
  17. PAT A1065 A+B and C (64bit) ——斜风细雨不须归
  18. 大萧条:反思1929
  19. java怎么把背景设成纯透明,怎么把BufferedImage设置背景为透明
  20. window10如何开启telnet

热门文章

  1. Android圆角ImageView的几种实现方式(包含四个角的分别设置)
  2. DDD的哲学意味(上)
  3. 3.5寸TFT液晶屏验证板设计过程——硬件篇
  4. Java 求解加油站
  5. (三十八)论文阅读 | 目标检测之CPN
  6. 【译】Scheduling Tasks
  7. 深度学习:透过神经网络的内在灵魂与柏拉图的哲学理念 输入数字反向的产生数字图像
  8. 〖Python自动化办公篇㉑〗- python实现邮件自动化 - 定时发送邮件
  9. Combining Label Propagation and Simple Models Out-performs Graph Neural Networks 论文理解
  10. css 背景重复渐变_CSS3重复渐变[CSS3提示]