Qt版本中国象棋开发(三)
实现功能:棋子初始化及走棋规则
棋子类:
#ifndef STONE_H
#define STONE_H #include <QString> class Stone
{
public:
Stone();
~Stone(); enum TYPE{JIANG, CHE, PAO, MA, BING, SHI, XIANG}; int _row; //棋子所在行
int _col; //棋子所在列
TYPE _type; //棋子类型(JIANG,CHE...) int _id; //棋子id(0-31)
bool _dead; //棋子是否死亡
bool _red; //是否为红方 void init(int id) //初始化棋子信息
{
struct {
int row, col;
Stone::TYPE type;
} pos[] = {
{, , Stone::CHE},
{, , Stone::MA},
{, , Stone::XIANG},
{, , Stone::SHI},
{, , Stone::JIANG},
{, , Stone::SHI},
{, , Stone::XIANG},
{, , Stone::MA},
{, , Stone::CHE}, {, , Stone::PAO},
{, , Stone::PAO},
{, , Stone::BING},
{, , Stone::BING},
{, , Stone::BING},
{, , Stone::BING},
{, , Stone::BING},
}; _id = id;
_dead = false;
_red = id<; if(id < )
{
_row = pos[id].row;
_col = pos[id].col;
_type = pos[id].type;
}
else
{
_row = -pos[id-].row;
_col = -pos[id-].col;
_type = pos[id-].type;
} } QString getText() //返回棋子类型对应的汉字,便于绘制棋面汉字
{
switch(this->_type)
{
case CHE:
return "车";
case MA:
return "马";
case PAO:
return "炮";
case BING:
return "兵";
case JIANG:
return "将";
case SHI:
return "士";
case XIANG:
return "相";
}
return "错误";
}
}; #endif // STONE_H
棋盘类:
#ifndef BOARD_H
#define BOARD_H #include <QWidget>
#include "Stone.h" class Board : public QWidget
{
Q_OBJECT
public:
explicit Board(QWidget *parent = ); Stone _s[]; //32枚棋子
int _r; //棋子的半径
int _selectid; //记录选中的棋子id
bool _bRedTurn; //记录是否轮到红方走棋 /* 返回象棋棋盘行列对应的像素坐标 */
QPoint center(int row, int col);
QPoint center(int id); /* 返回象棋棋盘上某个坐标对应的行,列 */
bool getRowCol(QPoint pt, int& row, int& col); /* 绘制棋子*/
void drawStone(QPainter& painter, int id); void paintEvent(QPaintEvent *); /* 鼠标释放事件 */
void mouseReleaseEvent(QMouseEvent *); /* 根据要移动的棋子moveid,将要移动到的位置(row,col),将被吃掉的棋子killid判断能否走棋 */
bool canMove(int moveid, int row, int col, int killid);
/* 将 */
bool canMove1(int moveid, int row, int col, int killid);
/* 车 */
bool canMove2(int moveid, int row, int col, int killid);
bool canMove3(int moveid, int row, int col, int killid);
bool canMove4(int moveid, int row, int col, int killid);
bool canMove5(int moveid, int row, int col, int killid);
bool canMove6(int moveid, int row, int col, int killid);
bool canMove7(int moveid, int row, int col, int killid); signals: public slots: }; #endif // BOARD_H
判断走棋函数:
bool Board::canMove(int moveid, int row, int col, int killid)
{
if(_s[moveid]._red == _s[killid]._red)//moveid和killid颜色相同)
{
//换选择
_selectid = killid;
update(); return false;
} switch(_s[moveid]._type)
{
case Stone::JIANG:
return canMove1(moveid, row, col, killid);
break;
case Stone::SHI:
return canMove2(moveid, row, col, killid);
break;
case Stone::XIANG:
return canMove3(moveid, row, col, killid);
break;
case Stone::CHE:
return canMove4(moveid, row, col, killid);
break;
case Stone::MA:
return canMove5(moveid, row, col, killid);
break;
case Stone::PAO:
return canMove6(moveid, row, col, killid);
break;
case Stone::BING:
return canMove7(moveid, row, col, killid);
break;
} return true;
}
“将” 的走棋规则说明:
bool Board::canMove1(int moveid, int row, int col, int killid)
{
/*
1.首先目标位置在九宫内
2.移动的步长是一个格子
*/
if(_s[moveid]._red)
{
if(row > )return false;
}
else
{
if(row < )return false;
} if(col < ) return false;
if(col > ) return false; int dr = _s[moveid]._row - row;
int dc = _s[moveid]._col - col;
int d = abs(dr)* + abs(dc); // 12, 21 22 10, 1
if(d == || d == )
return true; return false;
}
判断 “将” 要移动的位置与原来位置相差一步的处理:
int dr = _s[moveid]._row - row;
int dc = _s[moveid]._col - col;
int d = abs(dr)* + abs(dc); // 12, 21 22 10, 1
if(d == )
return true;
鼠标点击释放事件:
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 = -;
for(i=;i<;++i)
{
if(_s[i]._row == row && _s[i]._col == col && _s[i]._dead== false)
{
break;
}
} if(i<)
{
clickid = i;
} if(_selectid == -)
{
if(clickid != -)
{
if(_bRedTurn == _s[clickid]._red)
{
_selectid = clickid;
update();
}
}
}
else
{
if(canMove(_selectid, row, col, clickid))
{
/*走棋*/
_s[_selectid]._row = row;
_s[_selectid]._col = col;
if(clickid != -)
{
_s[clickid]._dead = true;
}
_selectid = -;
_bRedTurn = !_bRedTurn;
update();
}
}
}
效果图:
Qt版本中国象棋开发(三)的更多相关文章
- Qt版本中国象棋开发(四)
内容:走法产生 中国象棋基础搜索AI, 极大值,极小值剪枝搜索, 静态估值函数 理论基础: (一)人机博弈走法产生: 先遍历某一方的所有棋子,再遍历整个棋盘,得到每个棋子的所有走棋情况(效率不高,可以 ...
- Qt版本中国象棋开发(一)
开发目的:实现象棋人机对战简单AI,网络对战,移植到android中. 开发平台:windows10 + Qt5.4 for android 开发语言:C++ 开发过程:1.棋盘绘制: 方法一:重写 ...
- Qt版本中国象棋开发(二)
实现功能:棋盘绘制 核心函数: void paintEvent(QPaintEvent *); //QWidget自带的虚函数,重写后使用 QPainter 类来绘制图形 QPainter paint ...
- 基于QT的中国象棋
基于QT的中国象棋,可实现人人对战,人机对战,联网对战,可显示棋谱,可悔棋. 还有一些小毛病,我之后会找空把这个DEMO重新修改一下上传 链接:https://pan.baidu.com/s/1-eM ...
- Cocos2d-X开发中国象棋《三》開始场景的实现
在前面两节(第一节.第二节)中介绍了中国象棋的功能和project文件.在这篇博客中将介绍中国象棋的開始场景的实现 在写代码前先理清一下实现開始场景的思路: 1.打开游戏后进入開始场景,场景上显示一个 ...
- Qt绘制中国象棋棋盘
这里主要用的是#include <QPainter>里面的paintEvent void Board::paintEvent(QPaintEvent*) { QPainter painte ...
- Cocos2d-X开发中国象棋《二》project文件概述
我在上一篇博客中介绍了象棋的功能.在接下来的博客中将向大家介绍使用Cocos2d-X怎样一步一步开发中国象棋 开发工具: Cocos2d-X2.2.3 VS2012 项目的文件夹: Classes:存 ...
- Python开发中国象棋实战(附源码)
Pygame 做的中国象棋,一直以来喜欢下象棋,写了 python 就拿来做一个试试,水平有限,电脑走法水平低,需要在下次版本中更新电脑走法,希望源码能帮助大家更好的学习 python.总共分 ...
- cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面
之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...
随机推荐
- HDU - 1253 胜利大逃亡(搜索)
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在( ...
- bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
这俩题太像了 bzoj 3450 Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点 ...
- python-函数变量与方法公有、私有整理
关于函数与方法的区别: 函数: def funname(): 括号里面可以有形参,也可以没有,为空 在函数里面的参数整理: 方法: def funcname(self): 括号里面必须有个self,因 ...
- 经过踩坑,搭建成功的Appium自动化测试环境
因为最近本人准备搞app自动化,所以就搭建环境过程记录下来(主要踩过好几个坑) 期间有点烦躁,后面调整了下心态还是成功弄好了. 一.Appium环境搭建准备软件 所需要到的软件如下: 1.安装JDK1 ...
- python进程/线程/协程
一 背景知识 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所 ...
- Java——Java连接Jira,创建、修改、删除工单信息
还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.com/wgblog-code/p/11750767.html 本篇文章主要介绍如何使用Java操作Jira,包 ...
- P2774 方格取数问题 网络流重温
P2774 方格取数问题 这个题目之前写过一次,现在重温还是感觉有点难,可能之前没有理解透彻. 这个题目要求取一定数量的数,并且这些数在方格里面不能相邻,问取完数之后和最大是多少. 这个很好的用了网络 ...
- Web概念
目录 Web概念概述 Web概念概述 JavaWeb 使用 Java 语言开发基于互联网的项目 软件架构 C / S:Client / Server 客户端 / 服务器端 在用户本地有一个客户端程序, ...
- C++关闭同步流 ios::sync_with_stdio(false)
说明:ios::sync_with_stdio(false) 1.这句语句是用来取消cin的同步,什么叫同步呢?就是iostream的缓冲跟stdio的同步.这就是为什么cin和cout比scanf和 ...
- springData表关系:一对多
一.编写实体类进行表关联 1.在一张表的关联属性上添加@OneToMany注解(关联属性用来记录多的一方的信息,是个集合,一般用set) 2.在另一个实体类的关联属性上添加@ManyToOne注解和 ...