2017-01-04 6 views
1

私は頂点とData.Map.Strictを使用しています。チェッカのゲームのキャプチャ移動を実装する必要があります。 cMoveは、頂点のリストkと頂点のリストksとマップmyMapを取ると仮定されています。 cMoveは、新しい頂点(ksの頂点を越えてジャンプするときに得るkの位置)がmyMapにあるので、myMapにはボード上のすべての部分の位置が含まれているかどうかをチェックする必要があります。 kと​​(ksにおける頂点)がmyMapから除去されるべきであり、新たな頂点が新しい頂点にはそれ以上の要素が存在しなくなるまで、そうでksで次の頂点を確認するために使用されるべきmyMapに挿入されなければなりませんリスト。想定され、新しい頂点を挿入して、リスト​​を通じて異なる値を使用してキーを挿入したり削除したりしながら辞書をループする

type Key = (Integer, Integer) 

cMove :: Key -> [Key] -> Map Key Bool -> Map Key Bool 
cMove k ks myMap = foldr cMoves' myMap ks 
    where 
     cMoves' :: Key -> Map Key Bool -> Map Key Bool 
     cMoves' k1 myMap = case M.lookup k' myMap of 
      Nothing -> M.insert k' False (M.delete k myMap) 
      Just x -> myMap 
      where 
      k' = (2 * fst k1 - fst k, 2 * snd k1 - snd k) 

た反復する:私はこれを試してみました。ここでの問題は、​​が削除されず、kの代わりに新しい頂点が使用されないことです。これをどのように達成するのですか?

私の質問のいずれかがあいまいであると思われる場合は、私に知らせてください。

+3

それはちょうどあなたの質問のタイプミスかもしれませんが、あなたは 'cMove」に' k1'(タプル引数を混乱されるように表示されます。あなたにもkを含めるように折り畳みの状態を変化させることにより、それを行うことができます')と' ks'( 'cMove'へのリスト引数)です。また、 's'と' myMap'は同じ値になっていますか? – chepner

+0

それはタイプミスでした。気づいてくれてありがとう。はい、sとmyMapは同じ値になっています。混乱を避けるために質問を編集しました。 –

+0

あなたは 'M.delete k1 'ではなく' M.delete k'を呼び出しています。 – chepner

答えて

2

質問が正しいと分かっている場合は、反復から反復までkk'に変更します。

cMove :: Key -> [Key] -> Map Key Bool -> Map Key Bool 
cMove k ks myMap = snd $ foldr cMoves' (k, myMap) ks 
    where 
     cMoves' :: Key -> (Key, Map Key Bool) -> (Key, Map Key Bool) 
     cMoves' k1 (k, myMap) = case M.lookup k' myMap of 
      Nothing -> (k1, M.insert k' False . M.delete k . M.delete k1 $ myMap) 
      Just x -> (k, myMap) 
      where 
      k' = (2 * fst k1 - fst k, 2 * snd k1 - snd k) 
+0

'cMoves''は' k''ではなく次のステップで 'k1'を返すべきですか?そして、負の値を持つ頂点を挿入しないようにする方法はありますか?同様に、(-1,2)と(-2、-4)を挿入しない –

+0

いいえ、あなたが解決しようとしている特定の問題を実際に理解していないため、私は全くわかりません:)私の答えは'ks'をトラバースして' myMap'を変更しながら 'k'を変更する方法を説明しています。 – Cactus

+0

を参照してください。私は問題を発見した。 foldrはリストの最後の項目をとり、最後から最後までトラバースしますが、その逆を行う必要があります。 –

関連する問題