QT5
CSDN下载链接:https://download.csdn.net/download/qq_35479392/10508443
百度云链接:https://pan.baidu.com/s/1pDL3p-BWcrE1uHnlk9-pJw 密码:7gyk
一 象棋棋子 如何走棋呢?
鼠标点一点鼠标点击时有效 void mousePressEvent (QMouseEvent *)
鼠标点击释放 ... void mouseReleaseEvent (QMouseEvent *)
需要一个鼠标点中棋盘格点算法bool Board:: getRowCol( QPoint pt, int & row, int & col)//pt鼠标点击的位置 输出棋盘行与列
{
for( row = 0; row <= 9; row++)
{
for( col = 0; col <= 8; col++)
{
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;
}
}
return false;
}
棋子是选择还是移动还是吃掉选择 鼠标第一次点击到棋子上是棋子选择 此时 _selectid = -1 clickid = i
移动 已经选择好了棋子 再次点击格点将要移动 此时 selectid = clickid
吃掉 已经选择好了棋子 再次点击格点,其上有棋子则吃掉 无棋子则移动
己方棋子移动且对方棋子死亡dead = true
棋子没移动一次就要update()棋盘一次
算法:
//鼠标事件两步一重置 : 第一次点击 - 选择棋子(红方先走 默认鼠标第一次点击红方棋子有效) 第二次点击 - 移动or吃掉 ---> 重置 ---> 红方结束,黑方开始 ---> ...
void Board:: mouseReleaseEvent(QMouseEvent * ev)
{
QPoint pt = ev->pos();
/*
两步:将pt转换成象棋的行列值;判断这个行列值上有没有棋子;
*/
int row, col;
bool bRet = getRowCol( pt, row, col); //1 确定鼠标点击的格点行列值//确定鼠标点击的棋盘格点 位置,即行列位置(注:不是像素位置),正确点击格点像素位置的范围则返回true
if( bRet == false) //点在棋盘外
return;
int i;
int clickid = - 1; //鼠标点一下棋子就会出现这个clickid = -1
for( i = 0; i < 32; ++ i) //2 确定鼠标点击的格点是否为棋子//遍历整个棋盘的格点 确认 鼠标点击的是不是棋子
{
if( _s[ i]._row == row && _s[ i]._col == col && _s[ i]._dead == false)
{
break;
}
}
if( i < 32)
{
clickid = i;
} //3 至此确定鼠标点击的棋子是哪一个
if( _selectid == - 1)
{ //_selectid = -1出现在默认构造函数中 clickid = -1 出现在mouseReleaseEvent(QMouseEvent *ev)函数中
if( clickid != - 1) //4 棋子选择可以是红方黑方 但象棋规定红方先走,所以鼠标第一次点击的黑棋子无效 必须是红方棋子才能算完成棋子选择
{
//象棋默认红方棋子先走 这里先选择红方棋子先走
if( _bRedTurn == _s[ clickid]._red)
{
_selectid = clickid;
update();
}
}
}
else
{
if( canMove( _selectid, row, col, clickid))
{
/*走棋*/ //5 红or黑 移动or吃掉
_s[ _selectid]._row = row;
_s[ _selectid]._col = col;
if( clickid != - 1)
{
_s[ clickid]._dead = true;
}
//6 重置
_selectid = - 1; //为黑方开始走棋做准备//重新选择双方阵营的棋子 如 这里是红方先走,所以下面是黑方走 //不重新给selectid赋原来的初值的话,将会是红方棋子一直走或者红方棋子选择后再一直走,黑方棋子不能被选中
_bRedTurn = ! _bRedTurn; //红方棋子走动部署结束 轮到黑方选择棋子 移动或者吃掉红方棋子
update();
}
}
}
二 错误
1 加上域名解析符
switch( _s[ moveid]. _type)
{
case CHE: return canMove1( moveid, row, col, killid); break;
case Stone:: MA: return canMove2( moveid, row, col, killid); break;
case Stone:: XIANG: return canMove3( moveid, row, col, killid); break;
case Stone:: SHI: return canMove4( moveid, row, col, killid); break;
case Stone:: JIANG: return canMove5( moveid, row, col, killid); break;
case Stone:: BING: return canMove6( moveid, row, col, killid); break;
case Stone:: PAO: return canMove7( moveid, row, col, killid); break;
default: break;
}
相关知识
象棋小游戏,中国象棋游戏,4399象棋小游戏大全,4399小游戏
ssm725基于Java的宠物医院预约挂号系统的设计与实现
基于宠物游戏的智能教学系统
连载:象棋竞赛规则2011解读(36)
基于Springboot+Vue实现的宠物管理系统
基于STM32的畜牧养殖系统设计与实现
毕业设计:基于java的宠物领养系统设计与实现
毕业设计:基于java的宠物管理系统设计与实现
977
商业文档写作
网址: 基于QT5实现的最基本的象棋游戏 https://m.mcbbbk.com/newsview464715.html
上一篇: 写一个类,名为Animal,该类 |
下一篇: 利用HTML+JS+CSS实现简 |