2016-11-07 88 views
1

我试图写一个屏风式四子棋游戏极小的功能,这是我未完成的代码极小哈斯克尔

minimax:: RT Board ->Int 
minimax (Tree board subtrees) = case subtrees of 
    []                 >evaluate board (get_turn board) 
    _                 ->case get_turn board of 
      Player_X             ->maximum (next_socres) 
      Player_O             ->minimum (next_socres) 
where next_socres = map evaluate (map get_board subtrees) 

--get the node from sub trees 
get_board:: RT Board -> Board 
get_board (Tree board subtrees) = board 

--evaluate moves(not finished) 
evaluate :: Board -> Player -> Int 
evaluate board me' 
    |[me,me,me,Blank] `isInfixOf_e` all_stone_lines       = 10 
    |[opp,opp,opp,Blank] `isInfixOf_e` all_stone_lines      = -10 
    |otherwise                = 0 
    where 
     me = get_stone_of me' 
     opp = opponent' me 
     all_stone_lines = combine_list stones_from_rows (combine_list  stones_from_cols (combine_list stones_from_left_dias     stones_from_right_dias)) 
     stones_from_rows = map (get_from_row board) [1..board_size] 
     stones_from_cols = map (get_from_column board) [1..board_size] 
     stones_from_left_dias = map (get_from_left_diagonal board) [-(board_size-1)..(board_size-1)] 
     stones_from_right_dias = map (get_from_right_diagonal board) [2..(2*board_size)] 

我想用地图它计算整棵树前,每个子树来评价,但我不不知道如何在这里使用map ...而且我意识到如果我的代码编译了,它不会是递归。任何人都可以教我如何做?

+0

我会尽量让minimax成为递归函数。即超过极小极小的地图,而不是评估。 –

回答

2

您的实现中存在多个比Haskell更多算法问题的问题。

Minimax是一个递归算法,通过评估所有可能从某个位置到某个深度(或游戏结束)的移动来构建分数。

在递归期间,Max玩家与Min玩家交替。

从这里,minimax函数应该有棋盘,最大深度和球员类型作为参数。

喜欢的东西:

minimax :: Board -> Int -> Bool -> Int 
minimax board depth isMax = ... 

minimax也应该称自己对移动产生的所有可能的板。然后,您应用maximumminimum,具体取决于isMax参数。

另一件事是,你正试图在树上递归。 您经常在文献中看到的树只不过是minimax函数的递归调用。

换句话说,你不需要一棵树作为参数,树会通过连续调用minimax隐式构建。

作为一个方面说明,尽管从特定游戏中抽象出来,但增加一个函数来确定棋盘是否代表完成的游戏可能很有用。

+0

谢谢。还有一个问题,如何限制最大深度? – kkkjjj

+0

@kkkjjj在每次递归调用时递减'depth'参数,并且当您到达'0'时不再调用您的函数 –