fork download
  1. (**************Interfacer avec le terminal******1************)
  2. type joueur ={prenom : string; mutable credit : int; mutable nbre_batailles_gagnees : int};;
  3.  
  4. (**************Avant de jouer ...****************************)
  5. type couleur = Coeur | Carreau | Trefle | Pique;;
  6.  
  7. type carte = C of int * couleur;;
  8. let c = C(10,Coeur);;
  9. let nc = C(15,Carreau);;
  10.  
  11. let valide carte =
  12. let C(n,c) = carte in (n > 0) && (n < 14)
  13. ;;
  14. valide c;;
  15. valide nc;;
  16.  
  17. let string_of_couleur = function
  18. |Coeur -> "Coeur"
  19. |Carreau -> "Carreau"
  20. |Trefle -> "Trefle"
  21. |Pique -> "Pique"
  22. ;;
  23. string_of_couleur Trefle;;
  24.  
  25. let string_of_num = function
  26. |1 -> "As de"
  27. |11 -> "Valet de"
  28. |12 -> "Dame de"
  29. |13 -> "Roi de"
  30. |k -> (string_of_int k)^" de"
  31. ;;
  32. string_of_num 6;;
  33. string_of_num 12;;
  34.  
  35. let rec affiche_liste_cartes cl =
  36. let rec aux = function
  37. |[] -> "Il n'y a pas de cartes."
  38. |h::t when not (valide h) -> failwith "Ce ne sont pas des cartes !"
  39. |[x] (*Fin de l'affichage*) -> let C(n,c) = x in
  40. (string_of_num n)^" "^(string_of_couleur c)^"."
  41. |h::t (*La première carte est valide*) -> let C(n,c) = h in
  42. (string_of_num n)^" "^(string_of_couleur c)
  43. ^", "^(aux t)
  44. in
  45. print_string (aux cl)
  46. ;;
  47. let lcv = [];;
  48. let lc = [C(1,Coeur) ; C(10,Pique) ; C(13,Trefle)];;
  49. (*affiche_liste_cartes lcv;;
  50. affiche_liste_cartes lc;;*)
  51.  
  52. let genere_jeu () =
  53. let rec aux n l =
  54. match n with
  55. |0 -> l
  56. |m when (m > 0)&&(m < 14) -> aux (m-1) (C(m,Coeur)::l)
  57. |m when (m > 13)&&(m < 27) -> aux (m-1) (C(m-13,Carreau)::l)
  58. |m when (m > 26)&&(m < 40) -> aux (m-1) (C(m-26,Trefle)::l)
  59. |m when (m > 39)&&(m < 53) -> aux (m-1) (C(m-39,Pique)::l)
  60. |m -> failwith "Probleme dans la fonction aux de genere_jeu"
  61. in
  62. aux 52 []
  63. ;;
  64. genere_jeu();;
  65.  
  66. let rec genere_mini_jeu = function
  67. |m when m < 14 -> C(m,Coeur)::C(m,Pique)::(genere_mini_jeu (m+1))
  68. |_ -> []
  69. ;;
  70. genere_mini_jeu 13;;
  71. genere_mini_jeu 5;;
  72.  
  73.  
  74. let rec liste_nth n l = (*Fonction auxiliaire à mélanger : permet de prendre un élèment de numéro donné dans la liste et renvoie l'élement et la liste restante.*)
  75. match l with
  76. |[] -> failwith "liste vide"
  77. |h::t -> match n with
  78. |0 -> h,t
  79. |_ -> let e,r = liste_nth (n-1) t in e,h::r
  80. ;;
  81.  
  82. (*On crée une nouvelle liste ; on prend un élement aléatoire dans la première,
  83. on l'ajoute à la nouvelle liste tout en le supprimant de la première.*)
  84.  
  85. let melanger (cl : carte list) : carte list =
  86. Random.self_init ();
  87. let rec aux l1 l2 =
  88. match l1 with
  89. |[] -> l2
  90. |_ -> let n = Random.int (List.length l1) in
  91. let e,r = liste_nth n l1 in
  92. aux r (e::l2)
  93. in
  94. aux cl []
  95. ;;
  96. lc;;
  97. melanger lc;;
  98.  
  99. let rec distribue (cl : carte list) : carte list * carte list =
  100. match cl with
  101. |[] -> [],[]
  102. |[x] -> [x],[]
  103. |h1::h2::t -> let l1,l2 = distribue t in h1::l1,h2::l2
  104. ;;
  105. lc;;
  106. distribue [];;
  107. distribue [C(1,Coeur)];;
  108. distribue lc;;
  109.  
  110. let rec piocher (n : int) (cl : carte list) : (carte list * carte list) =
  111. match n,cl with
  112. |0,[] -> [],[]
  113. |_,[] -> failwith "Il n'y a pas assez de cartes dans la pioche !"
  114. |0,l -> [],l
  115. |n,h::t -> let p,pr = piocher (n-1) t in h::p,pr
  116. ;;
  117. lc;;
  118. piocher 0 lc;;
  119. piocher 0 [];;
  120. piocher 1 lc;;
  121. piocher 3 lc;;
  122. (*piocher 4 lc;;*)
  123.  
  124. let rec empiler_cartes (mc : carte list) (t : carte list) : carte list =
  125. match t with
  126. |[] -> mc
  127. |h::tl -> h::(empiler_cartes mc tl)
  128. ;;
  129. lc;;
  130. empiler_cartes lc [C(7,Carreau)];;
  131. empiler_cartes [C(7,Carreau);C(8,Carreau)] lc;;
  132.  
  133.  
  134.  
  135. (*****************************Blackjack************************************)
  136.  
  137. type plateau_blackjack = carte list (*Cartes du joueur*) *
  138. carte list (*Cartes de la banque*) * carte list (*Pioche*)
  139. ;;
  140.  
  141. let creer_blackjack () : plateau_blackjack = [],[],melanger (genere_jeu());;
  142. let p = creer_blackjack();;
  143.  
  144. let banque_pioche (n : int) (p : plateau_blackjack) : plateau_blackjack =
  145. let cj,cb,pi = p in
  146. let o,r = piocher n pi in
  147. cj,o@cb,r
  148. ;;
  149. banque_pioche 0 p = p;;
  150. banque_pioche 52 p;;
  151.  
  152. let joueur_pioche (n : int) (p : plateau_blackjack) : plateau_blackjack =
  153. let cj,cb,pi = p in
  154. let o,r = piocher n pi in
  155. o@cj,cb,r
  156. ;;
  157. joueur_pioche 0 p = p;;
  158. joueur_pioche 52 p;;
  159.  
  160. let valeur = function
  161. |11 |12 |13 -> 10
  162. |k -> k
  163. ;;
  164. valeur 12;;
  165. valeur 9;;
  166.  
  167. let rec total_cartes cl =
  168. match cl with
  169. |[] -> 0
  170. |h::t -> let C(k,c) = h in
  171. (valeur k) + total_cartes t
  172. ;;
  173. lc;;
  174. total_cartes lc;;
  175.  
  176. let faire_jouer_banque p =
  177. let rec aux t pl =
  178. match t with
  179. |n when n < 17 -> (let cj,cb,pi = banque_pioche 1 pl in
  180. match cb with
  181. |[] -> failwith "Probleme de pioche."
  182. |C(k,c)::ta -> aux (n+ (valeur k)) (cj,cb,pi))
  183. |_ -> pl
  184. in
  185. let pj,pb,ppi = p in
  186. let n = total_cartes pb in
  187. aux n p
  188. ;;
  189. let pm = let j,b,pi = p in j,b,melanger pi;;
  190. faire_jouer_banque pm;;
  191.  
  192.  
  193. let afficher_jeu (p : plateau_blackjack) =
  194. let cj,cb,pi = p in
  195. print_string "Cartes du joueur : ";
  196. affiche_liste_cartes cj;
  197. print_string " Cartes de la banque : ";
  198. affiche_liste_cartes cb;
  199. print_string "Total joueur : ";
  200. print_int (total_cartes cj);
  201. print_string ". Total banque : ";
  202. print_int (total_cartes cb);
  203. ;;
  204. (*affiche_jeu pm;;*)
  205.  
  206. let faire_jouer_joueur p = (*A FAIRE : rattraper l'exception int_of_string*)
  207. let rec aux k pl =
  208. match k with
  209. |2 -> pl
  210. |1 -> (let pn = joueur_pioche 1 pl in
  211. afficher_jeu pn;
  212. print_endline "Voulez-vous piocher une carte ?";
  213. print_endline "1 - Oui";
  214. print_endline "2 - Non";
  215. let l = read_int() in
  216. aux l pn)
  217. |_ -> (print_endline "Ceci n'est pas une maniere de jouer acceptable. Voulez-vous piocher une carte ?";
  218. print_endline "1 - Oui";
  219. print_endline "2 - Non";
  220. let l = read_int() in
  221. aux l pl)
  222. in
  223. afficher_jeu p;
  224. print_endline "Voulez-vous piocher une carte ?";
  225. print_endline "1 - Oui";
  226. print_endline "2 - Non";
  227. let m = read_int() in
  228. aux m p
  229. ;;
  230. (*faire_jouer_joueur pm;;*)
  231.  
  232. let jouer_blackjack j =
  233. print_endline "******************************************";
  234. print_endline "* Blackjack *";
  235. print_endline "******************************************";
  236. let p = creer_blackjack() in
  237. let pb = banque_pioche 1 p in
  238. let pj = joueur_pioche 2 pb in
  239. let pl_en_jeu = faire_jouer_joueur pj in
  240. let cj,cb,pi = pl_en_jeu in
  241. let tj = total_cartes cj in
  242. match tj with
  243. |n when n > 21 -> print_endline "Vous avez perdu."
  244. |_ -> let pb_en_jeu = faire_jouer_banque pl_en_jeu in
  245. let pj,pb,ppi = pb_en_jeu in
  246. let tb = total_cartes pb in
  247. ( match tb with
  248. |n when (n > 21) || (n < tj) ->
  249. (j.credit <- j.credit+1;
  250. print_endline "Vous avez gagne !")
  251. |n when n > tj ->
  252. (print_string "Vous avez perdu.";
  253. print_string "Total de la banque :";
  254. |_ -> print_endline "Egalite !"
  255.  
  256. )
  257. ;;
  258. (*L'égalité n'est pas une réussite.*)
  259. let j = {prenom = "J"; credit = 0 ; nbre_batailles_gagnees = 0};;
  260. (*jouer_blackjack j;;*)
  261.  
  262.  
  263.  
  264. (*******************************Menteur*******************************)
  265. let jO1 = {prenom = "Or1"; credit = 0; nbre_batailles_gagnees = 0};;
  266. let jO2 = {prenom = "Or2"; credit = 0; nbre_batailles_gagnees = 0};;
  267. let jO3 = {prenom = "Or3"; credit = 0; nbre_batailles_gagnees = 0};;
  268.  
  269.  
  270. (*Jeu du menteur : HOW TO, WHAT TO :
  271. On a besoin des 4 tas de cartes ; on voudrait qu'ils soient triés par couleur.
  272. -> FONCTION de tri par couleur. DONE
  273. On a besoin de savoir quel est la couleur annoncée par le 1er joueur.
  274. On a besoin de savoir la carte posée sur la table. -> liste soit vide, soit
  275.   composée d'un seul élément.
  276.  
  277. *)
  278. type table_menteur = (*Pile J, Pile o1, Pile o2, Pile o3, couleur annoncée,
  279. Carte posée sur la table *)
  280. carte list * carte list * carte list * carte list * couleur * carte list;;
  281. (*carte list pour le dernier champ pour pouvoir initialiser en liste vide.??*)
  282. (*
  283. let rec tri_1carte_couleur c l =(*insérer une carte d'une couleur donée dans une
  284. liste de cartes triées par couleurs.*)
  285.   let C(r1,t1) = c in
  286.   match l with
  287.  |[] -> [c]
  288.  |h::ta -> let C(r2,t2) = h in
  289. if t1 = t2 then c::l
  290. else h::(tri_1carte_couleur c ta)
  291. ;;
  292. lc;;
  293. tri_1carte_couleur (C(2,Coeur)) lc;;
  294. tri_1carte_couleur (C(2,Pique)) lc;;
  295. tri_1carte_couleur (C(2,Trefle)) lc;;
  296.  
  297. let tri_couleur cl =
  298.   let rec aux l1 l2 =
  299.   match l1 with
  300.   |[] -> l2
  301.   |h::t -> aux t (tri_1carte_couleur h l2)
  302.   in
  303.   aux cl []
  304. ;;
  305. let lct = genere_mini_jeu 10;;
  306. let lctm = melanger lct;;
  307. tri_couleur lctm;;
  308. *)
  309. let color c =
  310. let C(r,t) = c in t;;
  311. color (C(10,Trefle));;
  312.  
  313. let rec compte_couleurs = function
  314. |[] -> (0,0,0,0)
  315. |h::t when (color h) = Coeur -> let (a,b,c,d) = compte_couleurs t in
  316. (1+a,b,c,d)
  317. |h::t when (color h) = Carreau -> let (a,b,c,d) = compte_couleurs t in
  318. (a,1+b,c,d)
  319. |h::t when (color h) = Trefle -> let (a,b,c,d) = compte_couleurs t in
  320. (a,b,1+c,d)
  321. |h::t (*when (color h) = Pique*) -> let (a,b,c,d) = compte_couleurs t in
  322. (a,b,c,1+d)
  323. ;;
  324.  
  325. let rec inna_nb_cartes l couleur=match l with
  326. []->0
  327. | h::tl -> match h with
  328. C(_,clr) when clr=couleur ->1+(inna_nb_cartes tl couleur)
  329. |_ -> inna_nb_cartes tl couleur;;
  330.  
  331. (* inna_affiche_pile_selon_couleur pile couleur l Pique ->(2,20) veut dire "2 Piques, 20 non-Piques" *)
  332. let inna_affiche_pile_selon_couleur pile couleur =print_string"(";print_int(inna_nb_cartes pile couleur);print_string ",";print_int((List.length pile)-(inna_nb_cartes pile couleur));print_string")";;
  333.  
  334. let inna_affiche_table_menteur tm= let (j,o1,o2,o3,cl,c) = tm in inna_affiche_pile_selon_couleur j cl;inna_affiche_pile_selon_couleur o1 cl;inna_affiche_pile_selon_couleur o2 cl;inna_affiche_pile_selon_couleur o3 cl;print_newline();;
  335.  
  336. let lct = genere_mini_jeu 10;;
  337. let lctm = melanger lct;;
  338. lctm;;
  339. compte_couleurs lctm;;
  340.  
  341. let creer_menteur () : table_menteur =
  342. let jeu = genere_jeu () in
  343. let jeu_m = melanger jeu in
  344. let t1,t2 = distribue jeu_m in
  345. let j1,j2 = distribue t1 and j3,j4 = distribue t2 in
  346. (j1,j2,j3,j4,Pique,[]);; (*Initialisation arbitraire de la couleur.*)
  347. creer_menteur();;
  348.  
  349. let rec choisir cl c = (*choisir une carte de la couleur donnée, ou n'importe quelle autre carte sinon : nécessaire pour faire jouer l'ordinateur*)
  350. (*let col = color c in*)
  351. match cl with
  352. |[] -> failwith "Il n'y a pas de cartes !"
  353. |[x] -> x,[]
  354. |C(r,t)::ta when t = c -> (C(r,t)),ta
  355. |h::ta -> let f,s = choisir ta c in f,h::s
  356. ;;(*A REPRENDRE*)
  357. lc;;
  358. choisir lc Carreau;;
  359.  
  360. let next = function
  361. |0 -> 1
  362. |1 -> 2
  363. |2 -> 3
  364. |3 -> 0
  365. |_ -> failwith "Ceci n'est pas un joueur existant"
  366. ;;
  367.  
  368. let prec = function
  369. |0 -> 3
  370. |1 -> 0
  371. |2 -> 1
  372. |3 -> 2
  373. |_ -> failwith "Ceci n'est pas un joueur existant"
  374. ;;
  375.  
  376. let jouer_ordinateur_pose n (tm : table_menteur) : table_menteur =
  377. let (j,o1,o2,o3,c,cl) = tm in
  378. print_string "Le joueur ";
  379. print_endline " pose une carte.";
  380. match n with
  381. |1 -> let carte,reste = choisir o1 c in
  382. j,reste,o2,o3,c,carte::cl
  383. |2 -> let carte,reste = choisir o2 c in
  384. j,o1,reste,o3,c,carte::cl
  385. |3 -> let carte,reste = choisir o3 c in
  386. j,o1,o2,reste,c,carte::cl
  387. |_ -> failwith "Ce joueur n'existe pas."
  388. ;;
  389.  
  390. let jouer_ordinateur_pose1 n (tm : table_menteur) : table_menteur =
  391. let (j,o1,o2,o3,c,cl) = tm in
  392. print_string "Le joueur ";
  393. print_endline " choisit une couleur.";
  394. Random.self_init();
  395. let num_couleur = Random.int 4 in
  396. match num_couleur with
  397. |0 -> jouer_ordinateur_pose n (j,o1,o2,o3,Coeur,cl)
  398. |1 -> jouer_ordinateur_pose n (j,o1,o2,o3,Carreau,cl)
  399. |2 -> jouer_ordinateur_pose n (j,o1,o2,o3,Trefle,cl)
  400. |_ -> jouer_ordinateur_pose n (j,o1,o2,o3,Pique,cl)
  401. ;;
  402.  
  403. (*Déroulement du jeu :
  404. Le premier joueur donne une couleur.
  405. Stratégie des ordinateurs : Stratégie 1 : mettre une carte de la couleur annoncée
  406. jusqu'à ce qu'il n'y en ait plus, puis mettre n'importe quelle carte.
  407. Stratégie 2 : accuser le joueur précédent. Proba d'1/2 de choix de l'une ou l'autre.
  408. Joueur : 1. S'il est le premier à jouer : demander une couleur. 2. S'il n'est pas
  409. le premier, demander une carte ou une accusation.*)
  410. (*
  411. let be_of_color co ca =
  412.   let C(r,t) = ca in co = t;;
  413. be_of_color Trefle (C(3,Trefle));;
  414. be_of_color Trefle (C(3,Coeur));;
  415.  
  416. let rec list_find p l =
  417.   match l with
  418.  |[] -> raise Not_found
  419.  |h::t -> if (p h) then h,t
  420.   else let m,r = list_find p t in
  421. m,h::r
  422. ;;
  423. list_find (be_of_color Coeur) lc;;
  424.  
  425. let jouer_pile c p =
  426.   if List.exists (be_of_color c) p then
  427.   list_find (be_of_color c) p
  428.   else match p with
  429.   |[] -> failwith "Il n'y a plus de cartes ; il y a du y avoir une erreur !"
  430.   |h::t -> h,t
  431. ;;
  432. lc;;
  433. (*jouer_pile Coeur [];;*)
  434. jouer_pile Carreau lc;;
  435.  
  436. let rec list_nth n l =
  437.   match l with
  438.  |[] -> failwith "La liste est trop courte"
  439.  |h::t -> match n with
  440.   |0 -> h,t
  441. |_ -> let e,r = list_nth (n-1) t in e,h::r
  442. ;;
  443.  
  444. let choisir_couleur p =
  445.   Random.self_init ();
  446.   match p with
  447.   |[] -> failwith "Il n'y a plus de cartes ; il y a du y avoir une erreur !"
  448.   |h::ta -> let n = List.length p in
  449. let m = Random.int n in
  450. let (C(r,t),reste) = liste_nth m p in t,reste
  451. ;;
  452. choisir_couleur lc;;*)
  453.  
  454. let recupere_cartes (tm : table_menteur) n : table_menteur=
  455. let (j,o1,o2,o3,c,cl) = tm in
  456. match n with
  457. |0 -> (empiler_cartes cl j,o1,o2,o3,c,[])
  458. |1 -> (j,empiler_cartes cl o1,o2,o3,c,[])
  459. |2 -> (j,o1,empiler_cartes cl o2,o3,c,[])
  460. |3 -> (j,o1,o2,empiler_cartes cl o3,c,[])
  461. |_ -> failwith "Joueur inexistant"
  462. ;;
  463.  
  464.  
  465. let jouer_ordinateur_accusateur n (tm : table_menteur) =
  466. match tm with
  467. |_,_,_,_,c,[] -> failwith "Ordre du joueur"
  468. |_,_,_,_,c,(C(r,t))::ta when c = t -> print_endline "L'accusateur a perdu. Il recupere toutes les cartes.";
  469. recupere_cartes tm n,(prec n)
  470. |_ -> print_endline "L'accusateur a gagne. Le joueur accuse recupere toutes les cartes.";
  471. recupere_cartes tm (prec n),n
  472. ;;
  473.  
  474. let jouer_ordinateur o(*ordre du joueur*) n(*numéro de l'ordinateur*)
  475. (tm : table_menteur) : table_menteur*int =
  476. Random.self_init();
  477. match o with
  478. |1 -> jouer_ordinateur_pose1 n tm,4
  479. |2 -> (let x = Random.int 2 in
  480. match x with
  481. |0 -> jouer_ordinateur_pose n tm,4
  482. |_ (*donc 1*) -> print_string "Le joueur ";
  483. print_endline " accuse !";
  484. jouer_ordinateur_accusateur n tm)
  485. |_ -> failwith "La partie est déjà finie !"
  486. ;;
  487.  
  488. (*Faire jouer le joueur : on lui dit combien de cartes de chaque couleur il a.
  489. Il suffit donc qu'il dise la couleur de la carte qu'il veut jouer pour jouer.*)
  490. let rec couleur_of_string s =
  491. match s with
  492. |"Coeur" -> Coeur
  493. |"Carreau" -> Carreau
  494. |"Trefle" -> Trefle
  495. |"Pique" -> Pique
  496. |_ -> print_endline "Ceci n'est pas une couleur. Choisissez une couleur, s'il vous plait !";
  497. let ns = read_line() in couleur_of_string ns
  498. ;;
  499.  
  500.  
  501. let rec selectionner_carte_existante c lc =
  502. match lc with
  503. |[] -> failwith "Pas de carte de cette couleur !"
  504. |(C(r,t))::ta when t = c -> (C(r,t)),ta
  505. |h::t -> let carte,reste = selectionner_carte_existante c t in carte,h::reste
  506. ;;
  507. lc;;
  508.  
  509. let rec selectionner_carte c lc =
  510. try (selectionner_carte_existante c lc) with
  511. |Failure "Pas de carte de cette couleur !" -> print_endline "Vous n'avez pas de cartes de cette couleur. Choisissez une autre couleur, s'il vous plait !";
  512. let s = read_line() in
  513. selectionner_carte (couleur_of_string s) lc
  514. ;;
  515.  
  516. (*selectionner_carte (couleur_of_string "Carreau") lc;;*)
  517.  
  518. let affiche_main (tm : table_menteur) =
  519. let (j,o1,o2,o3,c,cd) = tm in
  520. let (co,ca,t,p) = compte_couleurs j in
  521. print_string "Votre main : ";
  522. print_string" carte(s) de Coeur, ";
  523. print_string" carte(s) de Carreau, ";
  524. print_string " carte(s) de Trefle, ";
  525. print_string " carte(s) de Pique. "
  526. ;;
  527. lc;;
  528. (*affiche_main (lc,[],[],[],Trefle,[]);;*)
  529.  
  530. let jouer_joueur_poser (tm : table_menteur) : table_menteur =
  531. let (j,o1,o2,o3,c,cd) = tm in
  532. print_endline "Choisissez une couleur, s'il vous plait.";
  533. let s = read_line() in
  534. let nc = couleur_of_string s in
  535. let carte,nj = selectionner_carte nc j in
  536. (nj,o1,o2,o3,nc,carte::cd)
  537. ;;
  538.  
  539. let jouer_joueur_poser1 (tm : table_menteur) : table_menteur =
  540. let (j,o1,o2,o3,c,cd) = tm in
  541. print_endline "Choisissez une couleur a annoncer, s'il vous plait.";
  542. let s = read_line() in
  543. let nc = couleur_of_string s in
  544. jouer_joueur_poser (j,o1,o2,o3,nc,cd)
  545. ;;
  546.  
  547. let affiche_carte c =
  548. let C(r,t) = c in
  549. print_string ((string_of_num r)^" "^(string_of_couleur t))
  550. ;;
  551. (*affiche_carte (C(13,Pique));;*)
  552.  
  553. let jouer_joueur_accuser (tm : table_menteur) : table_menteur*int (*_,g*) =
  554. match tm with
  555. |_,_,_,_,c,[] -> failwith "Ordre du joueur"
  556. |_,_,_,_,c,(C(r,t))::ta when c = t -> print_string "Vous avez menti ! La carte posee etait ";
  557. affiche_carte (C(r,t));
  558. print_endline ". Vous recuperez toutes les cartes.";
  559. recupere_cartes tm 0,3
  560. |_,_,_,_,c,(C(r,t))::ta -> print_string "Vous avez gagne ! La carte posee etait ";
  561. affiche_carte (C(r,t));
  562. print_endline ". Le joueur accuse recupere toutes les cartes.";
  563. recupere_cartes tm 3,0
  564. ;;
  565.  
  566. let jouer_joueur o (tm : table_menteur) : table_menteur*int =
  567. let (j,o1,o2,o3,c,cl) = tm in
  568. match o with
  569. |1 -> affiche_main tm;
  570. jouer_joueur_poser1 tm,4
  571. |2 -> affiche_main tm;
  572. print_endline ("La couleur annoncee est : "^(string_of_couleur c)^".");
  573. print_endline "Que voulez vous faire ?";
  574. print_endline "1 - Poser une carte";
  575. print_endline "2 - Accuser le joueur precedent";
  576. let n = read_int() in
  577. let rec aux = function
  578. |1 -> jouer_joueur_poser tm,4
  579. |2 -> jouer_joueur_accuser tm
  580. |_ -> print_endline "Ceci n'est pas un choix propose. Quel est votre choix ?";
  581. let k = read_int() in aux k
  582. in
  583. aux n
  584. |_ -> failwith "Ceci n'est pas un ordre valable !"
  585. ;;
  586.  
  587. let init_menteur() =
  588. Random.self_init ();
  589. let tm = creer_menteur() in
  590. let n = Random.int 4 in
  591. match n with
  592. |0 -> jouer_joueur 1 tm,(next n)
  593. |1 -> jouer_ordinateur 1 1 tm,(next n)
  594. |2 -> jouer_ordinateur 1 2 tm,(next n)
  595. |_ -> jouer_ordinateur 1 3 tm,(next n)
  596. ;;(*table,gagnant,n*)
  597.  
  598. let debut_manche (tm : table_menteur) g =
  599. match g with
  600. |0 -> jouer_joueur 1 tm,(next g)
  601. |_ -> jouer_ordinateur 1 g tm,(next g)
  602. ;;(*table,gagnant,n*)
  603.  
  604. let manche (tm : table_menteur) n =
  605. match n with
  606. |0 -> jouer_joueur 2 tm,(next n)
  607. |_ -> jouer_ordinateur 2 n tm,(next n)
  608. ;;(*table,gagnant,n*)
  609.  
  610. (*Il faut assurer l'hérédité.
  611. Test : tant qu'aucun des 4 tas n'est vide, on continue à jouer.
  612. Continuer à jouer : fonction tm -> tm*)
  613.  
  614. (*PROBLEME : comment différencier les manches ?! Pour le moment, après l'accusation,
  615. le jeu continue, et on ne revient jamais à l'ordre 0, d'où le problème.*)
  616.  
  617. let rec jeu_menteur (tm : table_menteur) n g j =
  618. inna_affiche_table_menteur tm;
  619. match tm with
  620. |[],_,_,_,_,_ -> print_endline "Felicitations ! Vous avez gagne la partie.";
  621. j.credit <- j.credit + 1
  622. |_,[],_,_,_,_ |_,_,[],_,_,_ |_,_,_,[],_,_ -> print_endline "Malheureusement, vous avez perdu ..."
  623. |_,_,_,_,_,[] -> let (ntm,ng),m = debut_manche tm g in
  624. jeu_menteur ntm m ng j
  625. |_ -> let (ntm,ng),m = manche tm n in
  626. jeu_menteur ntm m ng j
  627. ;;
  628. let table1 = [],[C(1,Pique)],[C(2,Pique)],[C(3,Pique)],Trefle,[];;
  629. let table2 = [C(1,Pique)],[],[C(2,Pique)],[C(3,Pique)],Trefle,[];;
  630. let table3 = [C(10,Pique)],[C(1,Pique)],[C(2,Pique)],[C(3,Pique)],Trefle,[];;
  631. (*jeu_menteur table2 0 0;;
  632. jeu_menteur table1 0 0;;
  633. jeu_menteur table3 2 1;;*)
  634.  
  635. let joue_menteur j =
  636. print_endline "******************************************";
  637. print_endline "* Menteur *";
  638. print_endline "******************************************";
  639. let (tm,g),n = init_menteur() in
  640. jeu_menteur tm n g j
  641. ;;
  642. j;;
  643. (*joue_menteur j;;*)
  644.  
  645.  
  646.  
  647.  
  648. (*********************************Bataille******************************)
  649. type table_bataille = carte list * carte list * carte list * carte list;;
  650.  
  651. let creer_bataille n : table_bataille =
  652. match n with
  653. |m when m > 1 ->
  654. let jeu = C(1,Coeur)::C(1,Pique)::(genere_mini_jeu n) in
  655. let jeum = melanger jeu in
  656. let t1,t2 = distribue jeum in (t1,t2,[],[])
  657. |_ -> let jeu = genere_jeu() in
  658. let jeum = melanger jeu in
  659. let t1,t2 = distribue jeum in (t1,t2,[],[])
  660. ;;
  661. creer_bataille 13;;
  662.  
  663.  
  664. (*
  665. jeu normal : table_bataille -> table_bataille,bool (j1 gagne),bool (j2 gagne) :
  666. tb = (csj1,csj2,h1::t1,h2::t2)
  667. Si csj1 = [] on s'arrête et J1 a gagné.
  668. Si csj2 = [] on s'arrête et J2 a gagné.
  669. Sinon :
  670. csj1 = ha::ta, csj2 = hb::tb
  671. Si ha > hb, le joueur 1 récupère les deux tas (il faut les mélanger avant de les
  672. ajouter à la fin du paquet du joueur 1).
  673. Si ha < hb, le joueur 2 récupère les deux tas.
  674. Si ha = hb, alors bataille.*)
  675. (*bataille : table_bataille -> table_bataille :
  676. Description précise de la bataille :
  677. tb = (csj1,csj2,tete1::q1,tete2::q2)
  678. tete1 = tete2
  679. On vérifie : si csj1 = ha1::ha2::ta et csj2 = hb1::hb2::tb, alors on lance le jeu
  680. "normal" sur tnb = (ta,tb,ha1::ha2::tete1::q1,hb1::hb2::tete2::q2)
  681. Sinon : les joueurs sont déclarés ex-aequo, et la partie est finie.
  682. *)
  683. let egal c1 c2 =
  684. let C(r1,t1) = c1 and C(r2,t2) = c2 in r1 = r2;;
  685.  
  686. let superieur c1 c2 =
  687. let C(r1,t1) = c1 and C(r2,t2) = c2 in
  688. match r1 with
  689. |1 -> not (r2 = 1)
  690. |r when r > r2 -> (match r2 with
  691. |1 -> false
  692. |_ -> true)
  693. |_ -> false
  694. ;;
  695. superieur (C(2,Trefle)) (C(1,Trefle));;
  696.  
  697. (*lc;;
  698. List.length lc;;
  699. affiche_liste_cartes;;*)
  700. (*
  701. let inferieur c1 c2 = superieur c2 c1;;
  702. inferieur (C(2,Trefle)) (C(1,Trefle));;*)
  703.  
  704.  
  705.  
  706. let rec tour_bataille (table_b : table_bataille) (j : joueur) =
  707. let rec bataille = function
  708. |(_,_,[],[]) -> failwith "Ceci n'est pas un cas de bataille"
  709. |(j1,j2,h1::t1,h2::t2) when (egal h1 h2) -> (match j1,j2 with
  710. |ha1::ha2::ta,hb1::hb2::tb ->
  711. tour_bataille (ta,tb,ha1::ha2::h1::t1,hb1::hb2::h2::t2) j
  712. |_ -> print_endline "Egalite ! Mais l'egalite n'est pas une victoire ...";
  713. )
  714. |_ -> failwith "Ceci n'est pas un cas de bataille"
  715. in
  716. match table_b with
  717. |([],_,_,_) ->print_endline "Vous n'avez plus de cartes. Malheureusement, vous avez perdu ...";
  718. |(j1,[],_,_) ->print_string "Vous avez ";
  719. print_int (List.length j1);
  720. print_endline (" carte(s), alors que votre adversaire n'en a plus. Felicitations "^(j.prenom)^", vous avez gagne !");
  721. j.nbre_batailles_gagnees <- j.nbre_batailles_gagnees + 1;
  722. |(ha::ta,hb::tb,[],[]) -> (print_string "Vous avez ";
  723. print_int (List.length (ha::ta));
  724. print_endline " carte(s).";
  725. print_string "Votre adversaire a ";
  726. print_int (List.length (hb::tb));
  727. print_endline " carte(s).";
  728. print_string "On opppose ";
  729. affiche_carte ha;
  730. print_string " a ";
  731. affiche_carte hb;
  732. tour_bataille (ta,tb,[ha],[hb]) j)
  733. |(j1,j2,ha::ta,hb::tb) when (superieur ha hb) ->
  734. ( print_endline ". Vous gagnez les cartes !";
  735. let tas = melanger (empiler_cartes (ha::ta) (hb::tb)) in
  736. tour_bataille ((empiler_cartes tas j1),j2,[],[]) j
  737. )
  738. |(j1,j2,ha::ta,hb::tb) when (superieur hb ha) ->
  739. ( print_endline ". Votre adversaire gagne les cartes.";
  740. let tas = melanger (empiler_cartes (ha::ta) (hb::tb)) in
  741. tour_bataille (j1,(empiler_cartes tas j2),[],[]) j
  742. )
  743. |_ -> print_string ". BATAILLE !!! ";
  744. bataille table_b
  745. ;;
  746.  
  747. let joue_bataille j =
  748. print_endline "******************************************";
  749. print_endline "* Bataille *";
  750. print_endline "******************************************";
  751. if j.credit = 0 then (print_endline "Nous sommes desoles, mais vous n'avez pas assez de jetons pour jouer ... revenez plus tard !";
  752. )
  753. else
  754. (j.credit <- j.credit - 1;
  755. print_endline "Quelle est la taille du mini-jeu sur lequel vous souhaitez voir se derouler la bataille ? Entrez la plus petite valeur disponible.";
  756. let n = read_int() in
  757. let tb = creer_bataille n in
  758. tour_bataille tb j)
  759. ;;
  760. (*j.credit <- j.credit + 1;;
  761. joue_bataille j;;
  762. *)
  763.  
  764. (******************************Triche************************)
  765.  
  766. (*****************************Terminal***********************)
  767.  
  768. let rec inna_menu_principal j =
  769. print_string ("Bonjour "^(j.prenom)^" ! Vous avez ");
  770. print_int j.credit;
  771. print_string " jeton(s). Vous avez gagne ";
  772. print_int j.nbre_batailles_gagnees;
  773. print_endline " partie(s) de bataille.";
  774. print_endline "Que voulez-vous faire ?";
  775. print_endline "1. Jouer au blackjack";
  776. print_endline "2. Jouer au menteur";
  777. print_endline "3. Jouer a la bataille";
  778. print_endline "4. Tricher (c'est pas bien !)";
  779. print_endline "5. Quitter";
  780. try
  781. let i = read_int() in
  782. let rec aux = function
  783. |1 -> jouer_blackjack j;
  784. inna_menu_principal j
  785. |2 -> joue_menteur j;
  786. inna_menu_principal j
  787. |3 -> joue_bataille j;
  788. inna_menu_principal j
  789. |4 -> let menu_triche joueur =
  790. print_endline "Bienvenue, cher tricheur ! Quelle est l'aide que vous aimeriez obtenir ?";
  791. print_endline "1. Regarder la carte posee par l'adversaire avant de se prononcer durant une partie de menteur";
  792. print_endline "2. Obtenir un jeton supplementaire";
  793. print_endline "3. Obtenir au moins deux As lors de la distribution des cartes pour la bataille";
  794. print_endline "4. Revenir au menu principal";
  795. (let l = read_int() in
  796. let rec aux_triche = function
  797. |1 -> failwith "Not implemented"
  798. |2 -> joueur.credit <- joueur.credit + 1;
  799. inna_menu_principal joueur;
  800. |3 -> failwith "Not implemented"
  801. |4 -> inna_menu_principal joueur;
  802. |_ ->( print_endline "Nous sommes desoles, mais ce choix n'est pas propose.";
  803. print_endline "Que voulez-vous faire ?";
  804. let m = read_int() in aux_triche m)
  805. in
  806. aux_triche l) in
  807. menu_triche j
  808. |5 -> print_endline "Merci pour votre visite. En esperant vous revoir bientot !"
  809. |_ ->( print_endline "Nous sommes desoles, mais ce choix n'est pas propose.";
  810. print_endline "Que voulez-vous faire ?";
  811. let k = read_int() in aux k)
  812. in
  813. aux i
  814. with Failure "int_of_string" ->begin print_string "inna Your choice is not valide.Repeat, please:";inna_menu_principal j end
  815. ;;
  816.  
  817. let menu_debut() =
  818. print_endline "****************************************";
  819. print_endline "* Bienvenue au Game Center ! *";
  820. print_endline "****************************************";
  821. print_endline "Comment vous appelez-vous ?";
  822. let s = read_line() in
  823. let j = {prenom = s ; credit = 1 ; nbre_batailles_gagnees = 0} in
  824. inna_menu_principal j
  825. ;;
  826.  
  827. menu_debut();;
  828.  
  829.  
Runtime error #stdin #stdout #stderr 0.02s 2736KB
stdin
rrr
yy
stdout
****************************************
*      Bienvenue au Game Center !      *
****************************************
Comment vous appelez-vous ?
Bonjour rrr ! Vous avez 1 jeton(s). Vous avez gagne 0 partie(s) de bataille.
Que voulez-vous faire ?
1. Jouer au blackjack
2. Jouer au menteur
3. Jouer a la bataille
4. Tricher (c'est pas bien !)
5. Quitter
inna Your choice is not valide.Repeat, please:Bonjour rrr ! Vous avez 1 jeton(s). Vous avez gagne 0 partie(s) de bataille.
Que voulez-vous faire ?
1. Jouer au blackjack
2. Jouer au menteur
3. Jouer a la bataille
4. Tricher (c'est pas bien !)
5. Quitter
stderr
Fatal error: exception End_of_file