我一直致力于使用F#对流行的纸牌游戏(情书)进行建模,以了解有关函数式编程的更多信息 .
module Game =
open Cards
open Players
type Deck = Card list
let dealACard (deck:Deck) =
let randomGenerator = System.Random()
let index = randomGenerator.Next deck.Length
let card = deck.Item index
(card, (deck |> List.filter((<>) card)))
let createPlayer playerNumber deck =
let card, newDeck = dealACard deck
({cards=[card]; playerNumber=playerNumber}, newDeck)
我一直做得很好,直到我知道如何模拟如何绘制卡片 . 为了测试这个,我想从牌组中抽出所有牌 . 我的程序看起来像这样:
let deck = createDeck
while not deck.IsEmpty do
let card, newDeck = dealACard deck
// print the card
// how do I update the deck?
任何帮助或反馈都会很棒 .
2 回答
您可以使用
List.sortBy
对牌组进行随机播放,然后在dealACard
方法中执行头尾模式匹配以返回顶牌的Option
和新牌组None
如果牌组中没有其他牌 .您还可以通过允许应用随机数生成函数来使
shuffle
成为更高阶函数示例用法
每条评论增加
要以不可变的方式跟踪卡组的当前状态,您可能会有某种递归函数接受卡组
F#列表是 immutable ,所以如果
deck.IsEmpty
开始false
,它将永远保留false
. 但是,没有理由让事情变得如此复杂 .假设您有一个已排序的牌组 . 我们只使用三张牌作为例子,但假设它是一个完整的牌组:
您可以使用随机数生成器轻松地对卡座进行加扰:
第一次创建
scrambledDeck
时,它在FSI中可能如下所示:但如果你再次这样做,它可能看起来像这样:
现在你有一个混乱的牌组,你可以简单地开始拉出牌,例如为了打印它们: