Cocos2d-X开发中国象棋《十》悔棋

在上一节中实现了走棋规则,这节中将实现悔棋

首先看一下悔棋的效果:

通过观察上图中的演示可知,当单击悔棋按钮后,移动了的棋子会回到原来的位置上,


实现方式:

首先在SceneGame类中定义一个成员变量CCArray* _steps,用于保存每步棋的棋子信息

 //保存每步走的棋子
    CCArray* _steps;


在SceneGame类中的成员函数init()中插入下面的代码用于创建一个数组用于保存每步棋的信息

//创建数组
    _steps = CCArray::create();
    _steps->retain();


在moveStone()中添加下面的代码实现,每走一步棋的时候,将棋子的信息保存到_steps数组中

 //走棋之前记录棋子的信息
   //第一个参数:需要移动的棋子的id
   //第二个参数:通过触摸点的位置判断触摸点上是否有棋子
   //第三个参数:棋子当前的位置的x坐标
   //第四个参数:棋子当前的位置的y坐标
   //第五个参数:棋子移动后的位置的x坐标
   //第六个参数:棋子移动后的位置的y坐标
    Step* step = Step::create(moveId, killId, _s[moveId]->getX(), _s[moveId]->getY(), x, y);
    
    //将棋子的信息添加到数组中
    _steps->addObject(step);


在SceneGame中定义一个成员函数Back(CCObject*)实现悔棋,Back(CCObject*)中的代码:

//实现悔棋
void SceneGame::Back(CCObject*)
{
    //当数组中的元素个数为0时
    //没走棋
    if(0 == _steps->count())
    {
        return;
    }

    //获取数组中的最后一个元素
    //获取走棋时的最后一步棋子的信息
    Step* step = (Step*)_steps->lastObject();

   // 恢复棋子的信息
    //设置棋子走棋前的位置x坐标
    _s[step->_moveid]->setX(step->_xFrom);

    //设置棋子走起前的位置y坐标
    _s[step->_moveid]->setY(step->_yFrom);
    _s[step->_moveid]->setPosition(getStonePos(step->_xFrom, step->_yFrom));

    //恢复吃掉的棋子
    if(step->_killid != -1)
    {
        //显示吃掉的棋子
        _s[step->_killid]->setVisible(true);

        //复活吃掉的棋子
         _s[step->_killid]->setDead(false);
    }

    //移动了一步棋后
    //切换移动的棋子的颜色
    _redTrun = ! _redTrun;

    //删除数组中的最后一个元素
    //删除走棋时最后一步棋子的信息
    _steps->removeLastObject();
}





你可能感兴趣的:(Cocos2d-X开发中国象棋《十》悔棋)