文章目录

  • 01 - 象棋规则
  • 02 - 棋子移动规则
  • 03 - 車能否移动
  • 04 - 炮能否移动
  • 05 - 士能否移动
  • 06 - 总结

01 - 象棋规则

  经过两篇前面棋盘和棋子绘制,象棋框架基本成型,紧接着要实现象棋走棋规则,让象棋游戏真正能“动起来”。
  象棋规则中:马走日,象走田;,车走直,炮隔一, 士走斜,将不出田;,兵去不还。这是象棋棋子行走规则的基本规则,下面看看详细分析象棋移动步骤。

02 - 棋子移动规则

  根据象棋规则制定棋子移动规则,简而言之就是通过代码判断选中棋子能不能移动?如果能移动,那么该棋子就把它所在QLabel绘画到目标坐标,否则不能绘画,这就是移动棋子的基本思路,具体实现方法在后面讲解。现在先看下有哪些相关方法。

 //-----------  判断各种类型棋子能不能移动 ------------//bool canMove(     int moveID, int killID, int x, int y);bool canMoveSHI(  int moveID, int killID, int x, int y);bool canMoveBING( int moveID, int killID, int x, int y);bool canMoveXIANG(int moveID, int killID, int x, int y);bool canMoveMA(   int moveID, int killID, int x, int y);bool canMoveCHE(  int moveID, int killID, int x, int y);bool canMovePAO(  int moveID, int killID, int x, int y);bool canMoveJIANG(int moveID, int killID, int x, int y);void getPicName();                   // 获取棋子图片名字bool existChess(int x, int y);       // 判断坐标上有没有棋子int  getChessID(int x, int y);       // 获取棋子的IDvoid showDeadChess(int  chessID);    // 显示阵亡棋子数目// 计算即将行走的棋子与某一坐标之间有几颗棋子int middleChessNum(int moveID, int x, int y);// 判断两个棋子是否同一方bool sameColor(int firstChessID, int secondChessID);// 棋子移动函数void moveChess(int moveID, int killID, int x, int y);

  在上诉方法中,首先实现两个与棋子移动规则密切相关的方法:判断坐标上有无棋子(existChess)和 计算两两棋子间有几个棋子(middleChessNum)。

/***  @brief : 判断该位置是否有棋子*  @param : x : x轴坐标  y : y轴坐标*  @return: 有 : true, 无 : false**/
bool ChessArea::existChess(int x, int y)
{for(int i=0;i<32;i++){if(myChess[i].row==x && myChess[i].col==y&&!myChess[i].isDead){return true;}}return false;
}

/***  @brief : 计算即将行走的棋子与某一坐标之间有几颗棋子*  @param : moveID : 即将行走棋子ID*           x      : x轴坐标*           y      : y轴坐标*  @return: 棋子与该坐标之间棋子数量**/
int ChessArea::middleChessNum(int moveID, int x, int y)
{int i;int sum = 0; //记录中间有几颗棋子if(myChess[moveID].row == x) {if(y-myChess[moveID].col > 0){   //计算下列for(i=myChess[moveID].col+1; i<y; i++) {if(existChess(myChess[moveID].row, i) == true)sum++;    //记录中间有几颗棋子}}else /* 计算上列 */{for(i=myChess[moveID].col-1; i>y; i--) {if(existChess(myChess[moveID].row,i)==true)sum++;}}return sum;} else if(myChess[moveID].col == y) {if(x - myChess[moveID].row > 0) {for(i=myChess[moveID].row+1; i<x; i++) {if(existChess(i, myChess[moveID].col)==true)sum++;}} else {for(i=myChess[moveID].row-1; i>x; i--) {if(existChess(i, myChess[moveID].col)==true)sum++;}}return sum;}//两个棋子不在一条直线上return -1;
}

  middleChessNum方法实现依赖existChess函数,existChess函数实现就是检查一遍输入参数的横纵坐标和棋子的横纵坐标是否相同。middleChessNum方法调用existChess方法,计算在同一直线移动前和移动后的横纵坐标差值,再根据差值检测该位置上面是否存在棋子,如果存在棋子那么sum就自加,如果没有,那么两个棋子就不在同一根直线,则返回-1。

03 - 車能否移动

  車走直:車能否移动,需要判断目标坐标与其坐标是否存在棋子,middleChessNum方法已经帮它实现该功能,所以車能否移动方法实现起来比较简单。

/****  @brief : 判断車是否可以移动*  @param : moveID : 移动棋子ID*           killID : 目标棋子ID (如果无棋子,默认-1)*           x      : x轴坐标*           y      : y轴坐标*  @return: 可以走 : true, 不可以走 : false***/
bool ChessArea::canMoveCHE(int moveID, int killID, int x, int y)
{if(killID > 31)return false;if(middleChessNum(moveID, x, y) == 0)return true;return false;
}

04 - 炮能否移动

  炮隔一:炮移动规则和車相似,能沿着直线走,但炮和車唯一的不同是炮需要隔着一个棋子才能吃棋子。

/****  @brief : 判断炮是否可以移动*  @param : moveID : 移动棋子ID*           killID : 目标棋子ID (如果无棋子,默认-1)*           x      : x轴坐标*           y      : y轴坐标*  @return: 可以走 : true, 不可以走 : false***/
bool ChessArea::canMovePAO(int moveID, int killID, int x, int y)
{if(middleChessNum(moveID, x, y)==0 && killID == -1)return true;if(middleChessNum(moveID,x, y)==1 && killID != -1)return true;return false;
}

05 - 士能否移动

  士走斜:士沿着对角线斜着走,代码实现思路是:士移动前后的横坐标差的绝对值和纵坐标差的绝对值都为1,否则士不能移动。

/****  @brief : 判断士是否可以移动*  @param : moveID : 移动棋子ID*           killID : 目标棋子ID (如果无棋子,默认-1)*           x      : x轴坐标*           y      : y轴坐标*  @return: 可以走 : true, 不可以走 : false***/
bool ChessArea::canMoveSHI(int moveID, int killID, int x, int y)
{if(killID > 31)return false;//判断士行走是否超出米字格范围if(myChess[moveID].isRed){if(y<7 || x<3 || x>5) return false;}else {if(y>2 || x<3 || x>5) return false;}//判断是否为沿着对角线斜着行走int dx = myChess[moveID].row - x;int dy = myChess[moveID].col - y;/** 要想让士沿着对角线斜着走,就是* 想让移动前后的横坐标差的绝对* 值和纵坐标差的绝对值都为1,* 横纵各移动一个单位长度。**/if(abs(dx)==1 && abs(dy)==1)return true;return false;
}

06 - 总结

  代码实现象棋走棋规则主要是判断象棋棋子能否移动,根据棋子属性类提供的棋子坐标与鼠标点击事件获取的目标坐标走棋规则处理,可以判断出各种棋子能否移动,值得注意的是代码实现过程中注意功能分块,下章继续实现其他棋子走棋规则。

  • 01_开发象棋游戏简介
  • 02_绘画象棋棋盘
  • 03_象棋棋子摆放
  • 04_象棋走棋规则——車、炮、士
  • 05_象棋走棋规则——象、马、将、兵
  • 06_象棋游戏法则
  • 07_人机博弈算法开端
  • 08_人机博弈高阶算法

【Qt象棋游戏】04_象棋走棋规则——車、炮、士相关推荐

  1. QT小游戏——中国象棋

    QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...

  2. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

  3. HTML5中国象棋游戏(自定义象棋难度)源码下载

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...

  4. 【Qt象棋游戏】03_象棋棋子摆放

    文章目录 01 - 加载棋子UI资源 02 - 添加棋子属性类 03 - 添加棋子标签 04 - 效果 05 - 总结 棋子图片百度云链接: 01 - 加载棋子UI资源   添加制作好的棋子UI图片到 ...

  5. 【Qt象棋游戏】02_绘画象棋棋盘

    文章目录 01 - 相关成员与方法 02 - 棋盘颜色 03 - 绘画棋盘线 04 - 添加"井"字格 05 - 总结 01 - 相关成员与方法   进行代码编写之前,在chess ...

  6. 【Qt象棋游戏】06_象棋游戏法则

    文章目录 01 - 象棋游戏规则 02 - 鼠标移动事件 03 - 鼠标点击事件 04 - 总结 01 - 象棋游戏规则   实现上两章节的棋子走棋规则后,开始思考象棋游戏规则,比如轮到谁走,怎么判断 ...

  7. 【Qt象棋游戏】08_人机博弈高阶算法

    文章目录 01 - 极大极小值算法 02 - 电脑和人类所有走棋路径 03 - 走一步看两步 04 - 走一步看多步 04 - 总结 01 - 极大极小值算法   上一期博客介绍了最为简单的人机博弈算 ...

  8. 【Qt象棋游戏】07_人机博弈算法开端

    文章目录 01 - 人机博弈算法简述 02 - 相关成员与方法 03 - 获取电脑棋子能走路径 04 - 电脑走棋 05 - 总结 01 - 人机博弈算法简述   前面详细介绍了棋盘类的封装.棋子类的 ...

  9. 中国象棋游戏Chess(3) - 实现走棋规则

    棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...

最新文章

  1. while loading shared libraries: libmysqlclient....
  2. BrainNet:用于人与人之间直接协作的多人脑对脑接口
  3. ArcGis辅助编号(半自动)功能的插件式实现
  4. SpringBoot连接Mysql数据库遇到Unable to load authentication plugin ‘caching_sha2_password解决方案
  5. android mvp模式例子_关于Android市场这件事,没有饱和的市场只有饱和的思维
  6. c++ 时间序列工具包_我的时间序列工具包
  7. python做的数据图表怎么在flask中显示_Python:如何在Flask应用程序的表中显示MySQL查询的数据...
  8. SQLite: 取某年份的数据
  9. 声音鉴定-趣味测试-源码
  10. Python 音频文件批量切割
  11. 如何使用工具切换设备ip 电脑和手机怎么如何换ip?
  12. word删除空白页的方法和技巧详细介绍,提高工作效率!!!!!!!!!!!!
  13. (四)52周存钱挑战 1.0
  14. 小程序 开发版 上传大小受限制
  15. Python 最常见的 170 道面试题解析:2019 最新
  16. 电脑如何设置uefi启动 电脑设置uefi启动方法
  17. 关于create-react-app搭建react环境并修改端口号
  18. Qt:创建文件夹QDir
  19. 2017年9月10日训练日记
  20. AlexNet模型思想详解及核心代码实现

热门文章

  1. 微信支付 API V3 JSAPI支付 JAVA下载账单
  2. iExplorer for Mac注册版
  3. 在政策推动及需求拉动下,我国充电桩行业发展现状及前景分析
  4. 速报|StarRocks亮相云栖大会,携手阿里云EMR 打造极速数据湖分析新体验
  5. 不创新一心搞新业务 外媒:这还是那个苹果吗?
  6. Glide源码阅读之模板模式2
  7. maya找回丢失的材质
  8. 傲腾增强型固态导致蓝屏 - 解决方案
  9. chrome插件开发入门教程
  10. 关于oracle linux系统内网打补丁