基于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;
}

你可能感兴趣的:(QT项目,象棋游戏)