在前面的基础上增加鼠标点击函数即可
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);
}