2016-11-07 87 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'時不再調用您的函數 –