Поиск других частей в реверси C++
Я делаю игру Реверси на C++, но мне трудно понять, как проверять наличие последовательных фигур вражеской доски, как только игрок помещает их на доску.
Плата представляет собой двумерный массив 8x8 со значениями 0, -1 или 1.
- -1 это белая фигура,
- 1 черный кусок и
- 0 является вакантной ячейкой.
Функция ApplyMove просто поместит фигуру текущего игрока на игровое поле и проверит, есть ли вражеские фигуры в каком-либо направлении. Это тогда перевернет все части в этом направлении.
Моя функция будет иметь следующие параметры:
void ApplyMove(char board[BOARD_SIZE][BOARD_SIZE], int row, int col, char currentPlayer)
Я хочу, чтобы программа использовала циклы для перебора всех 8 возможных направлений, начиная с фрагмента, который был помещен игроком. Как бы это было достигнуто самым простым способом без множества ифсов и других?
2 ответа
Отличный вопрос!
Я предлагаю вам начать с размышлений о том, как именно вы определяете, следует ли переворачивать фигуру. В любом из ваших восьми направлений вы переворачиваете любые фишки противоположного цвета между своей фишкой и первой фишкой того же цвета, и не переворачиваете ни одну, если до того, как вы дойдете до этой фишки, есть пустые места. (Обратите внимание, что это довольно удобный способ справиться даже с тем случаем, когда между двумя фигурами есть 0 штук противоположного цвета, потому что вы перевернете «все 0» из них.)
Есть интересные вещи, которые вы можете сделать, используя +/- 1, — проверить произведение значений, чтобы увидеть, совпадают ли цвета (+1) или не совпадают (-1), или перевернуть токен, умноженный на -1.
Быстрый макет этого концептуально, где мы проверяем строки параметров, а также чтобы убедиться, что мы не покидаем доску - я использую!=
для не равно, если это вам не знакомо:
set current_player // +1 or -1
set current_space // say [3, 4]
directions = [[-1, -1], [-1, 0], ...]
for direction in directions:
spaces_away = 1
check_space = direction*spaces_away + current_space
while (check_space has values between 1 and 8 for both x and y) and (check_space != 0)
if current_player * (direction*spaces_away + current_space) = -1
spaces_away += 1 // add one so we can check the next space out
check_space = direction*spaces_away + current_space
else
for i from 1 to spaces_away
flip_space = direction*spaces_away + current_space
flip_space * -1 // this will change the color
Здесь нужно подумать о некоторой реализации, в основном тот факт, что я игнорирую то, как вы назначаете -1, 0 или 1 каждому из 64 пробелов. Надеюсь, псевдокод достаточно ясен и без этого.
Еслиfor direction in directions
не имеет смысла, найдите время, чтобы посмотреть, что такое итерация. Супер полезная концепция, независимо от того, что вы здесь делаете!
Удачи!
Один способ, который кажется мне простым, - это использование переменных xoffset
а также yoffset
которые принимают значения 1, 0, -1. Использовать for
Цикл значений этих переменных, а затем while
цикл, чтобы следовать последовательным частям.