我有一个函数来检查可逆游戏中的有效移动。我查看未占用的空间,并检查在任何8个方向上的相邻空间是否是相反的部分。(如果我是黑人,我会搜索白色)现在,如果我找到一个相邻的片段,我应该继续朝那个方向看,看看我自己的片段是否在结尾,然后我返回true,否则,如果它是一个未被占用的空间或板外边界,我返回false。
我的功能似乎无法正常工作,因为我打印出了错误的动作。
bool checkLegalInDirection(char boardgame[26][26], int size, int row, int col, char color) {
int currentRow, currentCol;
for (int deltaRow = -1; deltaRow < 2; deltaRow++) {
for (int deltaCol = -1; deltaCol < 2; deltaCol++) {
if (deltaRow == 0 && deltaCol == 0) {
break;
} else {
row = row + deltaRow;
col = col + deltaCol;
if (positionInBounds(size, row, col)) {
while (boardgame[row][col] == OppositeColor(color)) {
currentRow = row + deltaRow;
currentCol = col + deltaCol;
if (positionInBounds(size, currentRow, currentCol)) {
if (boardgame[currentRow][currentCol] == color) {
return true;
} else {
return false;
}
}
}
}
}
}
}
}
deltaRow和deltaCol是在每个方向上的增量,并添加一次以在指定位置继续搜索。PositioninBounds是一个我必须确保搜索在棋盘边界内的函数。我的deltarow和deltacol不能同时为0,所以不知何故,我需要跳过这一步(我可能做错了)。Oppositecolor是一个函数,它会返回我自己作品的相反颜色。
我认为您的代码有多个错误。
当您应该继续下一次迭代时(正如chux所提到的),您的代码错误地破坏了for循环。
更改。。。
if (deltaRow == 0 && deltaCol == 0) {
break;
} else {
...
}
按照楚的建议。。。
if (deltaRow == 0 && deltaCol == 0) {
continue;
} else {
...
}
或者更简单的解决方案。。。
if (deltaRow != 0 || deltaCol != 0) {
...
}
在deltaRow/detaCol循环中,您的代码错误地修改了代码在以后的循环迭代中需要的原始行/列值。
你可以改变。。。
row = row + deltaRow;
col = col + deltaRow;
到。。。
currentRow = row + deltaRow;
currentCol = col + deltaRow;
在while循环中,您的代码错误地返回false。在完成所有for循环之前,不能返回false。
在进入while循环之前,您需要检查相邻空间是否在边界内并且颜色相反。。。
if (positionInBounds(size, currentRow, currentCol) && boardgame[currentRow][currentCol] == OppositeColor(color)) {
如果是,则跳过所有相邻的相反颜色。。。
while (positionInBounds(size, currentROw, currentColor) && boadgame[currentRow][currentCol] == OppositeColor(color)) {
{
currentRow = currentRow + deltaRow;
currentCol = currentCol + deltaCol;
}
跳过相反的颜色后,您需要检查相同的颜色。如果是,则返回true。
if (positionInBOunds(size, currentRow, currentCol) && boardgame[currentRow][currentCol] == color) {
return true;
}
您的代码只应在检查所有方向后返回false。。。
for (int deltaRow = -1; deltaRow < 2; deltaRow++) {
for (int deltaCol = -1; deltaCol < 2; deltaCol++) {
....
}
}
return false;