open List open Cards type ingame_cards = card list type player = { name: string ; cards: card list } type table = { deck: card list ; ingame: ingame_cards; players: player list } let deck = Cards.init let card, _ = draw deck;; Printf.printf "%a\n" print_card card (* Mosse: Aggiunta, spostamento *) (* Triplette giocabili in mano, doppie usabili, singole usabili una volta vista la mano, rimuovi le carte inusabili nel turno; considerata una carta giocabile in mano, considera le carte "prossime", bruteforce; *) type status = | Valid | Invalid | Unknown ;; let no_double_seed cards = List.sort_uniq Cards.seed_cmp cards |> List.length = List.length cards let is_only_one_seed cards = List.sort_uniq Cards.seed_cmp cards |> List.length = 1 let no_double_value cards = List.sort_uniq Cards.value_cmp cards |> List.length = List.length cards let is_tris cards = match (List.sort_uniq Cards.value_cmp cards) with | [_] -> no_double_seed cards (* only one value, check for right seeds *) | _::_ -> false | [] -> assert false let rec split l fst = match l with | hd::hd'::tl when hd=hd'-1 -> split (hd'::tl) (fst@[hd]) | hd::tl -> fst@[hd], tl | [] -> assert false let is_scala _cards = let rec _is_scala cards = match cards with | hd::hd'::tl when hd=hd'-1 -> _is_scala (hd'::tl) | [] -> assert false | [_] -> true (* list was consumed *) | _::_ -> false in if (not (no_double_value _cards && is_only_one_seed _cards)) then false else let last = List.rev _cards |> hd in let cards = List.map (fun c -> c.value) _cards (* use only values *) in if last.value = 13 && (hd cards) = 1 then (* circolare *) let fst, snd = split cards [] in (_is_scala fst) && (_is_scala snd) else _is_scala cards let is_valid _cards = let cards = List.sort Cards.value_cmp _cards in if length cards < 3 then false else match cards with | a::b::_ when Cards.value_cmp a b = 0 -> is_tris cards | _ -> is_scala cards;; let rec play cards = true let start_play ingame cards = ingame @ cards |> List.sort Cards.value_cmp |> play ;; (* TESTS TODO: *) let cards = [{seed=Clovers; value=1}; {seed=Hearts; value=1}; {seed=Pikes; value=1}] in assert (is_valid cards);; let cards = [{seed=Tiles; value=1}; {seed=Clovers; value=1}; {seed=Hearts; value=1}; {seed=Pikes; value=1}] in assert (is_valid cards);; let cards = [{seed=Tiles; value=2}; {seed=Clovers; value=1}; {seed=Hearts; value=1}; {seed=Pikes; value=1}] in assert (not (is_valid cards));; let cards = [{seed=Hearts; value=2}; {seed=Hearts; value=2}; {seed=Hearts; value=4}] in assert (not (no_double_value cards));; let cards = [{seed=Hearts; value=2}; {seed=Hearts; value=2}; {seed=Hearts; value=4}] in assert (not (no_double_seed cards));; let cards = [{seed=Pikes; value=2}; {seed=Clovers; value=2}; {seed=Tiles; value=4}; {seed=Hearts; value=4}] in assert (no_double_seed cards);; let cards = [{seed=Hearts; value=4}; {seed=Hearts; value=3}; {seed=Hearts; value=2}; {seed=Hearts; value=1}] in assert (is_valid cards);; let cards = [{seed=Hearts; value=13}; {seed=Hearts; value=12}; {seed=Hearts; value=2}; {seed=Hearts; value=1}] in assert (is_valid cards);; let cards = [{seed=Pikes; value=13}; {seed=Hearts; value=12}; {seed=Hearts; value=2}; {seed=Hearts; value=1}] in assert (not (is_valid cards));; let cards = [{seed=Pikes; value=13}; {seed=Pikes; value=12}; {seed=Pikes; value=1}] in assert (is_valid cards);; let cards = [{seed=Hearts; value=12}; {seed=Pikes; value=12}; {seed=Pikes; value=1}] in assert (not (is_valid cards));; let cards = [{seed=Hearts; value=13}; {seed=Hearts; value=3}; {seed=Hearts; value=2}; {seed=Hearts; value=1}] in assert (is_valid cards);; let cards = [{seed=Hearts; value=1}] in let ingame = [{seed=Hearts; value=13}; {seed=Hearts; value=3}; {seed=Hearts; value=2}] in assert (play ingame cards);; let cards = [{seed=Tiles; value=12}; {seed=Tiles; value=13}; {seed=Pikes; value=3}; {seed=Clovers; value=3}] in let ingame = [{seed=Hearts; value=1}; {seed=Hearts; value=13}; {seed=Hearts; value=12}; {seed=Pikes; value=1}; {seed=Clovers; value=1}; {seed=Tiles; value=1}; {seed=Hearts; value=2}; {seed=Pikes; value=2}; {seed=Clovers; value=2}] in assert (start_play ingame cards);; (* Risultato: scala 1-2-12-13 Hearts; scala 1-2-3 Pikes; scala 1-2-3 Clovers; scala 1-13-12 Tiles *)