Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.53 KB | None | 0 0
  1. #use "CPutilwindows.ml";;
  2.  
  3. type t_card_color = HEART | DIAMOND | SPADE | CLUB;;
  4. type t_card_rank = int;;
  5. type t_card = { color : t_card_color ; rank : t_card_rank };;
  6.  
  7. let create_card(card_col , card_rank : t_card_color * t_card_rank) : t_card =
  8. {color = card_col; rank = card_rank};;
  9.  
  10. let cardCol_of_int (i : int) : t_card_color =
  11. if i<1 || i>4
  12. then failwith "erreur"
  13. else if i=1
  14. then HEART
  15. else if i=2
  16. then DIAMOND
  17. else if i=3
  18. then SPADE
  19. else CLUB;;
  20.  
  21. let cardRank52_of_int (i:int) : t_card_rank =
  22. if i<1 || i>13
  23. then failwith "erreur"
  24. else i;;
  25.  
  26. let card_of_int52(i : int) : t_card =
  27. if i > 0 && i < 14
  28. then {color = HEART ; rank = i}
  29. else if i > 13 && i < 27
  30. then { color = DIAMOND ; rank = (i-13)}
  31. else if i > 26 && i < 40
  32. then { color = SPADE ; rank = (i-26)}
  33. else if i > 52 || i<1
  34. then failwith "error"
  35. else { color = CLUB ; rank = (i-39)} ;;
  36.  
  37. card_of_int52(16);;
  38.  
  39. let cardRank32_of_int(i : int) : t_card_rank =
  40. if i<1 || i>8
  41. then failwith"erreur"
  42. else if i = 1
  43. then 1
  44. else i+5;;
  45.  
  46. let card_of_int32me(i : int) : t_card =
  47. if i > 0 && i < 9
  48. then {color = HEART ; rank = cardRank32_of_int(i)}
  49. else if i >8 && i <17
  50. then {color = DIAMOND ; rank = cardRank32_of_int(i-8)}
  51. else if i > 16 && i < 25
  52. then { color = SPADE ; rank =cardRank32_of_int(i-16)}
  53. else if i > 24
  54. then {color = CLUB ; rank = cardRank32_of_int(i-24)}
  55. else failwith"erreur";;
  56.  
  57. let card_of_int32 (i:int) : t_card =
  58. if i<1 || i>32
  59. then failwith"erreur"
  60. else {color = cardCol_of_int(((i- 1)/8)+1); rank = cardRank32_of_int(((i-1) mod 8) + 1)};;
  61.  
  62. card_of_int32me(7);;
  63.  
  64. let rec make_deck32aux (i, list : int * t_card list) : t_card list =
  65. if len(list) = 32
  66. then list
  67. else make_deck32aux(i+1, add_nth(list, card_of_int32(i), i-1));;
  68.  
  69. let make_deck32() : t_card list =
  70. make_deck32aux (1,[]);;
  71.  
  72. make_deck32();;
  73.  
  74.  
  75. let rec make_deck52aux (i, list : int * t_card list) : t_card list =
  76. if len(list) = 52
  77. then list
  78. else make_deck52aux(i+1, add_nth(list, card_of_int52(i), i-1));;
  79.  
  80. let make_deck52() : t_card list =
  81. make_deck52aux (1,[]);;
  82.  
  83. make_deck52();;
  84.  
  85.  
  86.  
  87. let rec shuffle(deck, deck_len : t_card list * int) : t_card list =
  88. if deck_len <> 0
  89. then let a = rand_int(0,deck_len-1) in
  90. add_fst(shuffle(rem_nth(deck,a),(deck_len - 1)), nth(deck, a))
  91. else []
  92. ;;
  93. shuffle(make_deck52(), 52);;
  94.  
  95. let deck : t_card list = make_deck32();;
  96. shuffle(deck,32);;
  97.  
  98. type t_param = { nbplayer : int ; nbcard_deck : int; nbturn:int ; nb_card_given : int; nbcard_start:int};;
  99.  
  100. let get_nbplayer (p : t_param) : int = p.nbplayer;;
  101. let get_nbcard_deck (p: t_param) : int = p.nbcard_deck;;
  102. let get_nbcard_star ( p :t_param) : int = p.nbcard_start;;
  103. let get_nbturn ( p: t_param) : int = p.nbturn;;
  104. let get_nb_card_given (p: t_param) : int = p.nb_card_given;;
  105.  
  106. let valid_param(p : t_param) : bool =
  107. if p.nbcard_deck = 52 || p.nbcard_deck = 32
  108. then p.nbcard_start + p.nb_card_given * p.nbplayer * p.nbturn = p.nbcard_deck
  109. else false;;
  110.  
  111. let init_deck(p:t_param) : t_card list =
  112. if not(valid_param(p))
  113. then failwith "error valid param"
  114. else if p.nbcard_deck = 32
  115. then shuffle(make_deck32(), 32)
  116. else shuffle(make_deck52(), 52)
  117. ;;
  118.  
  119. type t_player = {id : int; hand_deck : t_card list ref; cemetery_deck : t_card list ref};;
  120.  
  121. let create_player(number : int) : t_player =
  122. {id = number; hand_deck = ref []; cemetery_deck = ref []}
  123. ;;
  124.  
  125. let make_players( p :t_param) : t_player list =
  126. let liste : t_player list ref = ref [] in
  127. for i = 0 to p.nbplayer-1
  128. do
  129. liste := add_fst(!liste, create_player(i+1));
  130. done;
  131. !liste;;
  132.  
  133. let rec make_players_aux(p,n :t_param*int) : t_player list =
  134. if n = 0
  135. then []
  136. else add_lst((make_players_aux(p, n-1)), {id = n; hand_deck = []; cemetery_deck = []});;
  137.  
  138. let make_playersv2(p : t_param) : t_player list =
  139. make_players_aux(p, p.nbplayer);;
  140.  
  141. let make_playersV3(p : t_param) : t_player array =
  142. let tab : t_player array = arr_make(get_nbplayer(p),create_player(0)) in
  143. for i = 0 to (get_nbplayer(p) - 1)
  144. do
  145. tab.(i) <- create_player(i+1);
  146. done;
  147. tab
  148. ;;
  149. make_playersV3({ nbplayer = 3 ; nbcard_deck = 32; nbturn = 3 ; nb_card_given = 3; nbcard_start = 3});;
  150.  
  151. let distribute_aux(player, deck : t_player*t_card list ref) : unit =
  152. player.hand_deck := add_fst(!(player.hand_deck), fst(!deck));
  153. deck := rem_fst(!deck);;
  154. let distribute(players, deck, p : t_player array * t_card list ref * t_param) : unit =
  155. while not(!deck = [])
  156. do
  157. for i = 0 to (p.nbplayer - 1)
  158. do
  159. distribute_aux(players.(i), deck);
  160. done;
  161. done;
  162. ;;
  163.  
  164. let distribute_4cards(players, deck, p : t_player array * t_card list ref * t_param) : unit =
  165. for i = 1 to p.nb_card_given
  166. do
  167. distribute(players, deck, p);
  168. done;
  169. ;;
  170.  
  171. (*let distribute(players, deck, p : t_player array * t_card list ref * t_param): unit =
  172. while not(!deck=[])
  173. do
  174. for i = 1 to p.nb_card_given
  175. do
  176. for i = 1 to p.nbplayer
  177. do
  178. players.(i).hand_deck := add_fst(!(players.(i).hand_deck), fst(!deck));
  179. deck:= rem_fst(!deck)
  180. done;
  181. done;
  182. done;
  183.  
  184. ;;
  185. *)
  186.  
  187. let rec fill_board(board, deck, p : t_card list ref * t_card list ref * t_param) : unit =
  188. if len(!deck) = 0 || len (!board) = p.nbcard_start
  189. then ()
  190. else
  191. (board := add_fst(!board, fst(!deck));
  192. deck := rem_fst(!deck);
  193. fill_board(board, deck, p));;
  194.  
  195.  
  196. let compute_maxlen_cemetery(players, p : t_player array * t_param) : int =
  197. let a : int ref = ref 0 in
  198. for i = 0 to (p.nbplayer -1)
  199. do
  200. if len(!(players.(i).cemetery_deck)) > !a;
  201. then a:= len(!(players.(i).cemetery_deck));
  202. done;
  203. !a;;
  204.  
  205. let compute_winners(players, p : t_player array * t_param) : int list =
  206. let b : int list ref = ref [] in
  207. let max : int = compute_maxlen_cemetery(players,p) in
  208. for i = 0 to (p.nbplayer - 1)
  209. do
  210. if max = len(!(players.(i).cemetery_deck));
  211. then b := add_lst(!b,players.(i).id);
  212. done;
  213. !b;;
  214.  
  215. let same_card_rank(card_1, card_2 : t_card * t_card) : bool =
  216. card_1.rank = card_2.rank;;
  217.  
  218. let rec aux(board , card, n : t_card list * t_card * int ) : bool * int =
  219. if board = []
  220. then (false, 0)
  221. else
  222. if same_card_rank(fst(board),card)
  223. then (true,n)
  224.  
  225. else aux(rem_fst(board), card, n +1)
  226. ;;
  227. let find_index_in_board(board, card : t_card list * t_card) : bool * int =
  228. aux(board,card, 0);;
  229.  
  230. find_index_in_board([{color = CLUB; rank = 10}], {color = CLUB; rank = 10});;
  231.  
  232. let rec find_pair_aux(board, hand, n: t_card list * t_card list * int): bool * int * int =
  233. if hand = []
  234. then (false, 0, 0)
  235. else
  236. let(found, number): bool * int = find_index_in_board(board, fst(hand)) in
  237. if found = true
  238. then (true, number, n)
  239. else find_pair_aux(board, rem_fst(hand), (n +1))
  240.  
  241. ;;
  242.  
  243. let find_pair(board, hand: t_card list * t_card list): bool * int * int =
  244. find_pair_aux(board, hand, 0);;
  245.  
  246. find_pair([ {color = SPADE; rank = 10};
  247. {color = DIAMOND; rank = 11};
  248. {color = HEART; rank = 10};
  249. {color = CLUB; rank = 10}], [{color = SPADE; rank = 9};
  250. {color = DIAMOND; rank = 11};
  251. {color = HEART; rank = 10};
  252. {color = CLUB; rank = 9}]);;
  253. let play_one_player(board, players, ind_players : t_card list ref * t_player array * int) : unit =
  254. if players.(ind_players).hand_deck = ref []
  255. then failwith " main du joueur vide"
  256. else
  257. let (found, int1, int2): bool*int*int = find_pair(!board, !(players.(ind_players).hand_deck)) in
  258. let random : int = rand_int(0, len(!(players.(ind_players).hand_deck))) in
  259. if found = true
  260. then(
  261. players.(ind_players).cemetery_deck := add_fst(!(players.(ind_players).cemetery_deck),nth(!board,int1));
  262. players.(ind_players).cemetery_deck := add_fst(!(players.(ind_players).cemetery_deck),nth(!(players.(ind_players).hand_deck),int2));
  263. board := rem_nth(!board,int1);
  264. players.(ind_players).hand_deck := rem_nth(!(players.(ind_players).hand_deck),int2);
  265. )
  266. else (
  267. board := add_nth(!board, nth(!(players.(ind_players).hand_deck),random), 0);
  268. players.(ind_players).hand_deck := rem_nth(!(players.(ind_players).hand_deck),random);
  269. )
  270. ;;
  271. let board_test : t_card list ref =ref [{color = SPADE; rank = 10};
  272. {color = DIAMOND; rank = 10};
  273. {color = HEART; rank = 10};
  274. {color = CLUB; rank = 10}]
  275. ;;
  276.  
  277. let players_test : t_player array = [|{id = 1; hand_deck = ref [{color = SPADE; rank = 11};
  278. {color = DIAMOND; rank = 3};
  279. {color = HEART; rank = 11};
  280. {color = CLUB; rank = 8}] ; cemetery_deck = ref []};
  281. {id = 2; hand_deck = ref [{color = SPADE; rank = 3};
  282. {color = DIAMOND; rank = 1};
  283. {color = HEART; rank = 1};
  284. {color = CLUB; rank = 8}] ; cemetery_deck = ref []} |];;
  285. play_one_player(board_test, players_test, 0);;
  286. board_test;;
  287. players_test;;
  288.  
  289. let play_one_turn(board, players, deck, p : t_card list ref * t_player array * t_card list ref * t_param) : unit =
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement