Bonjour comme cicdrek j'ai un gros probleme sur le projet caml voici mon joli bout de code
je dois calculer le nombre de parties possibles au morpion (ce que j'ai tres bien reussi a faire, je trouve 255168)
mais je galere pour faire la meme chose en ne selectionnant que les parties gagnees par la croix puis par le rond et finalement les parties vides, est ce que quelqu'un pourrait m'aider svp ca serait vraiment adorable
(* Definitions de Type *)
type player = X | O | Ø ;;
(* Initiation du Tableau *)
let state = [| Ø;Ø;Ø;Ø;Ø;Ø;Ø;Ø;Ø |];;
(* == Fonction pivot d'evaluation == *)
(* On se sert de la fonction map qui allege considerablement la fonction *)
(* description de la fonction map : map f [a1; ...; an] applique la fonction f sur a1, ..., an, et construit la liste [f a1;
...; f an] avec le résultat retourner par f. *)
let rec Evaluer game_sum is_Leaf Val_Leaf compt state = if is_Leaf state then Val_Leaf state
else compt (map (Evaluer game_sum is_Leaf Val_Leaf compt) (game_sum
state));;
(* == Solution Finale du Jeux : Gagne, Perdu ou Nul == *)
(* Pour simplifier le referencement de la liste initiale on va traiter le morpion "visuellement" en appliquant
l'alignement des trois croix ou des trois ronds *)
(* On separe les joueurs en deux X (croix) et O (rond) *)
let is_InlineX l x y z = (l.(x) = X) && (l.(y) = X) && (l.(z) = X) ;;
let is_InlineO l x y z = (l.(x) = O) && (l.(y) = O) && (l.(z) = O) ;;
let X_Win l = if( (is_InlineX l 0 1 2)
or (is_InlineX l 3 4 5)
or (is_InlineX l 6 7 8)
or (is_InlineX l 0 3 6)
or (is_InlineX l 2 5 8)
or (is_InlineX l 1 4 7)
or (is_InlineX l 0 4 8)
or (is_InlineX l 2 4 6))
then true else false ;;
let O_Win l = if((is_InlineO l 0 1 2)
or (is_InlineO l 3 4 5)
or (is_InlineO l 6 7 8)
or (is_InlineO l 0 3 6)
or (is_InlineO l 2 5 8)
or (is_InlineO l 1 4 7)
or (is_InlineO l 0 4 8)
or (is_InlineO l 2 4 6))
then true else false ;;
let No_Win l = if( (l.(0) != Ø)
&& (l.(1) != Ø)
&& (l.(2) != Ø)
&& (l.(3) != Ø)
&& (l.(4) != Ø)
&& (l.(5) != Ø)
&& (l.(6) != Ø)
&& (l.(7) != Ø)
&& (l.(8) != Ø)
)
then true else false;;
(*== Est-ce une feuille ? ==*)
(* Maintenant il est trivial de savoir si c une feuille ainsi que sa valeur, signification d'une partie finie *)
let is_Leaf x = if ( (X_Win x) or (O_Win x) or (No_Win x) )then true
else false;;
let Val_Leaf x = if (is_Leaf x = true) then 1 else 0;;
(*== C a qui de jouer ?== *)
(* Madame, nous avons laissé tomber le fait de faire une somme de la liste, sahcant que X = 1 et O = -1 et Ø =0;
nous savions que si la somme de la liste etait egal à 0, c'etait à X de jouer, sinon à O. Vu le nombre de calculs que
la machine doit faire, une somme à chaque recursion faisait perdre 30 sec au resultat final , *)
(* Nous avons donc simplifier le code, comme vous nous l'avez suggeré en proposant tout simplement une
referencement respectivement pair et impaire pour X et O *)
let is_Playing x =
let rec step n1 n2=
if n2>8 then n1
else if x.(n2) != Ø then step (n1+1) (n2+1)
else step (n1) (n2+1)
in step 0 0;;
(*== Nombre total de parties ==*)
(* Pour cela nous avons besoin de deux fonctions, une qui donne la liste de tous les fils possibles d'un noeud et
une qui donne la valeur d'un arbre en entier en caclulant toute les solutions possibles *)
let game_sum x =
let rec list a =
if a>8 then []
else if x.(a)= Ø then let pos=(copy_vect x)
in (if (is_Playing pos)mod 2 =0 then pos.(a) <- X else pos.(a) <- O;pos)::list (a+1)
else list (a+1)
in list 0;;
let rec compt= fun [] -> 0
| (a::l) -> a + (compt l);;
(* fonction donnant la somme des parties possibles au morpions*)
Evaluer game_sum is_Leaf Val_Leaf compt state;;
==> maintenant il faut juste creer une fonction qui selectionne les parties gagnées par X, O ou vide...
Encore merci