2016-12-30 197 views
1

我正在使用頂點和Data.Map嘗試爲跳棋遊戲製作捕捉棋步。我正在使用函數changeKey來更新地圖中的當前鍵和函數cMove以使捕捉移動。現在,cMove需要一個頂點,頂點列表(與對手棋子一起)以及包含頂點和布爾值的地圖來指示棋子屬於哪個棋手。 cMove檢查第一個頂點元組是否在地圖中(以知道板上的位置是否爲空,因爲計算髮現有效移動的位置)。如果是,將會調用changeKey循環遍歷字典並刪除鍵

changeKey :: (Integer, Integer) -> (Integer, Integer) -> Map (Integer, Integer) Bool -> Map (Integer, Integer) Bool 
changeKey k0 k1 myMap = case M.updateLookupWithKey (\_ _ -> Nothing) k0 myMap of 
     (Nothing, _ ) -> myMap 
     (Just e, myMap) -> M.insert k1 e myMap 

cMove :: (Integer, Integer) -> [(Integer, Integer)] -> Map (Integer, Integer) Bool -> Map (Integer, Integer) Bool 
cMove k [k1] myMap = if M.notMember (2*fst k1 - fst k, 2*snd k1 - snd k) myMap 
          then 
          changeKey k (2*fst k1 - fst k, 2*snd k1 - snd k) myMap 
          else myMap 

這裏我的問題就在於,我在黑暗中與如何我可以通過頂點列表,如果列表中包含多於一個元組(作爲球員能做捕獲的無限量的環每回合)。此外,我如何確保代表對手棋子的每個鍵都將從地圖上刪除。

+1

你不應該使用函數調用看起來像這樣的:'FST(K1) '。你應該改用'fst k1',就像'2 * fst k1 - fst k'一樣。 –

+0

已修改。感謝您的反饋。 –

+0

通過名稱的拼寫判斷,'ChangeKey'不能作爲函數。 – 2016-12-31 00:08:50

回答

2

首先,the documentation for Data.Map建議您在您喜歡的環境下使用Data.Map.Strict而不是Data.Map

此外,函數名稱通常應以小寫字母開頭。


有了這樣的方式,一個簡單的方法做迭代這裏是fold the elements of a list爲最終結果Map。你寫一個函數來處理一個迭代(見下面的cMove'),然後你使用類似foldrfoldl'的東西來讓它爲你做所有的迭代。

我不知道,如果下面給你你想要的行爲,但這裏的使用foldr第一稿:

import Data.Map.Strict (Map(..)) 
import qualified Data.Map.Strict as M 

changeKey :: (Integer, Integer) -> (Integer, Integer) -> Map (Integer, Integer) Bool -> Map (Integer, Integer) Bool 
changeKey k0 k1 myMap = case M.updateLookupWithKey (\_ _ -> Nothing) k0 myMap of 
     (Nothing, _ ) -> myMap 
     (Just e, myMap) -> M.insert k1 e myMap 

cMove :: (Integer, Integer) -> [(Integer, Integer)] -> Map (Integer, Integer) Bool -> Map (Integer, Integer) Bool 
cMove k ks myMap = foldr (cMove' k) myMap ks 
    where 
    cMove' :: (Integer, Integer) -> (Integer, Integer) -> Map (Integer, Integer) Bool -> Map (Integer, Integer) Bool 
    cMove' k k1 myMap = if M.notMember (2*fst k1 - fst k, 2*snd k1 - snd k) myMap 
           then changeKey k (2*fst k1 - fst k, 2*snd k1 - snd k) myMap 
           else myMap 
+0

它到達那裏。一個問題是,新的k沒有被用於其餘的列表,但是舊的是。爲了澄清,每當changeKey被調用時,cMove應該使用新的頂點k而不是原來的頂點。 –

+0

所以如果列表是'[a,b,c,d,e]',它應該首次使用'k'和'​​a',第二次使用'a'和'b','b'和' c'第三次,依此類推? –