1

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

2

Finalement c bon apres une bonne nuit de code, j'ai trouvé la solution. Je me suis pris la tete inutilement avec des vecteurs alors qu'il etait plus simple de passer par des listes.

Merci a ceux qui ont regardé mon probleme

Pour ceux et celle qui veulent la solution du morpion peuvent me contacter via email

3

4

pas mal pas mal, remonter un sujet de 8 mois pour poster un truc dont personne n'a rien à foutre, j'avoue y'a de la maitrise...
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

et venir gueuler un mois et demi apres ca se respecte aussi smile
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

6

grin

bon faut voir l'activité du forum aussi :]
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

7

8

trisotfl

(c'est le clone de qui ? grin)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

9

10

bob> nan nan, c'est pas un clone ^^

#patapé# :-p

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)