【Qt象棋游戏】06_象棋游戏法则
文章目录
- 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_象棋游戏法则相关推荐
- Qt终极教程——用Qt编程实现中国象棋游戏(提供源代码和程序编译运行教程)
Qt终极教程--用Qt编程实现中国象棋游戏 目录 Qt终极教程--用Qt编程实现中国象棋游戏 简介 运行可执行程序体验象棋游戏 Qt 安装 源代码的编译.运行与调试 生成预编译的可执行程序 简介 本文 ...
- QT小游戏——中国象棋
QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...
- 基于linux下QT象棋,课内资源 - 基于QT实现的网络象棋游戏
1.功能说明 1.1 初始界面 初始界面中包含一个菜单栏,菜单栏中有一个建立连接选项,可以用来与其他程序建立连接. 1.2 建立连接 单击建立连接后,会弹出一个对话框以配置连接的相关信息,包括创建服务 ...
- python·pygame小游戏--中国象棋(原码附上,免费下载)
大家好我是小豪,今天给大家带来的是pygame小游戏-中国象棋 因为看到博客上面很多上传了的中国象棋py文件,都是收费的.所以我大胆的上传个免费的-已经把原码上传了,感兴趣的可以去下载. pygame ...
- java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解
本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考.具体如下: 游戏运行后如下图所示: Javascript 部分: /** chinese chess * Author: fdipzone ...
- 安卓平台最好的中国象棋,让智力游戏充满趣味性!
游戏下载: https://play.google.com/store/apps/details?id=com.aichess.googlechess 安卓平台最好的中国象棋,让智力游戏充满趣味性!既 ...
- 【C++课程设计】期末大作业 - 基于Qt开发的中国象棋软件
1 题目 基于Qt的中国象棋软件开发 本博客只是简略的描述论文的大致结构.框架,以及软件开发的大致过程.有兴趣的参考原文档资料. 2总体设计与主要功能 2.1概述 中国象棋是起源于中国的一种棋,属于二 ...
- 【QT项目】简易五子棋游戏(人机对战)— 完整源码
文章目录 前言 一.游戏实现效果 二.需求分析 三.解决方案 四.核心步骤 1.插入棋盘图 2.双方落子 3.输赢判定 4.重新开始 五.完整源码 1.main.cpp 2.chessboard.h ...
- 用Qt做的拼图小游戏
思路:在主界面可以选择图片进行对应的拼图,把一张600*600的图片分割成3*3张200*200的九宫格图片,对每张图片进行编号,对应0~8,然后打乱顺序,用的是随机函数,然后添加鼠标过滤事件:鼠标左 ...
最新文章
- 安卓开发|自定义监听器的三个步骤
- java中Array和ArrayList区别 可以将 ArrayList想象成一种会自动扩增容量的Array
- WinDbg 调试命令记录二 (基础CLR查看)
- 解决Qt创建项目后只有.pro文件问题
- Linux C++、Boost、ACE ......
- 今天的编程语言是怎么来的?
- redhat linux 6.5 vnc,redhat 6.5 YUM安装kvm 并用VNC远程管理
- LeetCode 题 - 67. 二进制求和 python实现
- python基本图形绘制第二周答案_荐测验2: Python基本图形绘制 (第2周)
- robot framework好的学习网址
- 重复类发展手法_正确护肤手法图解!
- 烽火吉比特HG261GU获取超级密码教程
- c语言 实现推箱子小游戏
- 第十三届蓝桥杯大赛软件赛省赛(Java 大学A组)
- Oracle什么时候创建索引最好
- 《宅男的android开发指南》(翻译)--4
- 有什么哪些便宜的云服务器推荐?
- 医院信息系统 固定资产管理子系统
- 计算机网络里什么叫专线,专线和宽带的区别有哪些_专线网络和家庭宽带的具体区别介绍...
- Django strftime 时区问题