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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章