如何解决井字游戏枚举器的结果不正确
|| 以下代码应评估井字游戏中的所有可能游戏,并将结果作为列表返回data Piece = Naught | Cross deriving (Show,Eq)
data Result = Win | Lose | Draw deriving (Show,Eq)
type Board = Array Integer (Maybe Piece)
emptyBoard :: Board
evaluateBoard :: Board -> (Maybe Result)
allPossibleMoves :: Board -> [Board]
walkPaths :: Bool -> Board -> [Result]
walkPaths inv b =
if result /= nothing
then [fromJust result]
else concat $ map (walkPaths (not inv)) (allPossibleMoves $ invertBoard b)
where
result = if inv then invertResult evald else evald
evald = evaluateBoard b
allGamesResults = walkPaths False emptyBoard
这给了我(先走赢/输):
总计:255168
赢:77904
输:131184
抽奖:46080
如果这些结果是正确的(我找不到任何数据可以用来验证我的数据),为什么第一个搬家的人不会赢得更多的胜利?
更新:
源代码可以在这里找到
解决方法
首先移动的玩家有更多选项可供选择,因为棋盘是空的,并且“坏”选项比“好”选项更多。因此,如果考虑所有可能的情况,第一个玩家将输掉更多钱。
, 感谢freenode上#haskell的scree提供的答案:
if result /= Nothing
then [fromJust result]
else concat $ map (walkPaths (not inv)) (map invertBoard $ allPossibleMoves b)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。