【发布时间】:2017-01-05 20:07:59
【问题描述】:
我正在使用顶点和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
我的问题在于,如果列表包含多个元组,我对如何循环遍历顶点列表一无所知(因为玩家每回合可以进行无限量的捕获)。此外,如何确保从地图中删除代表对手棋子的每个键。
【问题讨论】:
-
您不应使用如下所示的函数调用:
fst(k1)。您应该只使用fst k1,例如2*fst k1 - fst k。 -
已编辑。感谢您的反馈。
-
从名字的拼写来看,
ChangeKey不可能是函数。 -
编辑修复
changeKey大写。
标签: haskell dictionary recursion