Qt5 中国象棋悔棋操作

来源:互联网 发布:藏剑二少捏脸数据下载 编辑:程序博客网 时间:2024/05/17 02:34

使用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);
0 0