F# 用扑克牌创建手牌

时间:2021-06-19 00:03:43

标签: f#

我有这段代码可以生成一副牌,还有一个函数可以随机选择 52 张牌中的一张。我现在需要一种方法来打出牌组中五张独特的牌,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

正如我在评论中指出的,创建这手牌的一种方法是洗牌,然后从顶部取 5 张牌。

type Suit = Diamonds | Hearts | Clubs | Spades
 
type Face =
    | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
    | Jack | Queen | King | Ace
 
type Card = { Face: Face; Suit : Suit }

let allFaces = [
   Two; Three; Four; Five; Six; Seven; Eight; Nine; Ten;
   Jack; Queen; King; Ace
]

let allSuits = [ Diamonds; Hearts; Clubs; Spades ]

let fullDeck = [
    for suit in allSuits do
        for face in allFaces do
             yield { Face = face; Suit = suit } 
]

// returns a random card and the remaining deck
let GetCard (deck: Card list) =
    let rand = new System.Random()
    let idx = rand.Next(deck.Length)
    let card = deck.[idx]
    (card, List.except [card] deck)

// shuffle a deck
let rec shuffle = function
    | card :: [] -> [card]
    | deck -> let (card, rest) = GetCard deck
              card :: shuffle rest

let hand deck = deck |> shuffle |> List.take 5

fullDeck |> hand |> printfn "%A"