中国象棋游戏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下的中国象棋程序
随机推荐
- iOS 用RunTime来提升按钮的体验
用RunTime来提升按钮的体验 载请标明出处:http://blog.csdn.net/sk719887916/article/details/52597388,作者:Ryan 经常处理按钮问题都是 ...
- Python尾递归-创始人为何不愿TRE以及我们如何模拟TRE
TRE=Tail Recursion Elimination 创始人是不愿意实现TRE的.他专门用了一篇文章来阐述原因. http://neopythonic.blogspot.com/2009/04 ...
- 23 服务的启动Demo2
MainActivity.java package com.qf.day23_service_demo2; import android.app.Activity; import android.co ...
- openfire环境搭建
1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...
- [ExtJS5学习笔记]第十九节 Extjs5中通过设置form.Panel的FieldSet集合属性控制多个field集合
本文地址:http://blog.csdn.net/sushengmiyan/article/details/39209533 官方例子:http://docs.sencha.com/extjs/5. ...
- 【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
一. iOS 项目简介 1. iOS 文件简介 创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图; -- HelloWorldTests 目录 : 单元测试相关的类 ...
- Linux2.6--Linus电梯
内核为了处理来自IO层的请求,需要进行相应的优化,因为当请求很多时,且请求的块又都几种在一块,那么如果按照顺序处理这些请求无疑是很大的时间开销,所以,我们需要寻求方法来处理这种情况(当然, ...
- Oracle使用游标为所有用户表添加主键语句
应用场合:数据表新增自增一主键能加快数据表的访问速度,而且是整形的索引速度最快.本程序适合在导入Oracle数据库时删除不存在主键的情况下运行. 代码说明:所有的表主键字段名都设置为ID,如果已存在I ...
- [ExtJS5学习笔记]第二节 Sencha Cmd 学习笔记 使你的sencha cmd跑起来
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38313537 本文作者:sushengmiyan ----------------- ...
- 03 ImageView 图片
四 ImageView 父类 : view >概念:展示图片的控件 >属性: <!-- android:adjustViewBounds=&qu ...