之前做过五子棋,在做这悔棋之前我以为跟五子棋的悔棋差不多,后来发现他悔棋的方式和五子棋完全两样。五子棋只是单纯的悔掉上一次下的子,而黑白棋悔掉的是上一次落子翻转过的棋子。这时候用数组记录棋子之前下过的地方已经远远不够用了,这里我用到了个容器Vector。他可以容纳任何类型的数据。
我的棋盘是8*8,全下完应该是64个棋子所以我先是声明了一个vector<cocos2d::CCSprite*> chesses[64];用来存放每一步翻转过的棋子,这样做的优点就是你不用考虑是否翻转了多个方向的棋子,统统不用管到时候取出来一个个翻转回去就行了。这里还得记录一下和落子一起吃子的那几个点(就是比如说211101112这里你下了0的位置还得顺便记录一下你有用到的2的位置再建个Vector来存)。我这里翻转就只用了比较简单的removed然后再addchild。
下面是我的程序:
for (int i = mod; i > 0; i--)
{
if (chesses[chess.step - 1].empty())
break;
chess.step--;
chess.state--;
if (chess.end == true)
{
label3->setVisible(false);
chess.end = false;
}
Sprite* temp = chesses[chess.step].back();
chesses[chess.step].pop_back();
int x1 = x2.back(); x2.pop_back();
int y1 = y2.back(); y2.pop_back();
removeChild(order_arr[x1][y1], true);
chess.state_arr[x1][y1] = 0;
while (!chesses[chess.step].empty())
{
auto xxx = x[chess.step].back();
auto yyy = y[chess.step].back();
removeChild(order_arr[xxx][yyy], true);
NewScene2::addchess(xxx, yyy, (chess.state) % 2 + 1);
chesses[chess.step].pop_back();
x[chess.step].pop_back();
y[chess.step].pop_back();
}
}