使用QVector类定义容器,保存下棋操作,button按钮实现悔棋。
//定义类Step,记录每次下棋棋盘的改动
//移动棋子的操作无非有两种可能性
//一种是移动到空白位置
//另一种是移动吃掉了棋子
class Step
{
public:
Step();
//保存操作
int _moveId;//移动棋子的ID
int _killId;//吃掉棋子的ID,悔棋时需要将其_dead属性改变
int _rowPre;//起先的行
int _colPre;//起先的列
int _rowNow;//现在的行
int _colNow;//现在的列
bool _redTurnPre;//上一步执棋方
};
//保存棋盘
void Board::saveStep(int moveId, int killId, int row, int col, QVector<Step*>& steps)
{
Step* step = new Step;
step->_colPre = _c[moveId]._col;
step->_colNow = col;
step->_rowPre = _c[moveId]._row;
step->_rowNow = row;
step->_moveId = moveId;
step->_killId = killId;
}
//移动棋子时记录棋盘
void Board::backStep()
{
//恢复棋子的所有状态
//刚开始棋局,那么悔棋无效
if(this->_steps.size() == 0) return;
Step* step = this->_steps.last();
//上一步操作将棋子移动到空白位置
if(step->_killId==-1)
{
//只要将moveId的行列修改就可以了
_c[step->_moveId]._row=step->_rowPre;
_c[step->_moveId]._col=step->_colPre;
_redTurn=step->_redTurnPre;
update();
}
else
{
//需要将killId棋子状态恢复,将moveId棋子状态恢复
_c[step->_moveId]._row=step->_rowPre;
_c[step->_moveId]._col=step->_colPre;
_c[step->_killId]._dead=false;
_c[step->_killId]._row=step->_rowNow;
_c[step->_killId]._col=step->_colPre;
_redTurn=step->_redTurnPre;
update();
}
_steps.removeLast();
delete step;
}
//最后用信号槽将按钮与函数联系起来
connect(returnChess,&QPushButton::clicked,this,&Board::backStep);