Page 1 sur 5

Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 18:49
par FR4NK13
Bonjour tout le monde :)

Je débute en programmation alors j'ai fait un petit "jeu" tout simple, le fameux pierre papier ciseaux.

Il fonctionne plutôt bien, mais je rencontre quelques petits soucis que je ne sais pas comment arranger.


- Je voudrais afficher les scores dans un textgadget, sauf que l'affichage de la variable reste toujours à 0 ?
- Lorsque j'affiche la deuxième variable du score, cela ne fait que déplacer l'autre.
- Lorsque dans les messagerequester je retire le logo info, cela décale le texte sur la gauche, ce qui me paraît inesthétique. Y-a-il un moyen pour centrer ?

Merci à tous :)


Voici mon petit code :

Code : Tout sélectionner

;EnableExplicit
Enumeration
 #Fenetre 
 #Texte
 #Pierre
 #Papier
 #Ciseaux
 #Partie
EndEnumeration

Global Event
Global Points
Global Adversaire
Global Mes_Points 
Global Ses_points 
Global Texte.s = "Salut ! Tu veux jouer avec moi ? :) On va en 3 points"

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

Procedure Partie()
  
  
  ; PIERRE
  
  Adversaire = Random(3,1)
 
  Select EventGadget()
      
    Case #Pierre
      Select Adversaire
        Case 1 
          MessageRequester(" . . . . Choix . . . ."," ♥  Pierre  ♥  ")
        Case 2   
          MessageRequester(" . . . . Choix . . . ."," ♥  Papier  ♥ ")
         Ses_Points +1
       Case 3 
         MessageRequester(" . . . . Choix . . . ."," ♥  Ciseaux  ♥ ")
          Mes_points +1
      EndSelect 
      
      
      ; PAPIER
      
    Case #Papier
      Select Adversaire
      Case 1 
        MessageRequester(" . . . . Choix . . . ."," ♥  Pierre  ♥")
        Mes_Points +1
        Case 2 
        MessageRequester(" . . . . Choix . . . ."," ♥  Papier  ♥ ")
       Case 3 
        MessageRequester(" . . . . Choix . . . ."," ♥  Ciseaux  ♥ ")
          ses_points +1
        
      EndSelect 
      
      
      ; CISEAUX

    Case #Ciseaux
      Select Adversaire
     Case 1 
        MessageRequester(" . . . . Choix . . . .","  ♥  Pierre  ♥ ")
        Ses_Points +1
        Case 2 
        MessageRequester(" . . . . Choix . . . .","  ♥  Papier  ♥")
           Mes_Points +1
       Case 3 
        MessageRequester(" . . . . Choix . . . .","  ♥ Ciseaux  ♥ ")
          
      EndSelect
  EndSelect


If Mes_Points = 3
     MessageRequester("Felicitations","Bravo, tu as gagné ! :D",#PB_MessageRequester_Warning) 
     End
   EndIf 
   
   If Ses_points = 3
     MessageRequester("Dommage","Oh, tu as perdu... :(",#PB_MessageRequester_Warning) 
     End 
   EndIf

   EndProcedure
   
;================================================================================== 
   
Procedure Fenetre()
  If OpenWindow(#Fenetre, 0, 0, 250, 250, "Jeu Pierre Papier Ciseaux V1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
 TextGadget(#Texte,10,10,240, 30,Texte)
TextGadget(Ses_points,50,60,240,30, Str(Ses_points))
;TextGadget(Mes_points,6,5,5,30, Str(Mes_points))

  ButtonGadget(#Pierre, 10,100,230 ,20,"Pierre") 
  ButtonGadget(#Papier, 10,130,230 ,20,"Papier")
  ButtonGadget(#Ciseaux, 10,160,230 ,20,"Ciseaux")
  
  BindGadgetEvent(#Pierre, @Partie()) 
  BindGadgetEvent(#Papier, @Partie()) 
  BindGadgetEvent(#Ciseaux, @Partie()) 
EndIf   


EndProcedure
Fenetre()
 
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow  
End  

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 19:44
par GallyHC
Code modifier :

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #Fenetre 
EndEnumeration
Enumeration gadget
  #Texte
  #Pierre
  #Papier
  #Ciseaux
  #Score
EndEnumeration

Global.l Mes_Points
Global.l Ses_points

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

Procedure Partie()
  ;
  ;
  ;
  Protected.l Adversaire = Random(3,1)

  Select EventGadget()
    Case #Pierre
      ;
      ; PIERRE
      ;
      Select Adversaire
        Case 1 
          MessageRequester(" . . . . Choix . . . ."," ♥  Pierre  ♥")
        Case 2   
          MessageRequester(" . . . . Choix . . . ."," ♥  Papier  ♥")
          Ses_Points + 1
        Case 3 
          MessageRequester(" . . . . Choix . . . ."," ♥  Ciseaux  ♥")
          Mes_points + 1
      EndSelect 
      ;
    Case #Papier
      ;
      ; PAPIER
      ;
      Select Adversaire
        Case 1 
          MessageRequester(" . . . . Choix . . . ."," ♥  Pierre  ♥")
          Mes_Points + 1
        Case 2 
          MessageRequester(" . . . . Choix . . . ."," ♥  Papier  ♥")
       Case 3 
          MessageRequester(" . . . . Choix . . . ."," ♥  Ciseaux  ♥")
          ses_points + 1
      EndSelect 
      ;
    Case #Ciseaux
      ;
      ; CISEAUX
      ;
      Select Adversaire
        Case 1 
          MessageRequester(" . . . . Choix . . . .","  ♥  Pierre  ♥")
          Ses_Points + 1
        Case 2 
          MessageRequester(" . . . . Choix . . . .","  ♥  Papier  ♥")
          Mes_Points + 1
       Case 3 
          MessageRequester(" . . . . Choix . . . .","  ♥ Ciseaux  ♥")
      EndSelect
  EndSelect
  
  If Mes_Points  = 3
    MessageRequester("Felicitations","Bravo, tu as gagné ! :D",#PB_MessageRequester_Warning) 
    End
  EndIf 
  If Ses_points = 3
    MessageRequester("Dommage","Oh, tu as perdu... :(",#PB_MessageRequester_Warning) 
    End 
  EndIf
  ;
  ; >>>
  ;
  SetGadgetText(#Score, Str(Mes_Points) + " / " + Str(ses_points))
  ;
  ; <<<
  ;
   
 EndProcedure
   
;================================================================================== 
   
Procedure Fenetre()
  If OpenWindow(#Fenetre, 0, 0, 250, 250, "Jeu Pierre Papier Ciseaux V1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
  TextGadget(#Texte,10,10,240, 30, "Salut ! Tu veux jouer avec moi ? :) On va en 3 points")
  TextGadget(#Score,50,60,240,30,  "0")

  ButtonGadget(#Pierre, 10,100,230 ,20, "Pierre" ) 
  ButtonGadget(#Papier, 10,130,230 ,20, "Papier" )
  ButtonGadget(#Ciseaux, 10,160,230 ,20,"Ciseaux")
  
  BindGadgetEvent(#Pierre,  @Partie()) 
  BindGadgetEvent(#Papier,  @Partie()) 
  BindGadgetEvent(#Ciseaux, @Partie()) 
EndIf   


EndProcedure

Fenetre()

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

Define.l Event

Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow  
End

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 20:07
par FR4NK13
Bonsoir,

Merci pour l'aide apportée :)

Pourrais-tu expliquer ce que tu as modifié et pourquoi ?

(effectivement j'avais un "global évent" et un "global point" en trop déjà, deux coquilles si je puis dire...)

Sinon est-il possible de centrer le titre et le contenu du messagerequester ?

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 20:12
par GallyHC
J'ai modifié la ligne "TextGadget(Ses_points,50,60,240,30, Str(Ses_points))" par "TextGadget(#Score,50,60,240,30, "0")" avec l'ajout dans l'enum de "#Score" pour ce gadget.
J'ai ajouté "SetGadgetText(#Score, Str(Mes_Points) + " / " + Str(ses_points))" dans la procedure "Partie()", pour l'affichage du score.

J'ai aussi un peu modifier l'enumeration, en ajoutant celle pour les window. Il faut faire attention à la porter des variable comme "Adversaire".

Voila en gros
Cordialement,
GallyHC

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 20:25
par FR4NK13
Voilà, j'ai modifié le système de score, merci beaucoup :)


pour le protected, je n'arrive pas à comprendre à quoi cela sert exactement ? Je veux dire, pourquoi placer la variable dans la procedure en protected plutôt que en haut vers l'énumeration ?

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 20:46
par GallyHC
La variable été en global, mais elle a qu'une porter limité dans le source. Elle n'affecte que la "procedure", il est est préférable de la déclarer avec une porte que dans la "procedure".
En déclarant en "Global" cette variable peut être affecter par tout le programme (main, procedure, ...).

Cordialement,
GallyHC

Re: Pierre Papier Ciseaux

Publié : mar. 10/juil./2018 20:50
par FR4NK13
Ah, je comprends mieux merci ! :)

J'ai analysé le reste de tes modifs et une fois comprises, je les ai appliquées. Voilà, mon code est tout propre lol

J'imagine que c'est la même chose pour le define de l'event,

Passe une bonne soirée.

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 7:50
par FR4NK13
Bonjour tout le monde,

J'ai étoffé un peu mon code :

- J'ai fait une fenêtre redimensionnable
- J'ai rajouté une option de plus au Pierre Papier Ciseaux : Puit

Il fonctionne bien, sauf qu'à présent il y a un petit bug au niveau du comptage des points (le système dépasse souvent les points limites pour gagner, mais pas toujours.)

Je rappelle que je débute en programmation et que je me fais un peu aider à droite à gauche, et que je ne comprends pas toujours tout ce que je fais. Je bidouille et code un peu salement de ce fait, alors n'hésitez pas à m'expliquer ce qui ne va pas :)

J'ai également un bug agaçant : lorsque je veux changer l'ordre des constantes, ça me fait un bug d'affichage (les gadget sont tous décalés à la limite du bord gauche, et ce, même si je change l'identifiant ou que je mets le nom des constantes comme j'ai finalement fait.)

Par contre je rencontre un soucis pour poster mon code ça me met une erreur ??



Erreur générale
SQL ERROR [ mysqli ]

Incorrect string value: '\xF0\x9F\x98\x80&q...' for column 'post_text' at row 1 [1366]

Une erreur SQL est arrivée en chargeant cette page. Contactez l’administrateur du forum si ce problème persiste.

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 9:35
par falsam
la réponse est là
Incorrect string value: '\xF0\x9F\x98\x80&q...' for column 'post_text' at row 1 [1366]
Dans ton code tu as voulu mettre des zolis emoticone UNICODE et la base de données n'est pas prévu pour ça.

Les smiley à l'ancienne passent, mais pas les émoticones ainsi que les emoji.

Une fois que tu te seras débarrassé de ces fioritures, tu pourras poster ton code. Utilise pour ça ton premier message à la place de ton ancien code.

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 9:42
par FR4NK13
Ah non c'est une erreur ces smileys unicodes xD

merci pour l'explication, je les ai enlevé mais ça ne passe toujours pas.

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 9:44
par falsam
FR4NK13 a écrit :merci pour l'explication, je les ai enlevé mais ça ne passe toujours pas.
C'est qu'il y en a d'autres.

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 10:08
par FR4NK13
Effectivement, voilà maintenant j'ai bien tout enlevé, ça devrait marcher :

Code : Tout sélectionner

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


EndEnumeration

Global.l Mes_points
Global.l Ses_points
Global Formwith = 800



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



Procedure Partie()
  
  
  ; PIERRE
  
 Protected.l Adversaire = Random(4,1)
 Protected.l Resultat
 Protected.l a$
 
  Select EventGadget()
      
    Case #Pierre
      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 
      
      
      ; PAPIER
      
    Case #Papier
      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 
      
      
      ; CISEAUX

    Case #Ciseaux
      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

    Case #Puit
      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
  
  If Mes_Points = 6
  Resultat = MessageRequester("Felicitations","Bravo, tu as gagné ! 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 
 
    
   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
EndSelect

  SetGadgetText(#Score, Str(Mes_Points) + " <==== TOI / IA ====> " + Str(Ses_points))

   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)

BindGadgetEvent(#Pierre, @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 16:17
par Ar-S
tu as oublié Mes_Points +1 pour le puit si #pierre
J'en suis à 7 - 5 et ça ne s'arrête pas :)
on est pas censé aller à 6 ?

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 16:20
par FR4NK13
Coucou Ar-S ! :)

Non ce n'est pas un oubli, je voulais équilibrer car sinon le puit gagne contre les ciseaux et la pierre et il serait plus avantageux que les autres à mon sens.

Si on est censé s'arrêter à 6 justement et ça continue, c'est le gros soucis de mon jeu xD
Tu sais pourquoi ?

Re: Pierre Papier Ciseaux

Publié : sam. 14/juil./2018 16:47
par poshu
Ton code qui vérifie le score est dans le case #puit. Il devrait être en dehors du select pour être exécuté à chaque fois.

Concernant l'équilibre de puits... Bah, en faisant ce changement, tu as toujours du déséquilibre :
  • ● Papier gagne 2 fois, perd 1 fois
  • ● Ciseaux gagne 1 fois, perd 2 fois
  • ● Puits et Pierre gagnent 1 fois, perdent 1 fois
Donc, pour gagner, il faut jouer papier en permanence, et pour perdre il faut jouer ciseaux.