我一直致力于使用 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?
任何帮助或反馈都会很棒。
F# 列表是不可变的, so if deck.IsEmpty
开始false
,它会留下来false
永远。不过,确实没有理由让事情变得如此复杂。
假设你有一个排序好的牌组。我们仅使用三张牌作为示例,但假设它是一副完整的牌:
let deck =
[
{ Suit = Hearts; Face = Queen }
{ Suit = Diamonds; Face = King }
{ Suit = Spades; Face = Ace }
]
您可以使用随机数生成器轻松打乱牌组:
let r = Random ()
let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ())
第一次创建时scrambledDeck
,在 FSI 中可能如下所示:
> let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ());;
val scrambledDeck : Card list =
[{Suit = Spades;
Face = Ace;}; {Suit = Hearts;
Face = Queen;}; {Suit = Diamonds;
Face = King;}]
但如果你再做一次,它可能看起来像这样:
> let scrambledDeck = deck |> List.sortBy (fun _ -> r.Next ());;
val scrambledDeck : Card list =
[{Suit = Spades;
Face = Ace;}; {Suit = Diamonds;
Face = King;}; {Suit = Hearts;
Face = Queen;}]
现在你已经有了一副打乱的牌,你可以简单地开始从上面拉出牌,例如为了打印它们:
scrambledDeck |> List.iter (printfn "%O")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)