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 :

Création bouton et affichage d'un nombre


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 Création bouton et affichage d'un nombre
    Bonjour,
    j'ai déjà poster un message sur ce forum pour un projet, néanmoins mon problème étant différent je me permet de créer une nouvelle discussion.

    Dans le cadre d'un projet universitaire, nous devons retranscrire le jeu des batons en Ocaml.

    Pour cela nous devons faire choisir à l'utilisateur le nombre de baton qu'il souhaite enlever ainsi que le nombre de baton total.
    Ce que j'essaye de faire, c'est de créer une fonction me permettant d'afficher des boutons : "-" "+" "confirmer" "mon nombre de baton. Voici le rendu que je souhaiterais obtenir :

    Nom : jeubaton.png
Affichages : 273
Taille : 8,2 Ko

    Pour cela, voici ce que j'ai fait :

    Mon code initial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #load "graphics.cma";;
    Graphics.open_graph " 1100x600";;
    Graphics.set_window_title "Test";;
    let rang =ref 1;;
    let boucle = ref 1;;
    let nombrebaton=ref 1;;
    1) Ma fonction me permettant d'afficher les boutons.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    let affichagechoixbaton () = 
      let open Graphics in 
          set_color (rgb 0 204 204);
          fill_rect 100 450 100 100;
          moveto 140 490;
          set_color (rgb 255 255 255);
          draw_string "-";
     
          set_color (rgb 0 204 204);
          fill_rect 900 450 100 100;
          moveto 940 490;
          set_color (rgb 255 255 255);
          draw_string "+";
     
          set_color (rgb 0 204 204);
          fill_rect 440 450 200 70;
          moveto 480 490;
          set_color (rgb 255 255 255);
          draw_string "Confirmer";;
    2) Ma fonction me permettant de choisir le nombre de baton en fonction de l'emplacement de la souris et du clique (il faut également, dans le principe, qu'il y ai un clic de souris à cet endroit)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let rec choixbaton() =
      let open Graphics in 
          let clic= wait_next_event [Button_down] in begin
    	let x=mouse_x in
    	let y=mouse_y in
    	if (clic.button) then
    	if (y<1000 && x <550 && y>900 &&x>450)
    	  nombrebaton:= !nombrebaton+1;
    	if (x>100 && x<200 && y>450 && y<550)
    	  nombrebaton := !nombrebaton-1;
    	  let nbr = string_of_int !nombrebaton in
    	set_color (0 0 0);
    	moveto 200 200;
    	draw_string nbr;
    	choixbaton();;
    Dans ce code, il manque l'emplacement pour afficher le nombre de baton (nbr). C'est pour cela que j'ai "moveto 200 200", qui pointe vers un endroit que je sais non utiliser, simplement pour vérifier que cela marche. Si je parviens à comprendre comment faire, adapter mon programme ne sera pas trop un soucis je pense !

    J'ai également ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    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) the
    	for (i=0 to nombrebaton) do
    	  fill_rect (50 * !rang+20) 200 5 200;
    	done;;
    Code qui m'a été donner sur la base de ce que j'avais fait par une personne de ce forum, j'ai essayé (sans succès) de le modifier pour réussir à enlever tout les batons en cliquant plusieurs fois (une fois par baton).
    Je le précise car j'ai deux erreurs dans mon code (qui sont affichées, il y en a surement plein d'autre) :

    Syntax error sur for (i=0 to nombrebaton)

    et

    choixbaton();;
    Error : unbound value choixbaton

    Si certain ont des éléments de réponse concernant ce que je souhaite faire je suis preneur !
    Je ne parviens pas à déterminer les erreurs de ma syntaxe, ce qui me bloque énormément et je me retrouve à perdre énormément de temps à "bidouiller" ce code, en tentant d'enlever une parenthèse, rajouter un espace, rajouter un "!", mais rien n'y fait.

  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
    Je ne le referai pas car ce n'est pas vraiment le rôle d'un forum d'entraide mais il y a beaucoup trop de petites erreurs dans votre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    let rang =ref 1;;
    let boucle = ref 1;;
    let nombrebaton=ref 1;;
     
    let affichagechoixbaton () =
      let open Graphics in
      set_color (rgb 0 204 204);
      fill_rect 100 450 100 100;
      moveto 140 490;
      set_color (rgb 255 255 255);
      draw_string "-";
     
      set_color (rgb 0 204 204);
      fill_rect 900 450 100 100;
      moveto 940 490;
      set_color (rgb 255 255 255);
      draw_string "+";
     
      set_color (rgb 0 204 204);
      fill_rect 440 450 200 70;
      moveto 480 490;
      set_color (rgb 255 255 255);
      draw_string "Confirmer";;
     
    let rec choixbaton() =
      let open Graphics in
      let clic= wait_next_event [Button_down] in
      let x=clic.mouse_x in
      let y=clic.mouse_y in
      (if (clic.button) then
         if (y<1000 && x <550 && y>900 &&x>450) then
           nombrebaton:= !nombrebaton+1
         else if (x>100 && x<200 && y>450 && y<550) then
           nombrebaton := !nombrebaton-1);
      let nbr = string_of_int !nombrebaton in
      set_color (rgb 0 0 0);
      moveto 200 200;
      draw_string nbr;
      choixbaton();;
     
    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
        for i=0 to !nombrebaton do
          fill_rect (50 * !rang+20) 200 5 200;
        done
    Voici un code qui compile en enlevant les parenthèses, en mettant (comme je l'avais déjà dit dans ma réponse à votre précédente question).

    A vous d'essayer de faire les modifications que vous voulez afin d'obtenir le résultat souhaité. Si vous avez des questions précises, je n'aurai aucun problème pour y répondre mais je ne suis pas là pour corriger les erreurs de syntaxe.

  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,
    je comprend tout à fait, je suis désolé. J'ai continué à travailler ça de mon côté et j'ai réussi à faire quelque chose qui correspond à ce que je souhaite faire.

    Néanmoins j'avais une question : est-il possible, lorsque l'on est dans une fonction avec plusieurs "if", de faire en sorte que, si une condition est remplie on sorte de la fonction (et pas simplement passer à la suite de notre fonction) ?

  4. #4
    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
    Oui, c'est tout à fait possible, en levant une exception. OCaml en a une par défaut pour ce genre de situation : Exit

    Il suffit donc d'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let f x = if cond then raise Exit else reste_du_code
    Et dans la fonction qui appelle f il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    let g x = try f x with Exit -> ...
    Attention, comme partout, la branche du try et celle du with doivent avoir le même type (sachant que la fonction raise est de type exception -> 'a donc on peut lever des exceptions où on veut)

    On ne peut donc pas écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let g x = 
      try let a = f x in 0
      with Exit -> true
    par exemple

Discussions similaires

  1. [XL-2016] Affichage d'un nombre par défaut après effacement à l'aide d'un bouton de contrôle
    Par Ragnart dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/11/2016, 19h52
  2. Forcer typage et affichage d'un nombre
    Par Metallic-84s dans le forum Langage
    Réponses: 4
    Dernier message: 14/03/2006, 11h21
  3. Affichage d'un nombre binaire
    Par Jero13 dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 22h17
  4. Création vertex pour affichage en Triangle Strips
    Par ReiKiss dans le forum DirectX
    Réponses: 2
    Dernier message: 09/11/2005, 10h31

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