问题描述
||
以下代码应评估井字游戏中的所有可能游戏,并将结果作为列表返回
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)