私はチェッカーのゲームのためにキャプチャ動作を試みるために、頂点と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)を'。代わりに、 '2 * fst k1 - fst k'のように' fst k1'だけを使うべきです。 –
が編集されました。フィードバックをお寄せいただきありがとうございます。 –
名前の綴りで判断すると、 'ChangeKey'は関数にすることはできません。 –