我正在尝试使用minimax算法在Haskell中编写一个Tic Tac Toe程序。我按照以下方式构建了自己的“Rose a”数据类型:
data Rose a = a :> [Rose a]
这是我想要“存储”极小化极大树的数据类型。我了解极小极大算法的工作原理,但似乎无法在递归函数中实现它。
minimax :: Player -> Rose Board -> Rose Int
minimax p (r :> []) | hasWinner r == Just p = 1 :> []
| hasWinner r == Just (nextPlayer p) = (-1) :> []
| otherwise = 0 :> []
minimax p (r :> rs) = maximum(map root xs) :> xs
where xs = map (minimax' (nextPlayer p)) rs
minimax' :: Player -> Rose Board -> Rose Int
minimax' p b@(r :> []) = minimax p b
minimax' p (r :> rs) = minimum(map root xs) :> xs
where xs = map (minimax p) rs
"Player"也是一种自定义数据类型,可以取值P1或P2。"hasWinner"函数检查给定的"Board"(一种能够保存井字棋棋盘的数据类型)是否有赢家,并返回Maybe P1或Maybe P2或Nothing。
我编写的"minimax"函数没有报错,但结果不正确。我的minimax实现有什么问题?
r
是由P1
选择的移动,rs
是可供P2
选择的移动,并且P2
试图使其最小化。也许P1
需要考虑另一个玩家如何选择移动,而不是为了让P2
做出P1
最喜欢的移动。 - Cirdec