Qt中国象棋四——显示棋子可移动位置/项目完成

//鼠标点击,走棋、吃棋等逻辑

void MainWindow::mousePressEvent(QMouseEvent *e)

{


//获得鼠标点击位置所对应的棋子 QPoint pt; pt.setX( (e->pos().x() - START_X ) / RECT_WIDTH); pt.setY( (e->pos().y() - START_Y ) / RECT_HEIGHT);
//是否有选中的棋子 if(m_bExistSelectedItem) { //再次点击已经选择的棋子,什么也不做 if (pt == m_selectedItem.m_pt) { return; }
//点击其它棋子 Item clickedItem; if (findItemAtLogicPoint(pt,clickedItem)) { //点击的同色的另外一个棋子,改选 if ( (m_bIsRedTurn && clickedItem.m_color == COLOR_RED) || (!m_bIsRedTurn && clickedItem.m_color != COLOR_RED)) { //改选棋子后,清除原有的落子提示 m_moveableArea.clear(); update();
setItemShow(m_selectedItem, true); m_selectedItem = clickedItem;
//获取已选择棋子的可移动区域 getMoveableArea(m_selectedItem,m_moveableArea); update(); return; } }
//绘制落子提示 getMoveableArea(m_selectedItem,m_moveableArea); //获取已选择棋子的可移动区域 update();

//点击的异色棋子,判断是否能走能吃 QVector moveableArea; getMoveableArea(m_selectedItem,moveableArea); //获取已选择棋子的可移动区域
if(moveableArea.contains(pt)) { //包含当前鼠标点中的棋子,则能吃 bool bDeleteSHUAI = false; deleteItemAtLogicPoint(pt,bDeleteSHUAI); //吃掉 changeItemLogicPoint(m_selectedItem.m_pt,pt); //绘制新的棋子位置 m_moveableArea.clear(); //清除落子提示 // update(); //发送重新绘图事件
if(bDeleteSHUAI) { QString str = m_bIsRedTurn?QStringLiteral("红方胜利!"):QStringLiteral("黑方胜利!"); QMessageBox::information(NULL, "GAME OVER ",str, QMessageBox::Yes , QMessageBox::Yes); newGame(); return ; }
m_bExistSelectedItem = false; m_bIsRedTurn = !m_bIsRedTurn; update(); return ;
} } else //当前没有选中棋子 { Item clickedItem; if(findItemAtLogicPoint(pt,clickedItem)) //知道了我是谁、我在哪 { if( (m_bIsRedTurn && clickedItem.m_color == COLOR_RED) || (!m_bIsRedTurn && clickedItem.m_color == COLOR_BLACK)) { m_selectedItem = clickedItem; m_bExistSelectedItem = true;
getMoveableArea(m_selectedItem,m_moveableArea); //获取已选择棋子的可移动区域 update(); return; } }
} }
void MainWindow::timerEvent(QTimerEvent *) { for (int i = 0; i<m_items.size(); i++) { if (m_items[i].m_pt == m_selectedItem.m_pt) { m_items[i].m_bShow = !m_items[i].m_bShow; } }

}