Pierre Papier Ciseaux

Programmation avancée de jeux en PureBasic
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Pierre Papier Ciseaux

Message 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  
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Pierre Papier Ciseaux

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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 ?
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Pierre Papier Ciseaux

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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 ?
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Pierre Papier Ciseaux

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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.
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pierre Papier Ciseaux

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Pierre Papier Ciseaux

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pierre Papier Ciseaux

Message 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 ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message 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 ?
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Re: Pierre Papier Ciseaux

Message 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.
Répondre