首页 > 分享 > 基于QT5实现的最基本的象棋游戏

基于QT5实现的最基本的象棋游戏

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实现简