Simulation de lancers de dés.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
jacques
Messages : 19
Inscription : mar. 05/juil./2011 17:24

Simulation de lancers de dés.

Message par jacques »

Bonjour,

Je me lance en vous proposant mon premier code:
Il s'agit juste d'afficher les résultats de plusieurs lancers de dés et de les montrer graphiquement.
Pour moi il s'agissait surtout d'apprendre à manipuler un certain nombre d'instructions et de gadget de PB.

Maintenant j'attends toutes les remarques que vous pourrez me faire pour corriger et améliorer ma manière de programmer.
On apprend par ses erreurs.

Code : Tout sélectionner

;-Démo de lancers de dé
; avec graphique et tableaux de résultats.

;PureBasic 4.51(x64) version demo

Enumeration
  ;interface
  #Fen1
  #Menu
  #MenuQuit
  #choix2
  #choix21
  #choix24

  #Aide1
  #Aide2
  #Arbre1
  #fermer
  
  
  ;aplication
  #EditTirage1               ;tableau des résultats de chaque tirage d'un dé
  #EditTirage2               ;tableau des résultats de chaque tirage de deux dés
EndEnumeration


Declare Menu()
Declare ButProgramme()
Declare ModeEmploi()

Declare DemandeNombretirages()
Declare Tirage1()
Declare Tirage2()
Declare Tirage()
Declare Tun(c)
Declare Tdeux(c)
Declare AffichUn(e)
Declare AffichDeux(e)
Declare Barres1(i)
Declare Barres2(i)
Declare Barres(i)
Declare Detruit()

Global Dim undet(5)
Global Dim deuxdest(10)
Global NombreTirages


largeurFen1=500
hauteurFen1= 750
titre$="Lancer de dés"
#FLAGS = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget 

;-boucle principale
If OpenWindow(#Fen1, 0, 0, largeurFen1, hauteurFen1, titre$, #FLAGS)
  SetWindowColor(#Fen1, RGB(100,100,200))
  
  Menu()
  
  Repeat
    Event.l = WaitWindowEvent()
		Select Event
			Case #PB_Event_Menu              ;Sélection d'événements dans le menu 
			  Select EventMenu()
					Case #MenuQuit
					  Quit = #True
					Case #choix2  
					  Tirage1()
					Case #choix21  
					  Tirage2()
					Case #choix24
					 Tirage()
					Case #Aide1
					  ButProgramme()
					Case #Aide2
					  ModeEmploi()
			  EndSelect  
			Case #PB_Event_Gadget            ;Sélection d'événements dans un gadget
				Select EventGadget()
				  Case #fermer                 ;fermeture du mode d''emploi
              FreeGadget(#Arbre1) 
              FreeGadget(#fermer) 
				EndSelect
		EndSelect
  Until event = #PB_Event_CloseWindow Or Quit=#True 
EndIf

;-Procédures de l'application
Procedure Tirage1()                   ;Gère les lancers d'un seul dé
  Repeat
    nbrti=DemandeNombretirages()
    Tun(nbrti)
    Barres1(nbrti)
  Until nbrti = 0
  Detruit()
EndProcedure

Procedure Tirage2()                    ;Gère les lancers de deux dés
  Repeat
    nbrti=DemandeNombretirages()
    Tdeux(nbrti)
    Barres2(nbrti)
  Until nbrti = 0
  Detruit()
EndProcedure

Procedure Tirage()                     ;Gère les lancers de un et deux dés
  Repeat
    nbrti=DemandeNombretirages()
    Tun(nbrti)
    Tdeux(nbrti)
    Barres1(nbrti)
    Barres2(nbrti)
  Until nbrti = 0
  Detruit()
EndProcedure

Procedure Barres1(a)                   ;Affiche les barres de progression des lancers d'un dé
  If a=0
     a=1
  EndIf
  x=-6
  For t = 1 To 6 
    TextGadget       (t+40, x+(t*30),   710, 30,  15, Str(t), #PB_Text_Center);
    ProgressBarGadget(t+120,x+(t*30),   422,  30, 288, 0, 288, #PB_ProgressBar_Vertical)
    SetGadgetState   (t+120, undet(t-1)*288/a)
  Next
EndProcedure
 
Procedure Barres2(a)                   ;Affiche les barres de progression des lancers de deux dés
  If a=0
     a=1
   EndIf
   
    x=165
  For t = 2 To 12 
    TextGadget       (t+50, x+(t*25),   710, 25,  15, Str(t), #PB_Text_Center)
    ProgressBarGadget(t+130,x+(t*25),   422,  25, 288, 0, 288, #PB_ProgressBar_Vertical)
    SetGadgetState   (t+130, deuxdest(t-2)*576/a)
  Next
  
EndProcedure

Procedure Barres(a)                    ;Affiche les barres de progression de tous les lancers
 If a=0
     a=1
  EndIf
  x=-24
  For t = 1 To 6 
    TextGadget       (t+40 ,x+(t*30),   710, 30,  15, Str(t), #PB_Text_Center)
    ProgressBarGadget(t+120,x+(t*30),   422,  30, 288, 0, 288, #PB_ProgressBar_Vertical)
    SetGadgetState   (t+120, undet(t-1)*288/a)
  Next 
    x=154
  For t = 2 To 12 
    TextGadget       (t+50, x+(t*20),   710, 20,  15, Str(t), #PB_Text_Center)
    ProgressBarGadget(t+130,x+(t*20),   422,  20, 288, 0, 288, #PB_ProgressBar_Vertical)
    SetGadgetState   (t+130, deuxdest(t-2)*576/a)
  Next
 
EndProcedure

Procedure DemandeNombretirages()
  text$= Str(NombreTirages)
  NombreTirages = Val(InputRequester("choix du nombre de coups","Entrez un nombre entier positif : (rien ou 0 pour quitter)",text$)) 
  ProcedureReturn NombreTirages
EndProcedure

Procedure Tun(a)                       ;simule les lancers d'un dé et compte les points
 un = deux = 0 : trois = quatre = 0 :cinq = six = 0 
  For i=1 To a
    n= Random (5)+1
    Select n
      Case 1 : un     = un     + 1  
      Case 2 : deux   = deux   + 1 
      Case 3 : trois  = trois  + 1 
      Case 4 : quatre = quatre + 1 
      Case 5 : cinq   = cinq   + 1 
      Case 6 : six    = six    + 1 
    EndSelect 
  Next
  undet(0)=un : undet(1)=deux : undet(2)=trois : undet(3)=quatre : undet(4)=cinq : undet(5)=six 
  AffichUn(a)
EndProcedure

Procedure Tdeux(a)                     ;simule les lancers de deux dés et compte les points
  un = deux = 0 : trois = quatre = 0 :cinq = six = 0 : sept = huit = 0 : neuf = dix = 0 : onze = douze = 0
  For i=1 To a
    n= Random (5)+1
    m= Random (5)+1
    tirage=m+n
      Select tirage
        Case 2  : deux   = deux   + 1 
        Case 3  : trois  = trois  + 1 
        Case 4  : quatre = quatre + 1 
        Case 5  : cinq   = cinq   + 1 
        Case 6  : six    = six    + 1 
        Case 7  : sept   = sept   + 1  
        Case 8  : huit   = huit   + 1 
        Case 9  : neuf   = neuf   + 1 
        Case 10 : dix    = dix    + 1 
        Case 11 : onze   = onze   + 1 
        Case 12 : douze  = douze  + 1 
      EndSelect           
  Next
  
  deuxdest(0) = deux : deuxdest(1) = trois : deuxdest(2) = quatre : deuxdest(3) = cinq : deuxdest(4) = six : deuxdest(5) = sept : deuxdest(6) = huit : deuxdest(7) = neuf : deuxdest(8) = dix : deuxdest(9) = onze  : deuxdest(10)= douze 
  AffichDeux(a)
EndProcedure

Procedure AffichUn(a)                  ;affiche un tableau de résultats pour un dé
  EditorGadget  (#EditTirage1, 10, 10, 220, 280)
  SetGadgetColor(#EditTirage1, #PB_Gadget_BackColor,  RGB(255, 210, 50 ))
  SetGadgetColor(#EditTirage1, #PB_Gadget_FrontColor, RGB(160, 0  , 200))
  For i =0  To 5
    AddGadgetItem(#EditTirage1, i+1, "Nombre de " + Str(i+1) + ":" +  Chr(9) +  Str(undet(i))  +  Chr(9)  +  Left(StrF(undet(i) *  36/a),5) +  "  36ième")  
  Next
EndProcedure

Procedure AffichDeux(a)                ;affiche un tableau de résultats pour deux dés
  EditorGadget(#EditTirage2, 270, 10, 220, 280)
  SetGadgetColor(#EditTirage2, #PB_Gadget_BackColor, RGB(255, 210, 50))
  SetGadgetColor(#EditTirage2, #PB_Gadget_FrontColor, RGB(160, 0, 200))  
  For i =0  To 10
    AddGadgetItem(#EditTirage2, i+1, "Nombre de " + Str(i+2) + ":" +  Chr(9) +  Str(deuxdest(i))  +  Chr(9)  +  Left(StrF(deuxdest(i)*36/a),5) +  "  36ième")  
  Next
EndProcedure

Procedure Detruit()                    ;Efface tous les affichages avant chaque nouveau lancer
  For i = 41 To 142 
    FreeGadget(i)
  Next
  FreeGadget(#EditTirage1)
  FreeGadget(#EditTirage2)
EndProcedure


;-Procédures liées à l'interface et à l'aide
Procedure Menu()
  If CreateMenu(#Menu, WindowID(#Fen1))
    MenuTitle("menu1")
			MenuBar()
			MenuItem(#MenuQuit, "Quit")
		MenuTitle("Choix")
		  MenuItem(#choix2, "Lancer un dé")
		  MenuItem(#choix21,"Lancer deux dés")
		  MenuItem(#choix24,"Comparer les deux")
    MenuTitle("Aide")
      MenuItem(#Aide1,  "buts de ce programme")
		  MenuItem(#Aide2,  "Mode d'emploi")
  EndIf
EndProcedure

Procedure ButProgramme()
  MessageRequester("aide", "Ce logiciel est destiné à montrer le fonctionnement du hasard en comparant deux cas simples : le lancer d'un seul dé et celui de deux dés....",#PB_MessageRequester_Ok)
EndProcedure

Procedure ModeEmploi()
  If TreeGadget(#Arbre1, 40, 10, 419, 500) 
    AddGadgetItem (#Arbre1, -1, "Mode d'emploi", 0, 0) 
    AddGadgetItem (#Arbre1, -1, "Généralités", 0, 1)  
    AddGadgetItem (#Arbre1, -1, "Le mode d'emploi est simple : il suffit de choisir dans le menu -choix-,", 0, 2)
    AddGadgetItem (#Arbre1, -1, "puis d'entrer le nombre de lancers voulus.", 0, 2) 
    AddGadgetItem (#Arbre1, -1, "Lancer d'un seul dé", 0, 1)
    AddGadgetItem (#Arbre1, -1, "Puisqu'il y a six cas possibles, vous avez une chance sur six de tomber",0,2)
    AddGadgetItem (#Arbre1, -1, "sur l'un des six nombres.",0,2)
    AddGadgetItem (#Arbre1, -1, "À chaque lancer le hasard est total. Vous pouvez le constater en répétant", 0, 2)
    AddGadgetItem (#Arbre1, -1, "des petits nombres de tirages, voire plusieurs fois le même petit nombre.",0,2)
    AddGadgetItem (#Arbre1, -1, "Pourtant sur un grand nombre de lancers, les résultats s'équilibrent :", 0, 2)
    AddGadgetItem (#Arbre1, -1, "tout les nombres joués arrivent à la même hauteur.", 0, 2)
    AddGadgetItem (#Arbre1, -1, "Lancer de deux dés", 0, 1)
    AddGadgetItem (#Arbre1, -1, "Ici le résultat est moins simple. Le hasard est toujours présent et rien", 0, 2)
    AddGadgetItem (#Arbre1, -1, "n'est prévisible pour les petits nombres.", 0, 2)
    AddGadgetItem (#Arbre1, -1, "Les possibilités ne sont plus égales à six. Je vous laisse trouver à", 0, 2)
    AddGadgetItem (#Arbre1, -1, "combien elles s'élèvent.", 0, 2)
    AddGadgetItem (#Arbre1, -1, "essayez de prévoir les résultats et la forme du graphique avant de", 0, 2)
    AddGadgetItem (#Arbre1, -1, "jouer. Lancez le jeu et voyez si les résultats sont conformes à vos attentes.", 0, 2)
    AddGadgetItem (#Arbre1, -1, "Comparaisons", 0, 1)
    AddGadgetItem (#Arbre1, -1, "En réunissant les deux jeux précédents vous pouvez comparer et tester", 0, 2)
    AddGadgetItem (#Arbre1, -1, "à volonté.", 0, 2)
    
    ButtonGadget(#fermer,459,11,15,15,"X")
  EndIf
EndProcedure
Jacques
PB 5.62 Linux Ubuntu 18.04.1 LTS (x64)
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simulation de lancers de dés.

Message par falsam »

Pour un premier code c'est pas mal.
Visiblement tu preferes la présentation d'un code selon case mais tu devrais essayer de déclarer tes variables globales en entete de code plutot que disséminées dans ton code.

Tu peux déclarer des variables propre à une procédure et sans aucune dépendance avec le reste du code.

Procedure Dummy()
Protected MaVariable.s
EndProcedure

je pense que la première ligne de ton code devrait être EnableExplicit
ça te permettrait de voir quelle sont les variables mal déclarées ou pas déclarées.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Simulation de lancers de dés.

Message par case »

salut, pour moi tu te complique l'existence en multipliant tes procédures.
tu pourrais avoir une seule procedure de lancement de dés
de meme pour le comptage ou tu utilise un select/case alors que tu peux directement indexer un tableau avec le résultat par exemple.

voila un petit exemple, pas aussi avance que le tiens
ou dans ma procedure d'affichage j'utilise le debuger , c'est moins joli j'avoue :)

Code : Tout sélectionner

Declare de(nb,type)
Declare statistiques(nb,type,lance)
Declare affiche_stats(nb,type,lance)
Global Dim stats(0)
;
; remplacer ici par les valeurs souhaitées
;
; nombre de des , nombre de faces , nombre de lancés
;
statistiques(2,6,10000)
affiche_stats(2,6,10000)
;
;
;
;
; procedure qui lance les dés
;
; nb  = nombre de des en main 
; type= nombre de faces 
;
Procedure de(nb,type) 
  result=0
  For a=1 To nb
    result + Random(type-1)+1
  Next  
  ProcedureReturn(result)
EndProcedure
; procedure de recuperation des statistique 
; effectue x lances de des et garde les resultats
;
Procedure statistiques(nb,type,lance)
  ; defini la taille de la liste
  Dim stats((type*nb)-nb)
  ; boucle de lancement de des
  For lance_des=1 To lance
    ; lance les des et compte les resultats
    r=(de(nb,type)-nb)
    stats(r)+1
  Next  
EndProcedure
; affichage stats
Procedure affiche_stats(nb,type,lance)
  percent.F=lance/100
  For show=0 To (type*nb)-nb
    pourcentage$=StrF(stats(show)/percent)
    pos=FindString(pourcentage$,".")
    entier$=Left(pourcentage$,pos)
    reste$=Mid(pourcentage$,pos+1,2)    
    Debug "resultat "+Str(show+nb)+"  "+Str(stats(show))+"  "+entier$+reste$+"%"
    total + stats(show)
  Next
EndProcedure


ImageImage
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simulation de lancers de dés.

Message par falsam »

case a écrit : ..... utilise un select/case alors que tu peux directement indexer un tableau avec le résultat par exemple.
Jacque (à) dit qu'il débute dans la programmation et je ne suis pas certain qu'il sache déjà utiliser les tableaux.

@Jacque :Si possible, affiches dans ta signature que tu utilises Pure Basic Demo et si tu es sur Windows, Linux ou Mac OS.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Simulation de lancers de dés.

Message par case »

ah trop compliqué pour lui a ton avis?

désolé je ne vois pas l’intérêt de ton commentaire.

on est justement là aussi pour lui montrer ce qu'on peux faire comment on peux le faire, c'est ça l'entraide.
il veux savoir comment on aurais fait, ce qui vas pas dans son code... je lui donne mon avis et je me fend d'un code pour l'exemple...
je ne vois pas ce que viens faire la dedans ce qu'il sait ou pas.

j'en reste là pas la peine de me répondre en me citant.

cordialement

case.
ImageImage
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Simulation de lancers de dés.

Message par falsam »

case a écrit :désolé je ne vois pas l’intérêt de ton commentaire....... pas la peine de me répondre en me citant
Je ne faisais que dire que Jacques débutait dans la programmation et que je ne suis pas certain qu'il sache déjà utiliser les tableaux. Tu aurais pu attendre sa réponse avant de me dire que mon commentaire n'avait aucun intérêt. Il aurait aimait PEUT ETRE qu'on lui explique le fonctionnement des tableaux en préambule de ton code. PEUT ETRE veut dire que il sait ..... ou pas. Je n'ai pas dénigrer ton code et cette maniée de dire les choses commence à m'agacer fortement !!!!!!

Jacques désolé de te pourrir ton post.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
jacques
Messages : 19
Inscription : mar. 05/juil./2011 17:24

Re: Simulation de lancers de dés.

Message par jacques »

Éh ho!

Pas la peine de vous engueuler pour moi.
Toutes les formes d'intervention peuvent m'être utile.

Falsam, j'apprécie tes conseils et ta sollicitude. Cela convient tout à fait à mon niveau de débutant.

Case, je te remercie de t'être donné la peine de me faire ce code ; il m'intéresse, même s'il n'est pas encore à ma portée dans tous ses détails. J'en comprends le principe et je vais l'étudier jusqu'à pouvoir vraiment tout comprendre et utiliser.

J'aime qu'on m'explique des choses simples, à mon niveau, pour pour avancer pas à pas.
Mais j''aime aussi me confronter à ce qui me dépasse, pour mieux orienter ces pas.

Vous me rendez service tous les deux, chacun avec votre approche.

Je vous en remercie donc tous les deux en souhaitant que ce n'était là qu'un mouvement d'humeur passager.

Désolé d'en avoir été à l'origine.
Jacques
PB 5.62 Linux Ubuntu 18.04.1 LTS (x64)
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Simulation de lancers de dés.

Message par case »

pas ta faute du tout...

je trouvais déplacé le commentaire de falsam , c'est pas dans mes habitudes de raler... ;)
ImageImage
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Simulation de lancers de dés.

Message par dayvid »

Bonjour @jacques

Bin franchement pour quelqu'un qui débute, pas mal :o
tu débute vraiment ?

En tous qu'a même si je ne t'aide pas
je t'encourage a continuer

C'est en fessant des petit programme qui d'apparence ne servent a rien qu'on apprend et évolue, beau boulot :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
jacques
Messages : 19
Inscription : mar. 05/juil./2011 17:24

Re: Simulation de lancers de dés.

Message par jacques »

Merci Dayvid,

Oui, je débute, mais Case et Falsam viennent justement de me montrer que j'ai encore beaucoup de progrès à faire.
En outre ma manière d'apprendre peut faire illusion : je ne fais pas ce que je veux.
J'apprends quelques instructions en les testant pour comprendre, puis j'essaie de voir ce que je peux en faire.

Ensuite j'espère profiter de toutes vos remarques pour continuer et évoluer jusqu'au moment où je serai capable, moi aussi, d"envisager d'abord un vrai programme puis de le réaliser selon mes souhaits.
Jacques
PB 5.62 Linux Ubuntu 18.04.1 LTS (x64)
Répondre