2016-12-30 275 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'第三次,依此类推? –