Итак, я работаю над минимаксной реализацией для игры с шашками, чтобы помочь себе лучше изучить Haskell. Функция, с которой у меня возникают проблемы, содержит список состояний игры и генерирует список непосредственных состояний игры преемника. Как и шашки, если прыжок доступен, игрок должен его взять. Если есть более одного, игрок может выбрать.Упрощение кода Haskell
По большей части это прекрасно работает со списком monad: loop над всеми входными игровыми состояниями, петлями над всеми шариками, которые можно было прыгать, петлями над всеми прыжками этого мрамора. Этот список monad красиво сглаживает все списки в простой список состояний в конце.
Фокус в том, что если никаких прыжков не найдено для данного состояния игры, мне нужно вернуть текущее состояние игры, а не пустой список. Код ниже - лучший способ, которым я придумал это, но для меня это кажется уродливым. Любые предложения по его очистке?
eHex :: Coord -> Coord -- Returns the coordinates immediately to the east on the board
nwHex :: Coord -> Coord -- Returns the coordinates immediately to the northwest on the board
generateJumpsIter :: [ZertzState] -> [ZertzState]
generateJumpsIter states = do
ws <- states
case children ws of
[] -> return ws
[email protected]_ -> n
where
children [email protected](ZertzState s1 s2 b p) = do
(c, color) <- occupiedCoords ws
(start, end) <- [(eHex, wHex), (wHex, eHex), (swHex, neHex),
(neHex, swHex), (nwHex, seHex), (seHex, nwHex)]
if (hexOccupied b $ start c) && (hexOpen b $ end c)
then case p of
1 -> return $ ZertzState (scoreMarble s1 color) s2
(jumpMarble (start c) c (end c) b) p
(-1) -> return $ ZertzState s1 (scoreMarble s2 color)
(jumpMarble (start c) c (end c) b) p
else []
РЕДАКТИРОВАТЬ: Подпишите примерные сигнатуры для * Hex-функций.
Это просто _part_ кода для генерации набора возможных ходов, который является частью ввода минимакс. В частности, это часть, связанная с генерированием доступных прыжков. – Resistor
Правила похожи на шашки: если есть прыжки, они должны быть приняты. Если доступно более одного, игрок может выбрать, что взять. Разрешены прыжки с цепочкой (т. Е. Двойные прыжки в шашки), и применяется одно и то же правило «требуется», если доступно. – Resistor
Я думал об этом как о рекурсивно сгенерированном дереве состояний. Я начинаю с списка, содержащего начальное состояние. Из этого я создаю список достижимых состояний, которые не более одного прыгают. Из них я создаю список состояний, которые не более двух прыжков и т. Д. Я повторяю этот процесс до тех пор, пока список не перестанет меняться. Это работает только в том случае, если в списке присутствуют «тупиковые» состояния, а идут в пустой список. – Resistor