0

我有一个功能可以检查我的黑白棋游戏中的有效动作。我查看未占用的空间,并检查任何 8 个方向上的相邻空间是否是相反的部分。(如果我是黑色的,我搜索白色)现在,如果我找到一个相邻的棋子,我应该继续朝那个方向看,看看我自己的棋子是否在最后,然后我返回 true,否则如果它是空的空间或棋盘边界外,我返回假。

当我打印出错误的动作时,我的功能似乎无法正常工作。

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 是一个函数,它返回我自己作品的相反颜色。

4

1 回答 1

0

我认为您的代码有多个错误。

当您应该继续下一次迭代时(如 chux 所述),您的代码错误地打破了 for 循环。

改变...

if (deltaRow == 0 && deltaCol == 0) {
    break;
} else {
    ...
}

对于chux的建议...

if (deltaRow == 0 && deltaCol == 0) {
    continue;
} else {
    ...
}

或者更简单的解决方案......

if (deltaRow != 0 || deltaCol != 0) {
   ...
}

在 deltaRow/deltaCol 循环内,您的代码错误地修改了您的代码在以后的循环迭代中需要的原始行/列值。

你可以改变...

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;
于 2015-11-03T03:29:03.733 回答