Ecrire un morpion en caml [Résolu/Fermé]

Signaler
Messages postés
335
Date d'inscription
samedi 26 mai 2007
Statut
Membre
Dernière intervention
23 juillet 2015
-
Messages postés
335
Date d'inscription
samedi 26 mai 2007
Statut
Membre
Dernière intervention
23 juillet 2015
-
Bonjour, je suis en première année de prépa maths et je suis l'option info, pour mes TIPE j'essaie de créer un jeu de morpion et j'ai pas mal avancé mais mon problème c'est bien entendu la fonction d'évaluation.
Je me suis pas mal renseigné sur l'algorithme min max et j'ai bien compris son fonctionnement. Le problème c'est qu'il sert a explorer un arbre et a en ressortir le coup le plus intéressant mais pour cet arbre justement, doit-on le créer entièrement avant de pouvoir faire quoi que ce soit ou y-a-t-il un autre moyen plus rapide?
parce que la pour le morpion ça va déjà être très long a faire mais en plus je compte étendre le programme pour faire ensuite un puissance 4 donc la l'arbre serais bien trop grand pour être réalisé a l'avance.

merci d'avance pour vos réponses.



EDIT: j'allais oublier, voici le programme que j'ai écrit:

type pion = X | O | V ;;
type gamer = joueur | ordi;;
type message= ordi_gagne | joueur_gagne | aucun_gagnant;;
exception case_non_vide ;;
let gagnant = [ (0 , 1 , 2) ; (3 , 4 , 5 ) ;(6 , 7, 8) ;(0 , 3 , 6 ) ;( 1 , 4 , 7 ) ;( 2 ,5 , 8 ) ;(1, 4 , 8 ) ;( 2 ,4 , 6 ) ] ;;
# open "graphics" ;;
let centres = [| (118,650) ; (218,650) ; (318,650) ; (118, 550) ; (218,550) ; (318,550) ; (118,450) ; (218,450) ; (318,450) |] ;;
let t=[|V;V;V;V;V;V;V;V;V|];;


let BIGMORP tab =

(*******************************************************************)
(*************************definitions*******************************)
(*******************************************************************)
open_graph "highest";
moveto 68 600;
lineto 368 600;
moveto 68 500;
lineto 368 500;
moveto 168 400;
lineto 168 700;
moveto 268 400;
lineto 268 700;
let t=ref tab in
let dessiner_croix (a,b) =
moveto (a-24) (b+24);
lineto (a+24) (b-24);
moveto (a-24) (b-24);
lineto (a+24) (b+24); in
let dessiner_rond (a,b) =
draw_circle a b 34 ; in
let dessiner a b =
match b with
| ordi -> dessiner_croix centres.(a)
| joueur -> dessiner_rond centres.(a) ; in
let place c a b t =
!t.(a)<-c;
dessiner a b; in
let jouer a b =
if !t.(a) <> V then raise case_non_vide
else
match b with
|ordi -> place X a b t;
|joueur -> place O a b t; in
let qui_gagne (a,b,c) =
match (!t.(a),!t.(b),!t.(c)) with
| X , X , X -> ordi_gagne
| O , O , O -> joueur_gagne
| _ -> aucun_gagnant ; in
let case_vide t =
let compt = ref 0 in
while !compt<=8 & (!t.(!compt)<>V) do compt := !compt+1 done;
if !compt=9 then false
else true; in
let coord2case n =
let a = fst (!n) in
let m=ref 0 and p=ref 0 in
if 168<a & a<268 then m:=1
else if 268<a & a<368 then m:=2;
let b = snd (!n) in
if 400<b & b<500 then p:=2
else if 500<b & b<600 then p:=1;
!m + 3 * !p; in
let n = ref (0,0) in
(*******************************************************************)
(****************************partie********************************)
(*******************************************************************)
while case_vide t = true do
while (button_down()=false) do done;
n:=mouse_pos();
jouer (coord2case n) joueur ;
if (mem joueur_gagne (map qui_gagne gagnant)) = true then draw_string "YOU WIN"
else if case_vide t = false then draw_string "PAS DE GAGNANT"
else let x = ref (random__int 9) in
while !t.(!x)<> V do x:= (random__int 9) done;
jouer !x ordi ;
if (mem ordi_gagne (map qui_gagne gagnant)) = true then draw_string "YOU LOOSE"
done;;






par contre, il ne fonctionne pas encore correctement, il me renvoie toujours l'exeption non rattrapée case non vide alors qu'il joue quand même le premier tour, je ne comprend pas pourquoi alors si vous avez des idées la dessus, elles sont les bienvenues ^_^

4 réponses

Messages postés
335
Date d'inscription
samedi 26 mai 2007
Statut
Membre
Dernière intervention
23 juillet 2015
127
merci de ta réponse twirik,
par contre le morpion est fini, tout comme le puissance 4
Cette année je m'attaque à un nouveau sujet: un filtre anti-spam ;)
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 57017 internautes nous ont dit merci ce mois-ci

c'est vrai qu'il est pas lisible ton code mais bon bref je pense que ca serais plus facile pour toi de creer un type case au debut qui va soi nous renvoyer une case vide ou une case occupé par le rond ou la crois un peu genre ca

type pion = Rond | Croix;;
type case =
|Vide
|Piece of pion ;;

et apres tu creer des fonctions qui convertirons ce que ta fai avant en chaine de caractères le reste c'est a toi de voir.
Messages postés
15979
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
9 août 2020
2 649
Ami taupin bonjour...

J'ai déjà fait un jeu de morpion et un autre de puissance 4, en Pascal.
Je n'ai pas lu ton code, je pense que tu seras capable d'appliquer mes conseils sans que j'ai à te faire le code.

Pour le Morpion qui est ton problème actuel je te conseillerai de faire, au début du jeu un cache contenant TOUS les cas terminaux pondérés de 0 (pour une perte) 1 (pour un match nul) 2 (pour une victoire), puis à chaque tour, faire une hypothèse sur chacun des emplacements où il est possible de jouer, et pour chacune de ces grilles les comparer avec celles du cache et faire des statistiques avec le poids des grilles qui coïncident, pour savoir quelle hypothèse a le plus de chance de gagner maintenant, ou le moins de chance de perdre rapidement...

Pour le Puissance 4, même méthode mais en refaisant le cache à chaque tour de jeu et en anticipant seulement sur quelques tours de jeu...

Ça peut paraitre un peu lourd mais en fait c'est très rapide à l'exécution...

Pour info, tu dis que le morpion va être assez long à faire, mais si tu le fais proprement, le puissance 4 sera quasiment un copier-coller du morpion !
Messages postés
335
Date d'inscription
samedi 26 mai 2007
Statut
Membre
Dernière intervention
23 juillet 2015
127
salut, merci pour la reponse.
Je comprend que tu n'ai pas lu mon code, pas du tout indenté donc completement illisible ;)
Bon sinon depuis le post j'ai beaucoup evolué dans le problème, maintenant le morpion est finit, hormis quelques tout petits détails à régler.
Et poyur le puissance 4, c'est vrai qu'en réalité, l'adaptation est très simple, d'ailleurs, je pense avoir fini les deux jeux ce mercredi après midi, donc tout se passe pour le mieux ^^

En tout cas merci beaucoup pour la réponse.