我正在研究一個蜘蛛紙牌遊戲的哈斯克爾實現,既作爲學習哈斯克爾的練習,也試圖找到一個好的球員算法。哈斯克爾代表蜘蛛紙牌畫面
我正在尋找一個高效的代表畫面,其中包括低價甲板,堆棧和基礎。
對於甲板,最明顯的表示是作爲[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
基礎(已完成的套)可以表示爲任一一個[(Card King suit True)]
或簡稱爲Int
計數因爲確定獲勝遊戲只需要確認基礎大小爲8.
堆棧(玩牌)的最佳表示形式是我正在努力的部分。如果我在Scala或Clojure中編寫它,我可能會使用[Card]
的不可變(持續)Vector
。使用列表理解,矢量可以快速索引卡列表查找合法移動計算。卡片列表以頂部卡片(朝上)作爲列表的頭部存儲。將卡從一個列表移動到另一個列表可以通過drop和prepend或cons的組合來完成。
在Haskell中,我不確定這是否最適合用作卡列表或卡列表陣列,還是其他尚未找到的數據結構。
想法?
像往常一樣優秀的職位。當然,你是對的。當我第一次瞭解到f.p.時,Orwell中的列表索引操作符是'!',講師稱之爲'尖叫',但在Haskell中,它是'!!',我想很多人會稱之爲'bang-bang'。尖叫是RTS在你詢問'[xs !! 5232,xs !! 324,xs !! 3547]'和砰砰響聲就是它所反覆敲擊列表的聲音。 – AndrewC
感謝您的優秀回答。我將需要仔細考慮我將用於堆棧和卡片列表的數據結構。我會研究你提到的那些。 – Ralph
@Ralph:我用一些額外的信息編輯了答案,這可能有助於將我的建議與您在Scala或Clojure中使用的內容聯繫起來。 –