文章目录

  • 01 - 象棋游戏规则
  • 02 - 鼠标移动事件
  • 03 - 鼠标点击事件
  • 04 - 总结

01 - 象棋游戏规则

  实现上两章节的棋子走棋规则后,开始思考象棋游戏规则,比如轮到谁走,怎么判断谁赢等等。
  实现轮到谁走的思路是使用Qt的信号与槽,通过发送信号和接收信号的方式通知轮到哪方下棋,具体实现如下:

//chessarea.h里面添加判断信号
signals:void redTrueGo(bool b);         // 轮到哪一方走信号//在widget构造函数上实现信号与槽(),可以看到到谁下棋
connect(chessarea, SIGNAL(redTrueGo(bool)), red,   SLOT(showRun(bool)));
connect(chessarea, SIGNAL(redTrueGo(bool)), black, SLOT(showRun(bool)));

  判断游戏是否结束,可以判断双方的将是否被吃,谁放将被吃,则对方胜出,具体的实现在moveChess函数中。

/****  @brief : 移动一个棋子**  @param : moveID : 移动棋子ID*           killID : 目标棋子ID (如果无棋子,默认-1)*           x      : x轴坐标*           y      : y轴坐标**  @return: 无***/
void ChessArea::moveChess(int moveID, int killID, int x, int y)
{// 判断是否结束游戏int selectBox = 0;if(killID != -1){myChess[killID].isDead  = true;myChess[killID].row     = -1;myChess[killID].col     = -1;showDeadChess(myChess[killID].chessID);//delete label[killid];label[killID]->clear();}myChess[moveID].row = x;myChess[moveID].col = y;label[moveID]->move((x+1)*chessArea-35, (y+1)*chessArea-35);// 黑方赢if(killID == 4){selectBox = QMessageBox::information(this, "棋局结果", "黑方胜利",QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);if(selectBox == QMessageBox::Yes || selectBox == QMessageBox::No)this->parentWidget()->close();}// 红方赢if(killID == 20){selectBox = QMessageBox::information(this, "棋局结果", "红方胜利",QMessageBox::Yes|QMessageBox::No, QMessageBox::Yes);if(selectBox == QMessageBox::Yes || selectBox == QMessageBox::No)this->parentWidget()->close();}update();
}

02 - 鼠标移动事件

  鼠标移动事件的作是确定棋子有效范围,为方便鼠标点击事件实现象棋移动做铺垫,实现方法也简单。

/****  @brief : 鼠标移动事件*  @param : QMouseEvent*  @return: 无***/
void ChessArea::mouseMoveEvent(QMouseEvent *e)
{// 打印鼠标移动相对坐标QToolTip::showText(e->globalPos(), QString("( %1, %2)").arg(e->x()).arg(e->y()));update();
}

03 - 鼠标点击事件

  重写Qt的鼠标按压事件QMouseEvent,鼠标被点击时,获取该区域坐标,根据区域坐标换算成为棋子的id,可以判断出移动棋子和目标棋子(或位置)。
  当鼠标被点击的次数为两次时,调用canMove()函数判断移动棋子是否能移动,另外要考虑如果点击了两个相同颜色的棋子也不能移动的情况,下面为实现重写鼠标按压事件代码。

/****  @brief : 鼠标按压事件*  @param : QMouseEvent*  @return: 无***/
void ChessArea::mousePressEvent(QMouseEvent *e)
{static int move_flag = 0;int xPos = -1, yPos = -1;// 转化坐标for(int i=0; i<10; i++){//遍历转化if(chessArea-20+chessArea*i<e->x() && e->x()<chessArea+20+chessArea*i){xPos=i;break;}}for(int j=0; j<11; j++){//遍历转化if(chessArea-20+chessArea*j<e->y() && e->y()<chessArea+20+chessArea*j){yPos=j;break;}}if(xPos > -1 && yPos > -1 && bRedTurn){switch(move_flag){case 0:{//第一次点击selectID1 = getChessID(xPos, yPos);if(selectID1 == -1 || !myChess[selectID1].isRed)return;elsemove_flag += 1;}break;case 1:{//第二次点击selectID2 = getChessID(xPos, yPos);move_flag += 1;}break;}if(move_flag == 2){//两次点击完成move_flag = 0;// 如果这个棋子可以走if(canMove(selectID1, selectID2, xPos, yPos) && myChess[selectID1].isRed){moveChess(selectID1, selectID2, xPos, yPos);bRedTurn = false;// 发送消息emit redTrueGo(bRedTurn);emit sendCompute(bRedTurn);}elsereturn;}}}

04 - 总结

  实现了象棋游戏法则之后,可以实现人人对战效果,但距离人机对战还需要进行算法优化,接下来几章将会讲述如何把人机博弈算法加入Qt象棋游戏中,使得可以人机对战。

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

【Qt象棋游戏】06_象棋游戏法则相关推荐

  1. Qt终极教程——用Qt编程实现中国象棋游戏(提供源代码和程序编译运行教程)

    Qt终极教程--用Qt编程实现中国象棋游戏 目录 Qt终极教程--用Qt编程实现中国象棋游戏 简介 运行可执行程序体验象棋游戏 Qt 安装 源代码的编译.运行与调试 生成预编译的可执行程序 简介 本文 ...

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

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

  3. 基于linux下QT象棋,课内资源 - 基于QT实现的网络象棋游戏

    1.功能说明 1.1 初始界面 初始界面中包含一个菜单栏,菜单栏中有一个建立连接选项,可以用来与其他程序建立连接. 1.2 建立连接 单击建立连接后,会弹出一个对话框以配置连接的相关信息,包括创建服务 ...

  4. python·pygame小游戏--中国象棋(原码附上,免费下载)

    大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...

  5. java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解

    本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考.具体如下: 游戏运行后如下图所示: Javascript 部分: /** chinese chess * Author: fdipzone ...

  6. 安卓平台最好的中国象棋,让智力游戏充满趣味性!

    游戏下载: https://play.google.com/store/apps/details?id=com.aichess.googlechess 安卓平台最好的中国象棋,让智力游戏充满趣味性!既 ...

  7. 【C++课程设计】期末大作业 - 基于Qt开发的中国象棋软件

    1 题目 基于Qt的中国象棋软件开发 本博客只是简略的描述论文的大致结构.框架,以及软件开发的大致过程.有兴趣的参考原文档资料. 2总体设计与主要功能 2.1概述 中国象棋是起源于中国的一种棋,属于二 ...

  8. 【QT项目】简易五子棋游戏(人机对战)— 完整源码

    文章目录 前言 一.游戏实现效果 二.需求分析 三.解决方案 四.核心步骤 1.插入棋盘图 2.双方落子 3.输赢判定 4.重新开始 五.完整源码 1.main.cpp 2.chessboard.h ...

  9. 用Qt做的拼图小游戏

    思路:在主界面可以选择图片进行对应的拼图,把一张600*600的图片分割成3*3张200*200的九宫格图片,对每张图片进行编号,对应0~8,然后打乱顺序,用的是随机函数,然后添加鼠标过滤事件:鼠标左 ...

最新文章

  1. 安卓开发|自定义监听器的三个步骤
  2. java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array
  3. WinDbg 调试命令记录二 (基础CLR查看)
  4. 解决Qt创建项目后只有.pro文件问题
  5. Linux C++、Boost、ACE ......
  6. 今天的编程语言是怎么来的?
  7. redhat linux 6.5 vnc,redhat 6.5 YUM安装kvm 并用VNC远程管理
  8. LeetCode 题 - 67. 二进制求和 python实现
  9. python基本图形绘制第二周答案_荐测验2: Python基本图形绘制 (第2周)
  10. robot framework好的学习网址
  11. 重复类发展手法_正确护肤手法图解!
  12. 烽火吉比特HG261GU获取超级密码教程
  13. c语言 实现推箱子小游戏
  14. 第十三届蓝桥杯大赛软件赛省赛(Java 大学A组)
  15. Oracle什么时候创建索引最好
  16. 《宅男的android开发指南》(翻译)--4
  17. 有什么哪些便宜的云服务器推荐?
  18. 医院信息系统 固定资产管理子系统
  19. 计算机网络里什么叫专线,专线和宽带的区别有哪些_专线网络和家庭宽带的具体区别介绍...
  20. Django strftime 时区问题

热门文章

  1. 需求结构化与分析约束影响
  2. 十大真实的谎言之:一流企业做标准
  3. 光学旋转编码器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. Chrome浏览器无法加载已解压的.crx文件的解决办法
  5. 中国研发独立移动操作系统 你怎么看?
  6. 计算机更新过后cad,电脑更新win10后,cad2010用不了
  7. css 通过background将两张图合成一张图显示
  8. janus视频房间插件协议交互整理
  9. 重庆三调工作中将mdb数据转换成vct格式的分析
  10. STM32F103VCT6定时器