IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Algorithme de Pledge sur Caml


Sujet :

Caml

  1. #21
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Salut à tous, j'ai beaucoup travaillé depuis la dernière réponse postée, j'ai introduit une matrice et un environnement graphique 575*450 pour afficher un bonhomme qui se déplace, mais mon programme ne marche pas et je ne comprends pas pourquoi...

    voici le code, il est un peu long, et on se place dans une matrice 24x18 et un terrain avec des murs :

    [CODE début]

    let direction = ref 0;;

    (* on pose maintenant direction = 1 : vers le nord
    direction = 2 : vers l'est
    direction = 3 : vers le sud
    direction = 4 : vers l'ouest *)

    let mur_devant x y =
    if (!direction = 0) & (m.(x).(y+1) = 0) then false
    else if (!direction = 1) & (m.(x+1).(y) = 0) then false
    else if (!direction = 2) & (m.(x).(y-1) = 0) then false
    else if (!direction = 3) & (m.(x-1).(y) = 0) then false
    else true
    ;;

    (* un convertisseur de coordonnées cartésiennes -> graphiques*)

    let conv x = 12 + 25*x;;

    let compteur = ref 0;;

    let pivote_a_gauche =
    compteur := !compteur - 1;
    if !direction = 0 then direction := 3 else direction := !direction - 1;
    ;;

    let pivote_a_droite =
    direction := (!direction + 1) mod 4;
    compteur := !compteur + 1
    ;;

    let tour_pledge (x,y) =
    set_color red;
    if !direction = 0 then
    (fill_circle (conv(x)) (conv(y+1)) 3; if (!compteur <> 0) & (not mur_devant (x-1) (y-1)) then pivote_a_gauche)
    else if !direction = 1 then
    (fill_circle (conv(x+1)) (conv(y)) 3; if (!compteur <> 0) & (not mur_devant (x-1) (y+1)) then pivote_a_gauche)
    else if !direction = 2 then
    (fill_circle (conv(x)) (conv(y-1)) 3; if (!compteur <> 0) & (not mur_devant (x+1) (y+1)) then pivote_a_gauche)
    else (fill_circle (conv(x-1)) (conv(y)) 3; if (!compteur <> 0) & (not mur_devant (x+1) (y-1)) then pivote_a_gauche)
    ;;

    let pledge (x,y) =
    let u = ref x and v = ref y in
    let direction = ref 0 in
    while (!u,!v) <> (22,3) & (not mur_devant !u !v) do
    (set_color red; v := !v + 1; fill_circle (conv(!u)) (conv(!v)) 3; read_key ())
    done;
    while (!u,!v) <> (22,3) do
    if (mur_devant !u !v) then (pivote_a_droite; read_key ())
    else ( if !direction = 0 then v := !v + 1
    else if !direction = 1 then u := !u + 1
    else if !direction = 2 then v := !v - 1
    else if !direction = 3 then u := !u - 1;
    tour_pledge (!u,!v);
    read_key ()
    )
    done;
    ;;

    [FIN CODE]

    Le petit point rouge ne sait pas tourner... :'(

  2. #22
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    Je ne me suis pas penché suffisamment sur ce code pour déceler l'origine du problème (quel est-il précisément ?). Cependant, vu que sa taille commence à augmenter, il me paraît raisonnable de t'indiquer quelques pistes pour améliorer la lisibilité de ton code.

    Pour les directions, tu peux utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type direction = N | S | E | W
    Ça te permet ensuite de remplacer les séries de if...then...else imbriqués par un filtrage simple (mais tu peux aussi filtrer des entiers) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    match direction with
       | N -> ...
       | S -> ...
       | E -> ...
       | W -> ...
    Pour le paramètre direction, justement, essaie de te passer d'une variable globale si tu peux. La règle de base c'est : références + variables globales = bug assuré. Il y a certes des tas de raisons pratiques d'adopter ce style de programmation mais ça ne devrait pas pour autant devenir le choix par défaut. Même remarque pour la variable compteur.

    Dans ta fonction tour_pledge, on lit presque quatre fois la même chose ! Le copier-coller est à bannir de la programmation. Tu peux pourtant factoriser très simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let tour_pledge (x,y) =
      set_color red;
      let a, b = match direction with
       ...
      in
      if (!compteur <> 0) & (not mur_devant (x+a) (y+b)) then pivote_a_gauche
    En Caml le « et logique » se note &&. La notation & est obsolète.

    Enfin, pour nos yeux, merci d'utiliser les balises CODE.

    Je pense qu'en éclaircissant le code de cette façon, les erreurs deviendront plus faciles à traquer !

    Cordialement,
    Cacophrène

  3. #23
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Pour ceux qui veulent essayer de m'aider, pouvez-vous m'envoyer vos adresses e-mails pour que je vous transfère le code source ?

    Merci d'avance.

  4. #24
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    Parce que j'ai amélioré le code, il est clair, et je ne suis pas loin du résultat voulu...

  5. #25
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Points : 39
    Points
    39
    Par défaut
    Poste le donc ici, que tout le monde en profite ! Un petit "pledge ocaml" dans google arrive déjà sur ce topic, autant qu'il y ait quelque-chose de complet ;-).
    Edit :
    D'ailleurs, visiblement, tu as écumé les forums avec ton sujet. Attention, les profs aussi savent se servir d'un moteur de recherche. À bonne entendeur, salut.

  6. #26
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 14
    Points : 1
    Points
    1
    Par défaut
    je n'ai rien à me reprocher !

    J'ai travaillé bien plus qu'on nous le demandait, et je me suis entrepris à chercher de l'aide sur un forum dans l'idée d'avancer aux moments où je bloquais sérieusement.

    En outre, ce que je présenterai n'a été imaginé et tapé que par MOI, et je serai tout à fait en mesure d'expliquer le raisonnement que j'ai suivi...

  7. #27
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut
    Bonjour,

    En attendant, ce serait quand même sympa de suivre l'évolution du code et voir où tu en es... pour ce qui est du mail, je suis comme Aubanel, ça ne me paraît pas la meilleure solution. On a déjà une discussion assez étendue sur l'algorithme par ici, il n'y a aucune raison de continuer en privé. Le code et/ou les conseils serviront un jour ou l'autre à d'autres membres.

    Cordialement,
    Cacophrène

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Octobre 2010
    Messages : 22
    Points : 39
    Points
    39
    Par défaut
    Mais je ne te reproche rien. Je ne filerai certainement pas des coups de main sur des forums si je tenais cela pour répréhensible. Je préviens juste qu'en tant que prof occasionnel, la première chose que je fais quand je corrige des projets, c'est de faire quelques recherches avec des bouts de phrases et/ou de code extraits du projet. Je te conseille dans ton écrit de citer et remercier les forums où tu es allé chercher de l'aide, c'est toujours apprécié des correcteurs.

    J'étais juste un peu surpris du nombre de fils parallèles que tu avais lancé sur le même sujet dans divers forums. En général on évite et/ou on signale pour que les personnes qui suivent le topic aient l'ensemble des infos.

    Sinon, nous attendons ta prose !

Discussions similaires

  1. [SP-2007] Infos sur CAML
    Par stardeus dans le forum SharePoint
    Réponses: 4
    Dernier message: 13/12/2010, 17h01
  2. graphiques sur caml
    Par darkontes dans le forum Caml
    Réponses: 9
    Dernier message: 15/03/2010, 20h29
  3. Algorithme de Gauss sur les systèmes linéaires
    Par hamidas15 dans le forum Pascal
    Réponses: 6
    Dernier message: 03/05/2008, 15h35
  4. Choix d'un algorithme pour labeling sur composant parrallele
    Par Glenou dans le forum Traitement d'images
    Réponses: 9
    Dernier message: 28/06/2007, 15h02
  5. Réponses: 16
    Dernier message: 10/11/2005, 22h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo