Проверка действительных ходов в Реверси для всех 8 направлений

У меня есть функция, чтобы проверить действительные ходы в моей игре реверси. Я смотрю на незанятые места и проверяю, являются ли соседние места в любых 8 направлениях противоположной частью. (Если я черный, я ищу белый) Теперь, если я найду смежную фигуру, я должен продолжать смотреть в этом направлении и посмотреть, находится ли моя фигура в конце, тогда я возвращаю истину, иначе, если она не занята пробел или за пределы доски, я возвращаю ложь.

Моя функция, кажется, не работает должным образом, поскольку я печатаю неправильные движения.

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, поэтому каким-то образом мне нужно пропустить этот шаг (что я, вероятно, сделал неправильно). Oppversecolor - это функция, которая возвращает мне цвет, противоположный моему.

1 ответ

Я думаю, что ваш код имеет несколько ошибок.

Ваш код неправильно прерывает цикл for, когда вы должны продолжить следующую итерацию (как упомянуто chux).

Изменить...

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

по предложению любого чукса...

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. Вы не можете вернуть false, пока не завершите все циклы for.

Перед тем, как войти в цикл 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;
}

После того, как вы пропустили противоположные цвета, вам нужно проверить на тот же цвет. Если так, то верните истину.

    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;
Другие вопросы по тегам