0

リバーシゲームで有効な動きを確認する機能があります。空いているマスを見て、隣接する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 は、指定された場所で検索を続けるために各方向に 1 回追加する増分です。PositioninBounds は、検索がボードの境界内にあることを確認するために必要な関数です。deltarow と deltacol を同時に両方とも 0 にすることはできないので、どういうわけかそのステップをスキップする必要があります (おそらく間違っていました)。Oppositecolor は、自分の作品の反対の色を返す関数です。

4

1 に答える 1

0

あなたのコードには複数の間違いがあると思います。

次の反復を続行する必要があるときに、コードが for ループを誤って中断しています (chux で言及されているように)。

変化する...

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 に答える