Pierre Papier Ciseaux

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

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Tu chipotes, et tu chipotes à tord.
Boby à bien répondu.
Non je ne chipote pas du tout. Boby a peut-être bien répondu, mais j'ai mal compris ce qu'il a dit. Chipoter c'est jouer sur les mots, moi je ne jouais pas sur les mots mais j'ai confondu le contenu de la variable et le texte entré dans un textgadget en gros, même si c'est la même chose.

Cela dit je ne chipotais pas, j'ai juste mal compris.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Pierre Papier Ciseaux

Message par Micoute »

L'essentiel étant de bien assimiler les termes employés.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Bien entendu Micoute, j'apprends petit à petit la programmation et ses termes :)

falsam a écrit : PS : J'ai ajouté un Else vers la sortie de l'application au cas ou la fenêtre ne pourrait pas être créer :mrgreen:

Falsam, j'ai fait un essai pour tester sauf que moi ça ne marche pas, quand j'essaie de trafiquer le mot "openwindow" pour empêcher la fenêtre de s'ouvrir, malgré le else, j'ai une erreur dans le compilateur.

Code : Tout sélectionner

If OpenWindowtrafiqué(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")
    
   
  BindGadgetEvent(#Pierre, @Partie())
  BindGadgetEvent(#Papier, @Partie())
  BindGadgetEvent(#Ciseaux, @Partie())
Else 
  Debug "Erreur de chargement de la fenêtre"
  EndIf 
Allez riez, qu'est-ce que j'ai encore fait de travers :lol:
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Tu appel une fonction qui n'existe pas.
OpenWindowtrafiqué()
n'est ni une fonction purebasic ni une fonction que tu as créer dans ton code... En gros tu lui parle chinois.
Le "Else" n'est la que au cas où windows (ou autre OS) n'arrive pas à te fournire l'ouverture d'une fenettre.
En claire, y'a quazi aucune chance que ça arrive, mais AU CAS OU ca foire, au moins le programe sait quoi faire et ne plantera pas lamentablement te laissant un bon vieux message windows "machin.exe a cessé de foncionner".
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Le "Else" n'est la que au cas où windows (ou autre OS) n'arrive pas à te fournire l'ouverture d'une fenettre. En claire, y'a quazi aucune chance que ça arrive,
Merci Boby, c'est ce que je me disais en somme mais je voulais être sûre.
Donc il vaut mieux utiliser ce else plutôt pour les erreurs plus courantes comme le chargement d'images et sons par exemple.

Je suis en train de tester le message requesterYesNo mais là encore je ne suis pas sûre d'avoir tout compris puisque je n'arrive pas à le faire fonctionner avec un code plus alléger que celui de la doc a$ 7 et a$ 6 :roll:

Même en m'aidant de mon code de base (pas en recopiant bêtement parce que j'ai simplifié mon nouveau code là)
je n'arrive pas à l'adapter.

Ca donne ça :

Code : Tout sélectionner

Procedure points()
    
   Protected resultat = #PB_MessageRequester_YesNo

  If Mes_points = 1
    MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
    
  Else 
    If Ses_Points = 1
      MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)
          
    EndIf 
    
    If Resultat = #PB_MessageRequester_Yes   
      Ses_points = 0
      Mes_Points = 0
    Else               
      End
      
  EndIf 
EndIf 

 SetGadgetText(#Score, Str(Mes_Points) + " - " + Str(Ses_points))
  
EndProcedure
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: Pierre Papier Ciseaux

Message par Mindphazer »

Tu testes ta variable Resultat, mais tu lui as attribué la valeur d'une constante au début de ta procédure !!!!

Code : Tout sélectionner

Protected resultat = #PB_MessageRequester_YesNo
Il faut que tu attribues le résultat de ton appel a MessageRequester() à ta variable Resultat.
Comme ça :

Code : Tout sélectionner

Resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
et comme ça :

Code : Tout sélectionner

Resultat = MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)
Et tu vires

Code : Tout sélectionner

Protected resultat = #PB_MessageRequester_YesNo
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Merci comme ça ça marche effectivement mais je dois quand même la déclarer avant. Or dans l'ancienne version que j'ai il n'y avait pas besoin de déclarer résultat, c'est étrange.
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

En effet tu oublie de récupérer le résultat quelque part.
Bon, plutôt que une fois de plus simplement te donner la réponse, essayons de comprendre ce que te dit la doc :

Description
Opens a blocking requester to display some information. The program execution is totally stopped until the user close the requester.

"DESCRIPTION" = que va il se passer lors que tu fait appel à cette fonction.
Dans ce cas, ton programma va ouvrir une fenêtre qui affiche des informations ( "info" en titre et "tu as gagné! On rejoue?" en message dans ton cas)
mais surtout The program execution is totally stopped until the user close the requester.
Le programme sera BLOQUÉ jusqu'à ce que l'utilisateur ferme la fenêtre du requester (en cliquant sur ok, oui, non ou cancel). Ca veux dire que plus aucune ligne de code de ton programme ne seras lu par l'ordinateur tant que cette fenêtre seras ouverte.
Return value
C'est ce que va te répondre la fonction MessageRequester() lorsque qu'elle seras quittée donc lorsque l'utilisateur auras fait son choix entre "Oui" ou "Non".
Pour tenter de traduire ça encore plus simplement, ça veux dire que :
Si l'utilisateur clic sur Oui : MessageRequester() seras alors = à #PB_MessageRequester_Yes
Si l'utilisateur clic sur non : MessageRequester() seras alors = à #PB_MessageRequester_No

Au même titre que Variable = 2, tu peux donc stocker le résultat de MessageRequester() en faisant Variable = MessageRequester("bla bla","bli bli",#PB_MessageRequester_YesNo), la seul différence, c'est qu'ici c'est l'utilisateur qui définira la valeur de Variable en cliquant sur Oui ou sur Non.

Enfin, la fonction MessageRequester() te répondant une valeur à sa fermeture, il t'es tout à fait possible d'utiliser directement cette fonction comme évènement conditionnel :

Code : Tout sélectionner

If MessageRequester("bla bla","bli bli",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
  Debug "Il a cliqué sur OUI !!!!!"
Else
  Debug "Ah bah la il a dit non..."
EndIf
(Et la on ne peut pas faire plus court exemple d'utilisation du requester avec 2 choix)
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Boby,

actuellement j'en suis là :

Code : Tout sélectionner

Procedure points()
    
    Protected resultat 
    
  If Mes_points = 1
  resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
    
  Else 
    If Ses_Points = 1
     resultat = MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)
          
    EndIf 
    
    If Resultat = #PB_MessageRequester_Yes   
      Ses_points = 0
      Mes_Points = 0
    Else               
      End
      
  EndIf 
EndIf 

 SetGadgetText(#Score, Str(Mes_Points) + " - " + Str(Ses_points))
  
EndProcedure
Et en fait ça bug la fenêtre se ferme après la fin de la partie quand je clique sur un choix et le score ne se remets pas souvent à 0. J'ai testé la valeur du Yes ça donne 6. (Je crois la même valeur que dans la doc.) En passant, je ne sais plus si mon setgadget est bien placé là où s'il doit être dans le IF ? Je dirais qu'il est bien placé puisque il est exterieur à la condition sur les points.

Je vais essayer de réfléchir avec ce que tu m'as dit :)
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Ton erreur est visible à des Km à la ronde, je vais essayer de te traduire ton code, tu vas essayer de trouver ton erreur.

Code : Tout sélectionner

Si : Le joueur gagne :
   Mettre ses points à 1.
   Demander au joueur s'il veux sa revenche.
Sinon (Ce qui implique que l'IA gagne, donc que le joueur ne gagne PAS) :
   Mettre les points de l'IA à 1.
   Demander au joueur s'il veux sa revenche.
   Si il veux sa revenche : 
      Mettre ses points = 0
      Mettre les points de l'IA à 0
   S'il ne veux pas se revenche :
      Fermer le programme
   Fin de la condition "veux il sa revenche"
Fin de la condition Le joueur a il gagné ?

Changer le texte du gadget #score.
Petits conseils :
-Fait bien attention à l'indentation.
-Essaie de bien lire et de comprendre dans quel cas tes condition sont OBSERVÉES par le programme.

Commence par essayer de régler ce problème avant d'aller plus loin.
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Merci beaucoup Boby pour ta "traduction" qui m'aide à comprendre un peu mieux le problème :D

Code : Tout sélectionner

Si : Le joueur gagne :
   Mettre ses points à 1.
   Demander au joueur s'il veux sa revenche.
Sinon (Ce qui implique que l'IA gagne, donc que le joueur ne gagne PAS) :
   Mettre les points de l'IA à 1.
J'imagine du coup que le soucis vient de là ! :lol:

La condition est à l'envers ; je ne veux pas que les points soient à un s'il y a un gagnant (mais comment le programme défini le gagnant du coup ??) mais qu'à un point il y a un gagnant.

Pour moi mon IF est correct ; si 1 points, il y a un gagnant. (IF points = 1 : gagné!)

Du coup pourquoi ma condition est biaisée ? :|
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Voilà j'ai trouvé une solution qui fonctionne mais qui ne me convient pas car trop brouillon :

Code : Tout sélectionner

Procedure points()
Protected resultat 

  If Mes_points = 1
  resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
     Ses_points = 0
      Mes_Points = 0
  Else 
    If Ses_Points = 1
     resultat = MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)
      Ses_points = 0
      Mes_Points = 0
     If Resultat = #PB_MessageRequester_Yes   
     
    Else               
      End  
    EndIf 
    
    
      
  EndIf 
EndIf 

 SetGadgetText(#Score, Str(Mes_Points) + " - " + Str(Ses_points))
  
EndProcedure
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Mon, "explication" répondait à cette question :
Et en fait ça bug la fenêtre se ferme après la fin de la partie quand je clique sur un choix et le score ne se remets pas souvent à 0
Du coup pourquoi ma condition est biaisée ?
reprend ton premier code et regarde bien OU se trouve ta condition :

Code : Tout sélectionner

    If Resultat = #PB_MessageRequester_Yes   
      Ses_points = 0
      Mes_Points = 0
    Else 
Allé un petit coup de main. Fait moi le plaisir de bien lire ma procédure et d'essayer de la traduire pour être sur d'en comprendre le procédé.

Code : Tout sélectionner

Procedure points()
  Protected resultat
  
  If Mes_points = 1
    resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
  Else
    resultat = MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)
  EndIf
  If resultat = #PB_MessageRequester_Yes
    Ses_points = 0
    Mes_points = 0
  Else
    End
  EndIf
  SetGadgetText(#Score, Str(Mes_Points) + " - " + Str(Ses_points))  
EndProcedure
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pierre Papier Ciseaux

Message par Ar-S »

--- un peu grillé par boby mais bon.. ----

Ensuite, essaye de voir comment éviter les doublons.
Dans les 2 cas tu as un messagerequester et dans les 2 cas tu as
Ses_points = 0
Mes_Points = 0
Tu peux surement condenser tout ça.

Je n'aurai mis qu'un messagerequester en ajoutant une variable Message$

Code : Tout sélectionner

Procedure points()
  Protected resultat
  If Mes_points = 1
    Message$ ="tu as gagné!"
  Else
    Message$ ="Tu as perdu! On rejoue ?"
  EndIf
resultat = MessageRequester("info",Message$,#PB_MessageRequester_YesNo)
  If resultat = #PB_MessageRequester_Yes
    Ses_points = 0
    Mes_points = 0
  Else
    End
  EndIf
  SetGadgetText(#Score, Str(Mes_Points) + " - " + Str(Ses_points))  
EndProcedure
~~~~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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Pierre Papier Ciseaux

Message par microdevweb »

Pour avoir plus facile tu peux faire comme ceci, sur une feuille de papier tu écrit le raisonnement de ton jeux (clique sur l'image pour agrandir)

Image

après tu implémente selon le langage (dans ton cas Pb) la structure du programme.
avec des commentaire des taches à faire avec tes propres mots

Editer (j'ai modifié playerWin

Code : Tout sélectionner

Enumeration 1
  #PIERRE
  #PAPIER
  #CISEAUX
EndEnumeration
Enumeration 
  #GAGNER
  #PERDU
  #EGALITE
EndEnumeration
Global playerWin.l ; un entier qui peut'être voir enum #GAGNER,#PERDU,#EGALITE
Global.l playerChoise,IaChoise 
EnableExplicit  ; les variables doivent être définies

; liste des procédures
Declare JouerPartie()    ; jouer la pertie
Declare TesteQuiGagne()  ; tester si le joueur gangne
Declare  Gagner()        ; dire au joueur qu'il à gagner
Declare Perdu()          ; dire au joueur qu'il a perdu
Declare Rejouer()        ; demander au joueur si il veut rejouer


Procedure JouerPartie()
  ; par defaut le joueur ne gagne pas
  playerWin = #False
  ; par defaut aucun choix
  playerChoise = 0
  IaChoise = 0
  ; 1  attendre que l'utilisateur selectectionne
  ;     -> Pierre
  ;     -> Papier
  ;     -> Ciseaux
  ; 2  Faire choisir à l'ordinateur aléatoirement
  ;     -> Pierre
  ;     -> Papier
  ;     -> Ciseaux
  
  ; 3  Tester si le 
  
EndProcedure

Procedure TesteQuiGagne()
  ; si playerChoise = #PIERRE
  ;   si IaChoise = #PAPIER
  ;       le joueur perd
  ;   sinon si IaChoise = #PIERRE
  ;        égalité
  ;   sinon 
  ;       le joueur gagne
  ;
  
  ; si playerChoise = #PAPIER
  ;   si IaChoise = #CISEAUX
  ;       le joueur perd
  ;   sinon si IaChoise = #PAPIER
  ;        égalité
  ;   sinon 
  ;       le joueur gagne
  ;
  
  ; si playerChoise = #CISEAUX
  ;   si IaChoise = #PIERRE
  ;       le joueur perd
  ;   sinon si IaChoise = #CISEAUX
  ;        égalité
  ;   sinon 
  ;       le joueur gagne
  ;
  
EndProcedure

Procedure Gagner()
  ; 1  Afficher le message gagner
  ; 2 appeller Rejouer()
EndProcedure

Procedure Perdu()
  ; 1  Afficher le message perdu
  ; 2 appeller Rejouer()
EndProcedure

Procedure Rejouer()
  ; demander si le jouer veux rejouer
  ; si oui
  ;   appeller JouerPartie()
  ; sinon
  ;   quitter le programme
EndProcedure
Ensuite tu code en langage Purebasic, évidement tu devra surement ajouter des sous procédure (exemple computerPlay())

Note : rien ne t’empêche de faire un petit graphique pour certaine procédure compliquée, cela peut'aider à mieux saisir la logique
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre