C++ QT中国象棋项目讲解(三) 单机双人对战走棋
在前面的基础上增加鼠标点击函数即可
click函数由鼠标点击坐标点得到对应棋子的坐标点
void Board::click(QPoint pt) { int row, col; bool bClicked = getRowCol(pt, row, col); if(!bClicked) // 点击地方不合理 return; int id = getStoneId(row,col); click(id,row,col); }
由点击棋子的编号,以及点击坐标,决定棋子移动方式
void Board::click(int id, int row, int col) { if(this->_selectid == -1) // 如果没有选择到棋子,选择棋子 trySelectStone(id); else // 选择到棋子,移动棋子 tryMoveStone(id,row,col); }
尝试走棋函数
// 尝试走棋 void Board::tryMoveStone(int killid, int row, int col) { // 如果尝试吃颜色相同的棋子,那么重新选择棋子 if(killid!=-1 && sameColor(killid, _selectid)){ trySelectStone(killid); return; } // 如果可以移动棋子,那么移动棋子 if(canMove(_selectid, killid, row, col)){ moveStone(_selectid, killid, row, col); _selectid = -1; update(); } }
走棋函数
void Board::moveStone(int _selectid, int killid, int row, int col) { _s[_selectid]._row = row; _s[_selectid]._col = col; if(killid!=-1) { _s[killid]._dead = true; } _selectid = -1; _bRedTurn = !_bRedTurn; }
尝试选择棋子函数
void Board::trySelectStone(int id) { if(_bRedTurn == _s[id]._red){ _selectid = id; update(); } }
鼠标点击函数
void Board::mouseReleaseEvent(QMouseEvent *ev) { QPoint pt = ev->pos(); click(pt); }