私は、Haskellを学び、優れたプレーヤーアルゴリズムを見つけようとする演習として、SpiderSolitaireプレーヤーのHaskell実装に取り組んでいます。
私は、タブローの効率的な表現を探しています。これは、アンディールデッキ、スタック、およびファンデーションで構成されています。
デッキの場合、最も明白な表現は、代数的データ型が[Card]
どこにあるかです。Card
data Rank = Ace
| Two
| Three
| Four
| Five
| Six
| Seven
| Eight
| Nine
| Ten
| Jack
| Queen
| King
deriving (Bounded, Enum, Eq, Ord)
data Suit = Clubs
| Diamonds
| Hearts
| Spades
deriving (Bounded, Enum, Eq, Ord)
data Card = Card
{ rank :: Rank
, suit :: Suit
, faceUp :: Bool
} deriving (Bounded, Eq, Ord)
-- I omitted the instance Show ... implementations
ファンデーション(完成したスーツ)は、ファンデーションのサイズが8であることを確認するだけで勝つゲームを決定する必要があるため、完成したスーツの数[(Card King suit True)]
または単にカウントとして表すことができます。Int
スタック(場にあるカード)の最良の表現は、私が苦労している部分です。これをScalaまたはClojureで書いている場合、おそらくの不変(永続的)Vector
を使用し[Card]
ます。ベクトルを使用すると、リスト内包表記を使用して、合法的な移動計算のためにカードリストをすばやくインデックスで検索できます。カードリストは、一番上のカード(上向き)をリストの先頭として保存されます。あるリストから別のリストへのカードの移動は、ドロップとプリペンドまたは短所を組み合わせて行うことができます。
Haskellでは、これがカードリストのリストまたはカードリストの配列、あるいは私がまだ見つけていない他のデータ構造として最もよく表されているかどうかはわかりません。
考え?