Проверка действительных ходов в Реверси для всех 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;