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 :

"Supprimer" baton erreur


Sujet :

Caml

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut "Supprimer" baton erreur
    Bonjour,
    dans le cadre d'un projet universitaire, nous devons coder le jeu des batons (issu de fort-Boyard), le but étant de faire en sorte que l'adversaire retire le dernier baton. Pour cela nous devons proposer le choix du nombre de baton total, et le nombre de baton que l'on peut retirer à chaque tours.
    Pour l'instant, je me suis fixer 20 batons. J'ai réussi à afficher les 20 batons avec ce code ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let rec  batongenerateur  (_ : unit) : unit =
     Graphics.set_color (Graphics.rgb 23 101 125);
      for i=1 to 20 do 
        Graphics.fill_rect (50*i+20) 200 5 200;
      done;;
     
    batongenerateur();;
    Je souhaiterai maintenant faire en sorte qu'à chaque fois que l'on clique dans le fenêtre, un baton s'enlève. Pour moi il y a deux solutions : soit je "repasse" sur mes rectangles en retraçant exactement au même endroit des rectangles blancs. L'autre solution est de faire : clear graph afin de repartir d'une fenêtre vierge, et de regénérer à chaque clic mes batons, en en enlevant un à chaque fois (j'espère être clair ^^).
    J'ai choisit la première solution, la deuxième me semble un peu lourde.

    Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let enleverbaton (_ : unit) : unit =
     
    Graphics.set_color (255 255 255);
    let s = Graphics.wait_next_event [Graphics.Button_down] in
    if ((s.Graphics.Button) && (rang<20)) then
      Graphics.fill_rect (50*!rang+20) 200 5 200;
      rang:= !rang+1;;
    Voici le code présent au départ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #load "graphics.cma";;
    Graphics.open_graph " 1100x600";;
    Graphics.set_window_title "Test";;
    let rang =ref 1;;
    Ce que j'ai fait ne marche pas, j'ai une erreur :
    enleverbaton() unbound value.

    Je sais que ma fonction enleverbaton est incomplète, mais je ne vois pas si je dois utiliser une boucle for avec un if qui vérifie si il y a un clic à l'intérieur de ma fenêtre, ou bien utiliser la récursivité, ou les deux. Bref !

    Si vous savez comment faire, je suis preneur d'éléments de réponses pour avancer !


  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 87
    Points : 172
    Points
    172
    Par défaut
    Bonjour,

    Votre problème vient surtout du fait que vous faites de petites erreurs que vous ne corrigez pas et comme vous interprétez votre programme sans lire les messages d'erreur quand il ne réussit pas à interpréter, vous vous retrouvez avec des messages d'erreur assez incompréhensible.

    Dans l'état actuel de votre programme, enleverbaton ne peut pas être compilé car il y a des erreurs. Voici une version corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    let enleverbaton () =
      let open Graphics in
      set_color (rgb 255 255 255);
      let s = wait_next_event [Button_down] in
      if (s.button && !rang < 20) then
        fill_rect (50 * !rang+20) 200 5 200;
      rang:= !rang+1;;
    Pour commencer, vous n'aviez pas appelé rgb : int -> int -> int qui transforme trois entiers en une couleur.
    De plus, l'attribut booléen d'un évènement qui permet de savoir si un bouton a été appuyé est button, sans majuscule.

    Bon courage pour la suite.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    merci beaucoup de votre réponse ! J'ai modifié mon programme et j'ai comprit ce qui n'allait pas. Je savais qu'il manquait pas mal de chose mais je n'arrivais pas à déterminer quoi.

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