之前做過五子棋,在做這悔棋之前我以爲跟五子棋的悔棋差不多,後來發現他悔棋的方式和五子棋完全兩樣。五子棋只是單純的悔掉上一次下的子,而黑白棋悔掉的是上一次落子翻轉過的棋子。這時候用數組記錄棋子之前下過的地方已經遠遠不夠用了,這裏我用到了個容器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();
}
}