type suit = Hearts | Diamonds | Clubs | Spades;; type card = Ace of suit | King of suit | Queen of suit | Jack of suit | Num of suit * int;; let generate_deck = let rec generate_list n m = if n = m then [m] else n :: (generate_list (n + 1) m) and generate_num_for_suit s = List.map (fun n -> Num (s, n)) (generate_list 2 10) and generate_suit s = Ace s :: King s :: Queen s :: Jack s :: generate_num_for_suit s in fun () -> List.fold_right (fun s y -> generate_suit s @ y) [Hearts;Diamonds;Clubs;Spades] [];; let name_of_suit s = match s with | Diamonds -> "Diamonds" | Hearts -> "Hearts" | Clubs -> "Clubs" | Spades -> "Spades";; let name_of_card c = match c with | Ace s -> "Ace of " ^ name_of_suit s | King s -> "King of " ^ name_of_suit s | Queen s -> "Queen of " ^ name_of_suit s | Jack s -> "Jack of " ^ name_of_suit s | Num (s,n) -> string_of_int n ^ " of " ^ name_of_suit s;; let rec all_but_nth n l = match l with | [] -> [] | x::xs -> match n with | 0 -> xs | _ -> x :: all_but_nth (n-1) xs;; let shuffle_deck d = let () = Random.self_init() in let rec pick_until_done d = match d with | [] -> [] | _ -> let n = Random.int (List.length d) in (List.nth d n) :: (pick_until_done (all_but_nth n d)) in pick_until_done d;; let deal d = match d with | (a::b::c::d::e::fs) -> [a;b;c;d;e],fs | _ -> [],d;; let print_hand hand = List.map (fun c -> name_of_card c) hand;; let match_card_rank (c, c') = match (c,c') with | (Ace s, Ace s') -> true | (King s, King s') -> true | (Queen s, Queen s') -> true | (Jack s, Jack s') -> true | (Num (s, n), Num (s', n')) -> if n = n' then true else false | (_,_) -> false;;