Page 2 sur 5

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 17:00
par FR4NK13
Ah oui, je viens de voir un ENDSELECT était mal placé... merci ! :)

Ah zut effectivement j'avais pas réfléchi minutieusement... Bon, pour la prochaine version du jeu, je vais apporter des modif pour rectifier l'équilibre. (Du genre donner +2 points quand on gagne avec les ciseaux, et un seul point lorsque l'on gagne avec le papier.

Sinon je vais voir de compléter en modifiant le jeu pour rajouter des options.

A bientôt ^^

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 17:06
par Ar-S
pers j'aurai pas mis le puit.
sinon je ferai un bind général pour les event gadget et unr proce à part pour les points (j'ai gardé ton code au plus près de ce qu il était)

Code : Tout sélectionner

EnableExplicit
Enumeration
  #Pierre
  #Papier
  #Ciseaux
  #Puit
  #Texte
  #Score
  
  
EndEnumeration

Global.b Mes_points, resultat
Global.b Ses_points
Global Formwith = 800
Global a$

Declare Checkpoint()


Procedure ChekPoint()
  
  If Mes_Points = 6
    Resultat = MessageRequester("Felicitations","Bravo, tu as gagné ! On rejoue ? ",#PB_MessageRequester_YesNo)
  EndIf
  If Resultat = #PB_MessageRequester_Yes   
    a$ + "Oui"
  Else               
    a$ + "Non"
  EndIf
  
  If resultat = 6
    Ses_points = 0
    Mes_Points = 0
  Else
    If resultat = 7
      End
    EndIf
    
    
    If Ses_points = 6
      Resultat = MessageRequester("Dommage","Oh, tu as perdu... On rejoue ?",#PB_MessageRequester_YesNo)
    EndIf
    
    If Resultat = 6     
      a$ + "Oui"
    Else               
      a$ + "Non"
    EndIf
    
    If resultat = 6
      Ses_points = 0
      Mes_Points = 0
    Else
      If resultat = 7
        End
      EndIf
    EndIf
  EndIf
  
  SetGadgetText(#Score, Str(Mes_Points) + " <==== TOI / IA ====> " + Str(Ses_points))
EndProcedure


;==================================================================================



Procedure Partie()
  
  
  ; PIERRE
  
  Protected.b Adversaire
  Protected.l a$
  
  Select EventGadget()
      
    Case #Pierre
      Adversaire = Random(4,1)
      
      Select Adversaire
        Case 1
          MessageRequester(" . . . . Choix . . . .","Pierre")
        Case 2   
          MessageRequester(" . . . . Choix . . . .","Papier")
          Ses_Points +1
        Case 3
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Mes_points +1
        Case 4
          MessageRequester(". . . . Choix . . . .","Puit")
          
      EndSelect
      
      ChekPoint()
      
      ; PAPIER
      
    Case #Papier
      Adversaire = Random(4,1)
      
      Select Adversaire
        Case 1
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Mes_Points +1
        Case 2
          MessageRequester(" . . . . Choix . . . .","Papier")
        Case 3
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          ses_points +1
        Case 4
          MessageRequester(". . . . Choix . . . .","Puit")
          Mes_Points +1
          
      EndSelect
      
      ChekPoint()
      
      ; CISEAUX
      
    Case #Ciseaux
      Adversaire = Random(4,1)
      
      Select Adversaire
        Case 1
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Ses_Points +1
        Case 2
          MessageRequester(" . . . . Choix . . . .","Papier")
          Mes_Points +1
        Case 3
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
        Case 4
          MessageRequester(". . . . Choix . . . .","Puit")
          Ses_Points +1
          
      EndSelect
      
      ; PUIT
      ChekPoint()
      
      
    Case #Puit
      Adversaire = Random(4,1)
      
      
      Select Adversaire
        Case 1
          MessageRequester(" . . . . Choix . . . .","Pierre")
          
        Case 2
          MessageRequester(" . . . . Choix . . . .","Papier")
          Ses_Points +1
        Case 3
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Mes_Points +1
        Case 4
          MessageRequester(". . . . Choix . . . .","Puit ")
          
      EndSelect
      ChekPoint()
      
      EndSelect
      
      
    EndProcedure
    
    
    
    ;==================================================================================
    
    
    
    Procedure Resize()
      
      Protected wf = WindowWidth(0,1),wh = WindowHeight(0,1),bw = GadgetWidth(0,1),bh = GadgetHeight(0,1)
      
      
      ResizeGadget(#pierre,(wf /2) - (bw /0.3),(wh /1.85) - (bh /2),#PB_Ignore,#PB_Ignore) ; Pierre
      ResizeGadget(#Papier,(wf /2) - (bw /0.3),(wh /1.72) - (bh /2),#PB_Ignore,#PB_Ignore) ; Papier
      ResizeGadget(#Ciseaux,(wf /2) - (bw /0.3),(wh /2) - (bh /2),#PB_Ignore,#PB_Ignore)   ; Ciseaux
      ResizeGadget(#Puit,(wf /2) - (bw /0.3),(wh /2.19) - (bh /2),#PB_Ignore,#PB_Ignore)   ; Puit
      ResizeGadget(#Texte,(wf /2) - (bw /0.3),(wh /6.5) - (bh /2),#PB_Ignore,#PB_Ignore)   ; Texte
      ResizeGadget(#Score,(wf /2) - (bw /0.5),(wh /3) - (bh /2),#PB_Ignore,#PB_Ignore)     ; Score
      
      
      
    EndProcedure
    
    
    
    ;==================================================================================
    
    
    
    Procedure Fenetre()
      
      
      If OpenWindow(0,0,0,formWith,600,"Pierre, Papier, Ciseaux V.1.1",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget)
        
        ButtonGadget(#Pierre,0,0,230,20,"Pierre")
        ButtonGadget(#Papier,0,0,230,20,"Papier")
        ButtonGadget(#Ciseaux,0,0,230,20,"Ciseaux")
        ButtonGadget(#Puit,0,0,230,20,"Puit")
        TextGadget(#Texte,10,10,240,30,"Salut ! Tu veux jouer avec moi ? On va en 6 points",#PB_Text_Center)
        TextGadget(#Score,50,6,240,30,"0 <==== TOI / IA ====> 0")
        
        
        Resize()
        
        BindEvent(#PB_Event_SizeWindow,@Resize(),0)
        
        BindEvent(#PB_Event_Gadget , @Partie())
        ; BindGadgetEvent(#Papier, @Partie())
        ; BindGadgetEvent(#Ciseaux, @Partie())
        ; BindGadgetEvent(#Puit, @partie())
      EndIf
    EndProcedure
    fenetre()
    
    
    
    ;==================================================================================
    
    Define.l Event
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow 
    End

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 17:22
par Ar-S
Une version dégrossie.
Regarde surtout la différence de la proce checkpoint

Code : Tout sélectionner

EnableExplicit
Enumeration
  #Pierre
  #Papier
  #Ciseaux
  #Texte
  #Score
  
  
EndEnumeration

Global.b Mes_points, resultat
Global.b Ses_points
Global Formwith = 800
Global message1$, message2$

Declare Checkpoint()


Procedure ChekPoint()
  
  If Mes_points = 6 Or Ses_points = 6
    
    If Mes_Points = 6
      
      Message1$ = "Felicitations"
      Message2$ = "Bravo, tu As gagné ! On rejoue ? "
      
    ElseIf Ses_points = 6
      
      Message1$ = "Dommage"
      Message2$ = "Oh, tu as perdu... On rejoue ?"
      
    EndIf
    
    Resultat = MessageRequester(Message1$, Message2$, #PB_MessageRequester_YesNo)
    
    If Resultat = #PB_MessageRequester_Yes   
      Ses_points = 0
      Mes_Points = 0
    Else               
      End
    EndIf
    
  EndIf 
  
  SetGadgetText(#Score, Str(Mes_Points) + " <==== TOI / IA ====> " + Str(Ses_points))
EndProcedure


;==================================================================================



Procedure Partie()
  
  
  ; PIERRE
  
  Protected.b Adversaire
  Protected.l a$
  
  Select EventGadget()
      
    Case #Pierre
      Adversaire = Random(2)
      
      Select Adversaire
        Case 0
          MessageRequester(" . . . . Choix . . . .","Pierre = égalité")
        Case 1   
          MessageRequester(" . . . . Choix . . . .","Papier")
          Ses_Points +1
        Case 2
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Mes_points +1
          
      EndSelect
      
      ChekPoint()
      
      ; PAPIER
      
    Case #Papier
      Adversaire = Random(2)
      
      Select Adversaire
        Case 0
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Mes_Points +1
        Case 1
          MessageRequester(" . . . . Choix . . . .","Papier = égalité")
        Case 2
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          ses_points +1
          
      EndSelect
      
      ChekPoint()
      
      ; CISEAUX
      
    Case #Ciseaux
      Adversaire = Random(2)
      
      Select Adversaire
        Case 0
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Ses_Points +1
        Case 1
          MessageRequester(" . . . . Choix . . . .","Papier")
          Mes_Points +1
        Case 2
          MessageRequester(" . . . . Choix . . . .","Ciseaux = égalité")
                 
      EndSelect
      
      ChekPoint()
      
      
      EndSelect
      
      
    EndProcedure
    
    
    
    ;==================================================================================
    
    
    
    Procedure Resize()
      
      Protected wf = WindowWidth(0,1),wh = WindowHeight(0,1),bw = GadgetWidth(0,1),bh = GadgetHeight(0,1)
      
      
      ResizeGadget(#pierre,(wf /2) - (bw /0.3),(wh /1.85) - (bh /2),#PB_Ignore,#PB_Ignore) ; Pierre
      ResizeGadget(#Papier,(wf /2) - (bw /0.3),(wh /1.72) - (bh /2),#PB_Ignore,#PB_Ignore) ; Papier
      ResizeGadget(#Ciseaux,(wf /2) - (bw /0.3),(wh /2) - (bh /2),#PB_Ignore,#PB_Ignore)   ; Ciseaux
      ResizeGadget(#Texte,(wf /2) - (bw /0.3),(wh /6.5) - (bh /2),#PB_Ignore,#PB_Ignore)   ; Texte
      ResizeGadget(#Score,(wf /2) - (bw /0.5),(wh /3) - (bh /2),#PB_Ignore,#PB_Ignore)     ; Score
      
      
      
    EndProcedure
    
    
    
    ;==================================================================================
    
    
    
    Procedure Fenetre()
      
      
      If OpenWindow(0,0,0,formWith,600,"Pierre, Papier, Ciseaux V.1.1",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget)
        
        ButtonGadget(#Pierre,0,0,230,20,"Pierre")
        ButtonGadget(#Papier,0,0,230,20,"Papier")
        ButtonGadget(#Ciseaux,0,0,230,20,"Ciseaux")
        TextGadget(#Texte,10,10,240,30,"Salut ! Tu veux jouer avec moi ? On va en 6 points",#PB_Text_Center)
        TextGadget(#Score,50,6,240,30,"0 <==== TOI / IA ====> 0")
        
        
        Resize()
        
        BindEvent(#PB_Event_SizeWindow,@Resize(),0)
        
        BindEvent(#PB_Event_Gadget , @Partie())
        ; BindGadgetEvent(#Papier, @Partie())
        ; BindGadgetEvent(#Ciseaux, @Partie())
        ; BindGadgetEvent(#Puit, @partie())
      EndIf
    EndProcedure
    fenetre()
    
    
    
    ;==================================================================================
    
    Define.l Event
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow 
    End

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 18:03
par FR4NK13
pers j'aurai pas mis le puit.
sinon je ferai un bind général pour les event gadget et unr proce à part pour les points
Concernant le puit, je vais équilibrer en rajoutant un cinquième élément : le cheval (Oui bon c'est ma fille qui a choisi... x) )
J'ai réussi ainsi à rééquilibrer le système de points, qui sera à présent de un nul, deux échecs et deux réussites pour tout le monde.

Pour ton bind général je ne savais pas que cela était possible, je retiens ça ce sera plus pratique merci ^^

Pour les boutons YES/NO merci aussi, c'est ce que je voulais faire à la base c'est beaucoup plus simple ainsi et plus propre. J'avais juste pas réussi à le faire comme ça, malgré la doc j'ai pu faire que le deuxième système plutôt alambiqué :lol:
Pourquoi faire simple quand on peut faire compliqué comme on dit lol

Je préfère ta deuxième version, je vais faire ainsi, pas mal le système de points à part aussi.

Merci beaucoup ! :)

Re: Pierre Papier Ciseaux

Publié : dim. 15/juil./2018 2:23
par poshu
FR4NK13 a écrit : le cheval (Oui bon c'est ma fille qui a choisi... x) )
C'est cool, comme ça Cheval contre Ciseaux, ça fait de la colle et des lasagnes :D

Re: Pierre Papier Ciseaux

Publié : lun. 16/juil./2018 21:38
par FR4NK13
poshu a écrit :
FR4NK13 a écrit : le cheval (Oui bon c'est ma fille qui a choisi... x) )
C'est cool, comme ça Cheval contre Ciseaux, ça fait de la colle et des lasagnes :D
Pouahahaha écoeurant xD

Voilà maintenant mon code marche pour l'instant (comprenez ; avant ma prochaine amélioration^^)
Mais j'aurais quelques questions @Ar-S :

J'ai fait des modifications, et j'aimerais avoir ton avis dessus. (Au besoin je remettrai comme tu as fait si c'est mieux)

Dans l'ordre :

- Pourquoi Random(2) ? ce n'est pas Random (3,1) normalement ? J'ai rajouté Puit et Cheval, du coup j'ai mis (4,0)
- Pourquoi ne pas mettre le Random une seule fois, au début de Partie comme j'ai fait là ?
- Pourquoi faut-il déclarer CHECKPOINT, mais pas les autres procédures ?
- Pourquoi ces message$ au lieu du Requester ? Comme cela, ça a l'air plus compliqué car il faut déclarer une variable.

Je crois que c'est à peu près tout... Ah oui, pourquoi "Resultat et après la virgule de la variable "mes points" et non à part ?

voici mon code :

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Pierre
  #Papier
  #Ciseaux
  #Puit
  #Cheval
  #Texte
  #Score
EndEnumeration

Global.b Mes_points, resultat
Global.b Ses_points
Global Formwith = 800
Global message1$, message2$

Declare Checkpoint()

;==================================================================================


Procedure ChekPoint()
 
  If Mes_points = 6 Or Ses_points = 6
   
    If Mes_Points = 6
     
      Message1$ = "Felicitations"
      Message2$ = "Bravo, tu as gagné ! On rejoue ? :D "
     
    ElseIf Ses_points = 6
     
      Message1$ = "Dommage"
      Message2$ = "Oh, tu as perdu... On rejoue ? :)"
     
    EndIf
   
    Resultat = MessageRequester(Message1$, Message2$, #PB_MessageRequester_YesNo)
   
    If Resultat = #PB_MessageRequester_Yes   
      Ses_points = 0
      Mes_Points = 0
    Else               
      End
    EndIf
   
  EndIf
 
  SetGadgetText(#Score, Str(Mes_Points) + " <==== TOI / IA ====> " + Str(Ses_points))
EndProcedure


;==================================================================================


Procedure Partie()
  
  Protected.b Adversaire = Random(4,0)
 
  Select EventGadget()
      
      ; PIERRE
      
    Case #Pierre      
     
      Select Adversaire
        Case 0
          MessageRequester(" . . . . Choix . . . .","Pierre")
        Case 1   
          MessageRequester(" . . . . Choix . . . .","Papier")
          Ses_Points +1
        Case 2
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Mes_points +1
        Case 3 
          MessageRequester(" . . . . Choix . . . .","Puit")
          Ses_Points +1
        Case 4
          MessageRequester(" . . . . Choix . . . .","Cheval")
          Mes_points +1
      EndSelect
     
      ChekPoint()
     
      ; PAPIER
     
    Case #Papier      
     
      Select Adversaire
        Case 0
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Mes_Points +1
        Case 1
          MessageRequester(" . . . . Choix . . . .","Papier")
        Case 2
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          ses_points +1
        Case 3
          MessageRequester(" . . . . Choix . . . .","Puit")
           Mes_Points +1
        Case 4
          MessageRequester(" . . . . Choix . . . .","Cheval")
          ses_points +1
      EndSelect
     
      ChekPoint()
     
      ; CISEAUX
     
    Case #Ciseaux      
     
      Select Adversaire
        Case #Pierre
          MessageRequester(" . . . . Choix . . . .","Pierre")
          Ses_Points +1
        Case #Papier
          MessageRequester(" . . . . Choix . . . .","Papier")
          Mes_Points +1
        Case #Ciseaux
          MessageRequester(" . . . . Choix . . . .","Ciseaux")      
        Case #Puit
          MessageRequester(" . . . . Choix . . . .","Puit")
          Ses_Points +1
        Case #Cheval  
          MessageRequester(" . . . . Choix . . . .","Cheval")
          Mes_Points +1
      EndSelect
     
      ChekPoint()
     
       ; PUIT
     
    Case #Puit      
     
      Select Adversaire
        Case #Pierre
          MessageRequester(" . . . . Choix . . . .","Pierre")
           Mes_Points +1
        Case #Papier
          MessageRequester(" . . . . Choix . . . .","Papier")
          Ses_Points +1
        Case #Ciseaux
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Mes_Points +1
        Case #Puit
          MessageRequester(" . . . . Choix . . . .","Puit")      
        Case #Cheval
          MessageRequester(" . . . . Choix . . . .","Cheval")
           Ses_Points +1
      EndSelect
     
      ChekPoint()
      
      
         ; CHEVAL
     
    Case #Cheval      
     
      Select Adversaire
        Case #Pierre
          MessageRequester(" . . . . Choix . . . .","Pierre")
            Ses_Points +1
        Case #Papier
          MessageRequester(" . . . . Choix . . . .","Papier")
          Mes_Points +1
        Case #Ciseaux
          MessageRequester(" . . . . Choix . . . .","Ciseaux")
          Ses_Points +1
        Case #Puit  
          MessageRequester(" . . . . Choix . . . .","Puit")
         Mes_Points +1
        Case #Cheval
          MessageRequester(" . . . . Choix . . . .","Cheval")
      EndSelect
      
      ChekPoint()
      ;===============================================================================================
      
      EndSelect
     
    EndProcedure   
   
   
;==================================================================================   
    
    
Procedure Resize()
     
      Protected wf = WindowWidth(0,1),wh = WindowHeight(0,1),bw = GadgetWidth(0,1),bh = GadgetHeight(0,1)
     
      ResizeGadget(#pierre,(wf /2) - (bw /0.3),(wh /2) - (bh /2),#PB_Ignore,#PB_Ignore)     ; Pierre
      ResizeGadget(#Papier,(wf /2) - (bw /0.3),(wh /1.85) - (bh /2),#PB_Ignore,#PB_Ignore)  ; Papier
      ResizeGadget(#Ciseaux,(wf /2) - (bw /0.3),(wh /1.72) - (bh /2),#PB_Ignore,#PB_Ignore) ; Ciseaux
      ResizeGadget(#Puit,(wf /2) - (bw /0.3),(wh /1.60) - (bh /2),#PB_Ignore,#PB_Ignore)    ; Puit
      ResizeGadget(#Cheval,(wf /2) - (bw /0.3),(wh /1.50) - (bh /2),#PB_Ignore,#PB_Ignore)  ; Cheval
      ResizeGadget(#Texte,(wf /2) - (bw /0.3),(wh /6.5) - (bh /2),#PB_Ignore,#PB_Ignore)    ; Texte
      ResizeGadget(#Score,(wf /2) - (bw /0.5),(wh /3) - (bh /2),#PB_Ignore,#PB_Ignore)      ; Score
  
    EndProcedure
   
   
;==================================================================================
   
      
    Procedure Fenetre()
     
     
      If OpenWindow(0,0,0,formWith,600,"Pierre, Papier, Ciseaux V.1.2",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget)
       
        ButtonGadget(#Pierre,0,0,230,20,"Pierre")
        ButtonGadget(#Papier,0,0,230,20,"Papier")
        ButtonGadget(#Ciseaux,0,0,230,20,"Ciseaux")
        ButtonGadget(#Puit,0,0,230,20,"Puit")
        ButtonGadget(#Cheval,0,0,230,20,"Cheval")
        TextGadget(#Texte,10,10,240,30,"Salut ! Tu veux jouer avec moi ? On va en 6 points",#PB_Text_Center)
        TextGadget(#Score,50,6,240,30,"0 <==== TOI / IA ====> 0")
       
       
        Resize()
       
        BindEvent(#PB_Event_SizeWindow,@Resize(),0)
        BindEvent(#PB_Event_Gadget , @Partie())
   
      EndIf
    EndProcedure
    fenetre()
 
    
;==================================================================================
   
    Define.l Event
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
    End
Bonne soirée :)

Re: Pierre Papier Ciseaux

Publié : lun. 16/juil./2018 23:00
par Ar-S
Salut.
- Excepté checkpoint(), tes proces sont appelées par callback. Mais dans tous les cas, tu peux (devrais) les déclarer, ça peut éviter des pépins dans les longs codes.
- Random (2) équivaut à random (2,0) Dans mon exemples, les choix étaient 0 1 2 (pierre feuille ciseaux)
Pourquoi ne pas mettre le Random une seule fois, au début de Partie comme j'ai fait là ?
Pas en début de partie mais en début de ta proce qui s'active à chaque clic oui, j'aurai du le faire ainsi (même si ça change rien au déroulement de la chose)
Il en va de même pour ChekPoint() que tu peux simplement appeler une fois après ton endselect Ligne 180
Pourquoi ces message$ au lieu du Requester ?
Le requester est une commande. Je ne l'appelle qu'une fois.. Donc pour l'appeler une seule fois en permettant d'afficher différente phrases, ils faut que ses phrases soient stockées dans des variables. Message1$ pour le titre du requester, Message2$ pour le contenu du message.
Imagine que tu veuilles traduire ton jeu en anglais... Il te faudrait faire une procédure qui dirait
Si langue FR alors Ciseaux.s = "ciseaux" OU si langue = US alors Ciseaux.s = "scissors" ainsi dans ton code tu affiches juste ton bouton(#bouton,x,y,l,h, Ciseaux.s)
Etc.. 8)
pourquoi "Resultat et après la virgule de la variable "mes points" et non à part ?
ça c'est une synthaxe. On s'en fout un peu de l'ordre ici.
Je déclare globalement en .b tout ce qui se trouve à droite du .b
ça évite de devoir écrire : Global toto.b, titi.b, tata.b etc...
Je préfère déclarer les même types de variable sur la même ligne ainsi.
D'ailleurs j'avais utilisé .b car tes .l sont inutiles
Regarde dans la doc. (dans l'index, la commande =) tu verras que les .b (byte) vont d'une valeur de -128 à 128
ça suffit amplement pour résultat qui doit aller jusqu'à 6 ainsi que le score.

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 20:45
par FR4NK13
Et me revoilà ici comme promis !

Donc j'ai tenté de refaire le pierre papier ciseaux sans regarder mon ancien code (j'ai eu du mal, j'ai un peu zieuté quand même.... :oops: :roll: ) bon pas trop non plus, juste pour le SELECT et le REPEAT à la fin.

Il y a juste un soucis que je n'arrive pas à résoudre sans tricher, le+STR pour le score.

PS : Merci Ar-s pour tes explications sur le post précédent, j'avais oublié de répondre :oops:

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Texte
  #Score
  #Pierre
  #Papier
  #Ciseaux
EndEnumeration 

Global Event 
Global.b Mes_points, Ses_Points

Declare fenetre()
Declare Points()
Declare Partie()


Procedure fenetre()
  
  
  If OpenWindow(0, 0, 0, 1000, 1000, "Pierre, Papier, Ciseaux V.1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    TextGadget(#Texte,470,100,100,100,"Bon jeu!")
    TextGadget(#Score,490,370,100,100,"0 - 0")
    
    ButtonGadget(#Pierre, 400,  190, 200, 20, "Pierre")
    ButtonGadget(#Papier, 400,  220, 200, 20, "Papier")
    ButtonGadget(#Ciseaux, 400, 250, 200, 20, "Ciseaux")
    
   
    
    
  EndIf 
  
  ; Ici, j'ai répété trois fois l'opération pour ne pas tricher et regarder le code, 
  ;mais je sais que l'on peut le faire en un seul Bind, en remplaçant la constante personnalisée par une constante unique de purebasic
  ;du genre "#Event_Pure_basic".
  
  BindGadgetEvent(#Pierre, @Partie())
  BindGadgetEvent(#Papier, @Partie())
  BindGadgetEvent(#Ciseaux, @Partie())
EndProcedure
fenetre()

Procedure points()
  
  If Mes_points = 1 
    MessageRequester("info","tu as gagné")
    End ; Oui je sais, c'est pas bien. Il faut utiliser close_Windows. Mais c'est quoi la différence concrètement ? J'arrive pas à utiliser Close_Windows --'
  Else 
    If Ses_Points = 1
      MessageRequester("info","Tu as perdu")
       End
    EndIf 
   
  EndIf 
  
  ; Voilà tout marche sauf la ligne ci-après. Je n'arrive pas à utiliser le +STR...
  
  TextGadget(#Score,490,370,100,100,""+Str(Mes_points.b)"")
  
EndProcedure

Procedure partie()
  
    Protected.b Adversaire = Random(3,1)

    ;Ici j'ai dû regarder mon code car je ne m'en sortais pas ; dans la doc, il manquait le select eventgadget
    ;et le case #constante
    
  Select EventGadget()
      
    Case #Pierre      
      Select Adversaire    
        Case 1
          MessageRequester("info","Pierre")
        Case 2
          MessageRequester("info","Papier")
          Ses_Points+1
        Case 3
          MessageRequester("info","Ciseaux")
          Mes_Points+1
      EndSelect
      
    Case #Papier
      Select Adversaire         
        Case 1       
         MessageRequester("info","Pierre")
          Mes_Points+1
        Case 2     
         MessageRequester("info","Papier")   
        Case 3     
         MessageRequester("info","Ciseaux")
          Ses_Points+1
      EndSelect
      
    Case #Ciseaux      
      Select Adversaire         
        Case 1         
          MessageRequester("info","Pierre")
          Ses_Points+1
        Case 2         
          MessageRequester("info","Papier")  
          Mes_Points+1
        Case 3          
        MessageRequester("info","Ciseaux")              
      EndSelect      
  
  EndSelect
  points()
EndProcedure
 
  ; Bon ici j'ai dû "tricher" un peu et jeter un oeil à mon ancien code, 
  ;mais uniquement parce qu'il me manquait le "Event = WaitWindowEvent()" 
  ;qui ne figurait pas dans la doc, et cela ne marchait pas sans.
  
Repeat 
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 20:53
par boby
; Voilà tout marche sauf la ligne ci-après. Je n'arrive pas à utiliser le +STR...

TextGadget(#Score,490,370,100,100,""+Str(Mes_points.b)"")

Code : Tout sélectionner

TextGadget(#Score,490,370,100,100,Str(Mes_points.b))
ou

Code : Tout sélectionner

TextGadget(#Score,490,370,100,100,"score :"+Str(Mes_points.b))
tes "" ne servent à rien s'il ne contiennent pas de text

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 20:54
par FR4NK13
Merci Boby, tellement frustrant de foirer une ligne à cause de deux guillemets de trop... :roll:

Cela dit, l'affichage des points reste à 0 même si la valeur s'ajuste bien. J'ai encore dû mal placer un truc :lol:

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 20:56
par boby
je t'ai répondu trop vite sans vraiment lire, j'ai donc édit mon poste.
et tes guillemets n'était de trop que par-ce qu'elles étaient vide, mais tu peux très bien faire :

Code : Tout sélectionner

TextGadget(#Score,490,370,100,100,"score : "+Str(Mes_points.b)+" points")

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 20:58
par FR4NK13
C'est bon ça marche, j'avais oublié de retirer le ; lol...

Merci :)

Bon par contre je suis incapable de rajouter le 2e +STR pour le score adverse et ce, même avec le modèle... --'

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 21:49
par poshu
Bon.

Déjà, je vais profiter de cette histoire de "" + str() machin pour expliquer un truc : La conversion de type.
Comme tu as déjà du t'en rendre compte, Pure Basic est typé, ça veut dire qu'une variable ne peut contenir que ceux pour quoi elle a été créée. Une variable de .s ne peut contenir qu'une chaine de caractères, une .u ne peut contenir qu'un entier naturel inférieur à 65536, une .f supporte des nombre à virgule flottante, etc etc...

Mais que se passe-t-il quand on veut convertir l'un en l'autre?
On peut utiliser des fonctions comme str(), round() ou val(), mais Pure Basic est souvent capable de faire cette conversion tout seul : par exemple, il va arrondir tout seul si j'écris A.i = B.f . On appelle ça l'auto cast, c'est moins précis que si on le fait manuellement, mais c'est plus pratique quand on a est pas sur des calcules d'une grande précision...
J'en arrive maintenant au cas particulier des strings : en PB, pour convertir une variable en string, on a donc Str(), ce qui nous permet d'écrire String.s = Str(value.q).

Mais PB est aussi capable d'auto cast les valeurs en string, pour peu qu'on le fasse dans l'ordre. Ainsi String.s = Value.q + "quelquechose" renvoie l'erreur :

Code : Tout sélectionner

Line 1: Can't mix strings with numerical values.
Mais, si on place une string en premier, alors ça va marcher : String.s = "quelquechose" + Value.q ne pose aucun problème.
C'est un petit quirk, probablement lié au fait que le compilateur de PB soit single pass... Pas très important mais toujours rigolo.

Bon, je zieute ton code maintenant....

Re: Pierre Papier Ciseaux

Publié : mar. 31/juil./2018 22:15
par poshu
Aloooors. Déjà, en dehors du problème de string d'au dessus, ça marche, et ça c'est cool!

Je vais répondre à quelques questions :
; Ici, j'ai répété trois fois l'opération pour ne pas tricher et regarder le code,
;mais je sais que l'on peut le faire en un seul Bind, en remplaçant la constante personnalisée par une constante unique de purebasic
;du genre "#Event_Pure_basic".
Alors là, y'a une petite confusion. Il y a deux type de bindevent dans pure : ceux sur des gadgets et ceux sur des events généraux.
Tu penses à BindEvent(#PB_Event_Gadget,@partie()); mais ce sont deux fonctions vraiment différentes : d'un coté, tu lies TOUS les gadgets à une seule fonction, de l'autre tu lies un gadget spécifique à une fonction spécifique.
End ; Oui je sais, c'est pas bien. Il faut utiliser close_Windows. Mais c'est quoi la différence concrètement ? J'arrive pas à utiliser Close_Windows --'
Et bien non plus. End est effectivement la bonne commande pour fermer ton programme; closewindow() aurait fermé ta fenêtre, mais le programme aurait continué à tourner en tache de fond (enfin, il aurait planté à la boucle suivante, mais c'est un autre sujet)

Code : Tout sélectionner

Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Bon, effectivement, la boucle event c'est pas pratique ni instinctif à utiliser pour un débutant. Cela dit, là, y'a une grosse redondance : tu stocks le résultat de la commande WaitWindowEvent() dans une variable que tu ne vas réutiliser qu'une seule fois, c'est donc inutile de la stocker :

Code : Tout sélectionner

Repeat
Until WaitWindowEvent()= #PB_Event_CloseWindow
(C'est du détail, mais ça me stresse :p)

Maintenant on va voir ensemble -étape par étape- les problèmes et tu vas essayer de les régler :
Premier problème :

Code : Tout sélectionner

Procedure fenetre()
	If OpenWindow(0, 0, 0, 1000, 1000, "Pierre, Papier, Ciseaux V.1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
		
		TextGadget(#Texte,470,100,100,100,"Bon jeu!")
		TextGadget(#Score,490,370,100,100,"0 - 0")
		
		ButtonGadget(#Pierre, 400,  190, 200, 20, "Pierre")
		ButtonGadget(#Papier, 400,  220, 200, 20, "Papier")
		ButtonGadget(#Ciseaux, 400, 250, 200, 20, "Ciseaux")
		
	EndIf
	
	BindGadgetEvent(#Pierre, @Partie())
	BindGadgetEvent(#Papier, @Partie())
	BindGadgetEvent(#Ciseaux, @Partie())
EndProcedure
fenetre()
Qu'est ce qui t'a motivé à écrire ça comme ça? Est ce que tu vois le problème dans ce petit extrait?

Re: Pierre Papier Ciseaux

Publié : mer. 01/août/2018 10:50
par FR4NK13
Merci Poshu pour tes réponses ! :)

Alors je vais essayer de répondre sans rien oublier.

Concernant le callback, dans mon ancien pierre papier ciseaux je me souviens d'avoir fait un seul bind pour pierre papier et ciseaux qui appelaient @partie. Ca marchait très bien d'ailleurs, puisque les seuls boutons sont pierre papier ciseaux ici, et il n'y a pas de boutons qui appellent une autre procédure que partie. Donc tant mieux si là j'ai bien fait, mais je ne comprends pas pourquoi du coup bien que j'ai compris parfaitement ce que tu veux dire :lol:


Tant mieux pour End aussi alors ! Je pensais que close_windows était plus approprié. Je prends note que End est donc bien la commande à utiliser, que l'autre ne ferme pas le programme mais seulement la fenêtre. Logique encore une fois, car windows veut dire fenêtre. Merci :)


Pour le repeat effectivement j'ai compris le soucis maintenant, j'ai fait un système involontaire de variable avec le "event" sur une ligne seule. Je retiens donc de le maître à la suite du until.



Concernant le passage dans le code que tu me montres, de ce que j'ai compris hier, j'ai mal placé les bind, c'est ça ?

Je vais essayer de détailler ce que j'ai voulu faire :

1 : J'ouvre la fenêtre dans une procédure, j'y place les gadgets.
2 : Je place les bind dans la procédure, mais après le endif afin qu'il ne soit pas dans la condition. (Si tu me demandes pourquoi hors de la condition, je ne saurais pas te répondre et effectivement ça paraît illogique... :roll: me semblait que dedans ça plantait.

3 : j'ai appelé la procedure à la fin pour deux raisons ; la première, c'est que j'avais une erreur qui me disait en gros qu'il fallait au moins une fenêtre d'ouverte pour ne je sais plus quoi ; je n'ai pu régler ce problème qu'en appelant la procédure. La deuxième, j'ai choisi cette procédure à appeler car c'était la première à appeler selon moi vu que c'est la fenêtre.

Pour le STR+, je suis un peu perdue je t'avouerais. J'ai là aussi compris le principe : faire un système mixte de lettres/symboles et numériques, mais le procédé m’échappe encore.

Voilà, merci beaucoup encore pour tes messages :)

Je rententerai une troisième fois de refaire ce programme pierre papier ciseaux.

Le soucis avec la doc, c'est que par moment elle n'est pas très appropriée ou bien elle est incomplète (comme pour le select et le repeat/until).

Je vais donc m'entrainer avec les conditions if/select puis dans les autres fonctions à part comme pour ouvrir une fenetre Yes/No avant de me relancer une dernière fois dans le codage du pierre papier ciseaux.

Certes le plus délicat pour moi dans ce programme, c'est l'affichage du score. Donc une fois que je me serais encore un peu mieux familiariser avec les conditions, je vais essayer de travailler sur ça jusqu'à comprendre correctement le fonctionnement.