我正在研究一个蜘蛛纸牌玩家的 Haskell 实现,既作为学习 Haskell 的练习,又试图找到一个好的玩家算法。
我正在寻找由未处理的甲板、堆栈和基础组成的画面的有效表示。
对于卡片组,最明显的表示是[Card]
whereCard
是代数数据类型:
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 中编写此代码,我可能会使用不可变(持久)Vector
的[Card]
. 向量允许使用列表推导快速索引查找卡片列表以进行合法移动计算。卡片列表以最上面的卡片(面朝上)作为列表的头部存储。将卡片从一个列表移动到另一个列表可以通过 drop 和 prepend 或 cons 的组合来完成。
在 Haskell 中,我不确定这是否最好表示为卡片列表列表或卡片列表数组,或者我尚未找到的其他一些数据结构。
想法?