以下代码应评估 tic tac toe 中每种可能的游戏,并将结果作为列表返回
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
假设这些结果是正确的(我找不到任何数据来验证我的结果),为什么第一个移动的人没有更多的胜利?
更新: 源码可参见here
最佳答案
第一个移动的玩家有更多的选择,因为棋盘是空的,并且“坏”的选项比“好”的选项更多。因此,如果考虑到所有可能的情况,第一个玩家会输得更频繁。
关于haskell - 井字棋游戏枚举器结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6342862/