1

カードのデッキを表すために使用しているベクトルのベクトルがあります。

[["A" "D"] ["K" "H"] ["K" "C"] ["K" "S"] ["K" "D"] ["Q" "H"] ["Q" "C"] ["Q" "S"]
 ["Q" "D"] ["J" "H"] ["J" "C"] ["J" "S"] ["J" "D"] ["T" "H"] ["T" "C"] ["T" "S"]
 ["T" "D"] ["9" "H"] ["9" "C"] ["9" "S"] ["9" "D"] ["8" "H"] ["8" "C"] ["8" "S"]
 ["8" "D"] ["7" "H"] ["7" "C"] ["7" "S"] ["7" "D"] ["6" "H"] ["6" "C"] ["6" "S"]
 ["6" "D"] ["5" "H"] ["5" "C"] ["5" "S"] ["5" "D"] ["4" "H"] ["4" "C"] ["4" "S"]
 ["4" "D"] ["3" "H"] ["3" "C"] ["3" "S"] ["3" "D"] ["2" "H"] ["2" "C"] ["2" "S"]
 ["2" "D"]]

ある時点で、私はいくつかのカードを「取引」し、それらのカードをデッキから取り除きたいと思います。

seqを使用するように指示したい場合も問題ありませんが、実際には私のオリジナルはベクトルのseqであったため、どちらの方法でもかまいません。

「remaining-deck」のアトムを作成し、このシーケンスまたはベクトルからアイテムを削除したいと思うことは知っています。

私はこれをオープンソース化することを計画しています、そしてこれはコードの適切な部分です:

(def suits ["H" "C" "S" "D"])
(def ranks ["A" "K" "Q" "J" "T" "9" "8" "7" "6" "5" "4" "3" "2"])

(def deck (for [x ranks
                y suits]
            [x y]))


;; alternative deck that creates vector:

(def deck2 (vec (for [x ranks
                y suits]
            [x y])))

;;Another way to do it: While it's fine if I have a sequence of string pairs, I'd rather use vectors of vectors because I think destructuring will work better plus I think it'll be consistent across the program. 

(def deck3 (for [x ranks
                y suits]
            (str x y)))


(def hand [(rand-nth deck) (rand-nth deck)])

(def full-hand (concat board hand))

いくつかの.indexOf関数を使用してそれをアトムに投げ込むことでサブベックを連結できるように見えますが、これはハッキーであり、Lispはこれよりもうまくいくはずだと思わずにはいられません。私はこれに関する良い情報をどこにも真剣に見つけることができません。私は削除とフィルタリングを知っていますが、それらはエラーをスローする以外に何もしていないようです。


編集:なぜ反対票を投じるのですか?カードを配った後、単にデッキを更新しようとしています。

したがって、私がより小さなデッキを代表していた場合:

[["A" "D"] ["K" "H"] ["K" "C"] ["K" "S"] ["K" "D"] ["Q" "H"] ["Q" "C"] ["Q" "S"]]

次に、(例:プレーヤーが取引["Q" "S"] ["Q" "C"]から更新した後、残りのデッキは次のようになります。

[["A" "D"] ["K" "H"] ["K" "C"] ["K" "S"] ["K" "D"] ["Q" "H"]]

残りの取引中に共有ハンドや重複カードがないようにします。

4

2 に答える 2

2

あなたの質問を正しく理解したかどうかはわかりませんが、私が集めたものは何でも、アトムに包まれたセットとしてデッキを表現し、それぞれの手でアトムを更新します。

(def suits ["H" "C" "S" "D"])
(def ranks ["A" "K" "Q" "J" "T" "9" "8" "7" "6" "5" "4" "3" "2"])

(def deck (atom  (->> (for [x ranks
                            y suits]
                        [x y])
                      (into #{}))))

(defn hand []
  (-> (rand-int (count @deck))
      (drop @deck)
      (first)))

(defn play-hand []
  (swap! deck clojure.set/difference #{(hand)}))

(play-hand)
于 2013-03-23T08:09:38.533 に答える
1

すでに回答が受け入れられていることは承知していますが、ここで州を紹介したいと思いますか?deckパラメータとしてパススルーなどを検討したいとhand思います。手を並行して扱いたい場合はどうなりますか?

于 2013-03-24T13:44:18.177 に答える