中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制
现在实现走棋的功能。
首先需要获取点击到的棋子,用QWidget中的函数
mouseReleaseEvent
实现函数:
void Board::mouseReleaseEvent(QMouseEvent *ev)
{
// 首先要获取鼠标点击的位置
QPoint pt = ev->pos();
// 看有没有点中象棋
// 将pt转化成象棋的行列值
// 判断这个行列值上面有没有棋子
int row, col;
bool bRet = getRowCol(pt, row, col);
if (bRet == false) { // 点击位置无效
return;
}
int i;
int clickid = -1;
for (i = 0; i < 32; ++i) {
if (_s[i]._row == row &&
_s[i]._col == col &&
_s[i]._dead == false) {
break;
}
}
if (i < 32) {
clickid = i;
}
if (_selectid == -1) { // 如果点中的棋子之前未被选中
if (clickid != -1) {
_selectid = clickid;
update();
}
}
else {
_s[_selectid]._row = row;
_s[_selectid]._col = col;
if (clickid != -1) {
_s[clickid]._dead = true;
}
_selectid = -1;
update();
}
}
这里涉及到点击位置的有效性,写了一个函数,根据点击得到的位置判断是否属于所在矩形四个顶点中的某个圆内。
// 判断点击位置是否在某个顶点的圆内
// 返回值为bool类型是为了处理点击在棋盘外的情况
bool Board::getRowCol(QPoint pt, int &row, int &col)
{
row = pt.y() / (2 * _r) - 1;
col = pt.x() / (2 * _r) - 1;
QPoint c = center(row, col);
int dx = c.x() - pt.x();
int dy = c.y() - pt.y();
int dist = dx * dx + dy * dy; // 和鼠标所处矩形左上顶点的距离
if (dist < _r * _r) {
return true;
}
row += 1;
c = center(row, col);
dx = c.x() - pt.x();
dy = c.y() - pt.y();
dist = dx * dx + dy * dy; // 和鼠标所处矩形左下顶点的距离
if (dist < _r * _r) {
return true;
}
row -= 1;
col += 1;
c = center(row, col);
dx = c.x() - pt.x();
dy = c.y() - pt.y();
dist = dx * dx + dy * dy; // 和鼠标所处矩形右上顶点的距离
if (dist < _r * _r) {
return true;
}
row += 1;
c = center(row, col);
dx = c.x() - pt.x();
dy = c.y() - pt.y();
dist = dx * dx + dy * dy; // 和鼠标所处矩形右下顶点的距离
if (dist < _r * _r) {
return true;
}
return false;
}
注意更改drawStone函数中的绘制棋子部分。
if (id == _selectid) {
painter.setBrush(QBrush(Qt::gray));
}
else {
painter.setBrush(QBrush(QColor(255, 228, 181))); // 将棋子底色设置为鹿皮色
}
如果是被选中的,把底色设置成灰色。
最终就实现了棋子的选中和走棋,效果为:
此时走棋可以随意走,可以随意吃,还没规则的限制,下一篇中再实现。
完整代码:Github
中国象棋游戏Chess(2) - 走棋的更多相关文章
- 中国象棋游戏Chess(3) - 实现走棋规则
棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...
- 中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制
本项目都使用QT来实现绘图,没有任何第三方的资源. 工程详情:Github 首先将棋盘设计为一个类Board // Board.h // Board类实现了棋盘的绘制以及显示 // #ifndef B ...
- 基于HTML5实现的中国象棋游戏
棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...
- C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!
中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...
- C#中国象棋+游戏大厅 服务器 + 客户端源码
来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...
- 【原创】使用HTML5+canvas+JavaScript开发的原生中国象棋游戏及源码分享
目前已经实现的功能: V1.0 : 实现棋子的布局,画布及游戏场景的初始化V2.0 : 实现棋子的颜色改变V3.0 :实现所有象棋的走棋规则V4.0 : 实现所有棋子的吃子功能 GItHub源码下载地 ...
- Cocos2d-X开发中国象棋《八》走棋
在上一节中实现了新局,至此中国象棋的准备工作差点儿相同都完毕了,在接下来的博客中将介绍玩家的走棋和一些游戏属性的设置,今天先介绍走棋和走棋规则 老规则,先看走棋的效果图,然后依据效果图一步一步分析游戏 ...
- Cocos2d-X开发中国象棋《九》走棋规则
在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...
- GMchess Linux下的中国象棋游戏
gmchess,一款Linux下的中国象棋程序
随机推荐
- Android对话框Dialog深度剖析
对话框 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 对话框设计 Dialog 类是对话框的基类,但您应该避免直接实例化 Di ...
- J2EE进阶(十九)FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd
J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mappin ...
- EBS业务学习之应付管理
应付款系统是供应链管理的最后一个环节,它使公司能够支付供应商提供的货物和服务的费用.供应链管理的目标是保持低库存量但又有充足的存货以满足要求,仓库中的库存就等于钱,因此,应付款管理的目标是尽可能地推迟 ...
- Android自定义View(三、深入解析控件测量onMeasure)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 ...
- 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
对于这个问题,我相信我的方法已经能帮90%的人解决了! 当你用Eclipse运行web项目的时候,你就会看到控制台出现: WARNING: [SetPropertiesRule]{Server/Ser ...
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- 15 ActionBar.Tab 以及保存fragment对象 代码案例
API 21弃用 values 中 string文件源码: <?xml version="1.0" encoding="utf-8"?> <r ...
- 微信小程序的开发:通过微信小程序看前端
前言 2016年9月22日凌晨,微信官方通过"微信公开课"公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真 ...
- Android官方命令深入分析之bmgr
作者:宋志辉 bmgr是一个可以跟Backup Manager进行交互的shell工具,要使用这个工具,Android设备API最小为8.它提供了备份和恢复操作的命令,所以你无需频繁的清除数据.这些命 ...
- 记一个逻辑bug
1 从数据库中找出一个学生能选的毕业设计(毕设的select or not 字段表示本题目是否已经被选 此时就按照其值为n来查询) 2 用户选择某个毕设后,先更新毕设表(select ...