Qt5 中国象棋悔棋操作

使用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);
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值