在上一节中实现了走棋规则,这节中将实现悔棋
首先看一下悔棋的效果:
通过观察上图中的演示可知,当单击悔棋按钮后,移动了的棋子会回到原来的位置上,
实现方式:
首先在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(); }