Pierre Papier Ciseaux

Programmation avancée de jeux en PureBasic
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

@Ar-S

Code : Tout sélectionner

  If Mes_points = 1
    Message$ ="tu as gagné!"
  Else
    Message$ ="Tu as perdu! On rejoue ?"
  EndIf
resultat = MessageRequester("info",Message$,#PB_MessageRequester_YesNo)
6 lignes !

Code : Tout sélectionner

  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
5 lignes !
Bouya ! ça c'est de l'optimisation ! héé ouais... :lol:



Désolé...
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »


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
Ca marche mal ce code chez moi c'est normal ? :lol:


Ar-S :
nsuite, 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 suis bien d'accord et c'est pour ça que je n'aimais pas ma façon de faire ici car cela fait trop brouillon, mais c'est la seule que j'arrive à faire marcher --'

En plus je n'arrive pas à comprendre pourquoi vous avez retiré le quota de point pour gagner de l'adversaire, du coup maintenant on sait plus son quota pour gagner :| :lol:
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Ca marche mal ce code chez moi c'est normal ? :lol:
C'est à dire ?
En plus je n'arrive pas à comprendre pourquoi vous avez retiré le quota de point pour gagner de l'adversaire, du coup maintenant on sait plus son quota pour gagner
Si on observe bien ton code :

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
On voie que :
Ton "If Resultat = #PB_MessageRequester_Yes " n'est interprété QUE si l'IA gagne, car il est dans le "Else" du "If Mes_points = 1".
Ce qui veux dire que si le joueur gagne, tu lui pose bien la question "veux tu rejouer" mais tu ne fais rien de sa réponse.

Tu as un "If" inutile :

Code : Tout sélectionner

  Else
    If Ses_Points = 1

Le "Else" étant la condition inverse du "If auquel il appartient (dans ce cas "If Mes_points = 1").
Ce "Else" veux donc dire Si Mes_points n'est pas égale à 1, donc dans la logique des choses, si je n'ai pas gagné, c'est que j'ai perdu (hors match null, cas que je n'ai effectivement pas prévu), si j'ai perdu, c'est donc que mon adversaire a gagné.
Plus simplement dit :
Si je gagne
Action gagne du joueur
Sinon
Action gagne de l'IA
fin si

Maintenant, si tu as besoin de regarder l'état de tes 2 variable "Mes_points" et "Ses_points", c'est ton Else qui est de trop, le code devrais donc donner quelque chose du genre :

Code : Tout sélectionner

Procedure points()
  Protected resultat
  If Mes_points ; ne pas donner de valeur signifi "Si c'est différent de 0"
    resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
  EndIf
  If Ses_points 
    resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)
  EndIf
  If resultat = #PB_MessageRequester_Yes
    Ses_points = 0
    Mes_Points = 0
  Else
    End
  EndIf
EndProcedure
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Merci pour l'explication Boby !

J'ai l'impression de viser encore trop haut avec ce messagerequster Yes/No.
Etant donné que mon pierre papier ciseaux est maintenant à peu près dans mes compétences dans sa version la plus simple,

Est-ce que quelqu'un a un exercice plus simple à me proposer qui m'aiderait à piger la logique sans me (enfin nous) décourager ? :lol: Parce que moi je suis du genre tenace et à m'accrocher, mais je crains que tout le monde ici ne craque et n'abandonne avant moi et seule je n'irais pas très loin... :lol:

En espérant que vous ne me répondrai pas qu'il n'y a pas plus simple que ce que je veux faire avec le requester Y/N :roll:

Merci à tous pour votre aide et votre patience... des fois, je m'exaspère moi même :(
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Code : Tout sélectionner

Enumeration 
  #button_jouer
  #text_scorejouer
  #text_scoreordinateur
  #text_gagnant
EndEnumeration
If OpenWindow(0,0,0,500,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ButtonGadget(#button_jouer,230,270,40,20,"Jouer")
  TextGadget(#PB_Any,10,30,100,20,"Score du joueur")
  TextGadget(#PB_Any,390,30,100,20,"Score de l'ordinateur)
  TextGadget(#text_scorejouer,10,60,100,20,"")
  TextGadget(#text_scoreordinateur,390,30,100,20,"")
  TextGadget(#PB_Any,200,100,100,20,"Le gagnant est :")
  TextGadget(#text_gagnant,200,130,100,20,"")
  
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Je te propose :
En partant de ce que je t'ai fournit, je veux :
quand tu clic sur le bouton, tu fait un random de 1 à 20. Si c'est <= à 10, le joueur gagne > 10 l'ordinateur gagne.
après avoir cliqué sur le bouton et défini le gagnant, tu m'affiche le score du joueur dans le textgadget prévu, idem pour le score de l'ordinateur.
si le joueur a un score supérieur à l'odinateur, le textgagnant contiendra "Joueur", si c'est l'inverse il contiendra "ordinateur" si il y a égalité "égalité".

Ça peut paraitre simple, mais si tu réussi ça, tu devrais réussir avec ton messagerequester.
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Bon alors je me suis essayée mais j'ai la mauvaise impression d'avoir fait n'importe quoi... :roll:
Et je me suis un peu emmêlée les pinceaux.
Ca marche presque, je n'arrive juste pas à ajouter les scores dans les textgadget.

Code : Tout sélectionner

EnableExplicit ; je force la déclaration de variable pour éviter toute erreur.

Enumeration
  #button_jouer
  #text_scorejouer
  #text_scoreordinateur
  #text_gagnant
EndEnumeration

Global.b score_joueur, score_ordinateur, jets ; je définis mes variables que je viens de créer pour le besoin de l'exercice.

Declare jets() ; je déclare la procédure que j'ai créée bien que la placer avant la fenêtre suffirait.

If OpenWindow(0,0,0,500,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ButtonGadget(#button_jouer,230,270,40,20,"Jouer")
  TextGadget(#PB_Any,10,30,100,20,"Score du joueur")
  TextGadget(#PB_Any,390,30,100,20,"Score de l'ordinateur")
   TextGadget(#PB_Any,200,100,100,20,"Le gagnant est :")
  TextGadget(#text_gagnant,200,130,100,20,"")
  
  TextGadget(#text_scorejouer,10,60,100,50,""+score_joueur+"") ; je veux afficher le score sauf qu'evidemment ça ne marche pas
  TextGadget(#text_scoreordinateur,390,30,100,80,""+score_ordinateur+"") ; idem (PS ; j'ai pas placé le score à l'endroit approprié mais il aurait fallu) 
  
 

  BindGadgetEvent(#button_jouer, @jets()) ; je fais un bind pour relier le bouton à la procédure afin de pouvoir effectuer les jets.
 
EndIf


Procedure jets() ; je créé une procédure pour le lancé de dés et le score.
  
  jets = Random(20,1) ; je récupère le contenu du random dans une variable "jets" 
   
  If jets <= 10 ; je fais une condition pour définir le gagnant
    MessageRequester("info","chiffre "+jets+" : Joueur gagne ce jets")
     score_joueur +1 ; là, je veux attribuer un point au gagnant, mais je comprends pas pourquoi le point ne s'ajoute pas dans la variable, et ce n'est pas la première fois que je rencontre ce soucis --"
  ElseIf jets =>10
    MessageRequester("info","chiffre "+jets+" : ordi gagne ce jets")
    score_ordinateur +1 ; idem.
  Else  
    jets = 10 
    MessageRequester("info","chiffre "+jets+" : egalité sur ce jet")
    
  EndIf 
  
  
  
EndProcedure 


Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Code : Tout sélectionner

EnableExplicit ; je force la déclaration de variable pour éviter toute erreur.

Enumeration
  #button_jouer
  #text_scorejouer
  #text_scoreordinateur
  #text_gagnant
  #text_resulta
EndEnumeration

Global.b score_joueur, score_ordinateur, jets ; je définis mes variables que je viens de créer pour le besoin de l'exercice.

Declare jets() ; je déclare la procédure que j'ai créée bien que la placer avant la fenêtre suffirait.

If OpenWindow(0,0,0,500,300,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ButtonGadget(#button_jouer,230,270,40,20,"Jouer")
  TextGadget(#PB_Any,10,30,100,20,"Score du joueur")
  TextGadget(#PB_Any,390,30,100,20,"Score de l'ordinateur")
  TextGadget(#PB_Any,200,100,100,20,"Le gagnant est :")
  TextGadget(#text_gagnant,200,130,100,20,"")
  TextGadget(#PB_Any,200,50,100,20,"Résultat")
  TextGadget(#text_resulta,200,80,100,20,"")
  TextGadget(#text_scorejouer,10,60,100,50,"") ; je veux afficher le score sauf qu'evidemment ça ne marche pas
  TextGadget(#text_scoreordinateur,390,30,100,80,"") ; idem (PS ; j'ai pas placé le score à l'endroit approprié mais il aurait fallu)
 
  BindGadgetEvent(#button_jouer, @jets()) ; je fais un bind pour relier le bouton à la procédure afin de pouvoir effectuer les jets.

EndIf


Procedure jets() ; je créé une procédure pour le lancé de dés et le score.
 
  jets = Random(20,1) ; je récupère le contenu du random dans une variable "jets"
   
  SetGadgetText(#text_resulta,Str(jets)) ;>>>>>>>>>>>>>>> Je mets à jours le contenu de gadgettext <<<<<<<<<<<
 
 
 
EndProcedure

;La boucle commence ICI !!! Tout ce qui se trouve avant ne sera lu et exécuter par l'ordinateur qu'une seul fois, (en dehors de ton callback défini par ton bindgadgetevent !!!
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
....Je t'aide probablement trop, a voir si lors d'un prochain exercice tu seras capable de t'en sortir par toi même
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Olalala..... j'ai l'impression que je ne vais jamais m'en sortir ><
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

dans ta fonction jets(), remplace, dans la ligne "SetGadgetText(#text_resulta,Str(jets))", #text_resulta par :
#button_jouer
#text_scorejouer
#text_scoreordinateur
#text_gagnant
(Un seul à la fois évidament), compile, click sur le bouton et observe le résultat.
(Ta condition pour regardé qui du joueur ou de l'ordinateur était bien, je l'ai supprimé car j'ai simplement vidé ta procédure pour ne plus avoir de messagerequester)
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Pierre Papier Ciseaux

Message par FR4NK13 »

Je note que yavait du bon alors dans mon complément.

En fait je crois que je vais devoir tout reprendre à zéro, mais par où commencer ?
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Pierre Papier Ciseaux

Message par microdevweb »

FR4NK13 a écrit : En fait je crois que je vais devoir tout reprendre à zéro, mais par où commencer ?
J'ai posté dans le fil de discutions un manière de travailler. Ce n'est pas la plus amusante mais c'est une technique qui va te permettre d'avancer pas à pas.

Je replace ici.

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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

En fait je crois que je vais devoir tout reprendre à zéro, mais par où commencer ?
As tu fais les changements indiqué dans mon précédent poste ?

Si oui, qu'est-ce qui te pause encore problème ?

Peut être prendre une pause et y revenir à tête reposer peut également aider.
Avatar de l’utilisateur
Ar-S
Messages : 9476
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pierre Papier Ciseaux

Message par Ar-S »

boby a écrit : 6 lignes ! vs 5 lignes !
Bouya ! ça c'est de l'optimisation ! héé ouais... :lol:
Tu parles sérieusement en nombre de lignes ? à ce moment tu ajoutes aussi des ":" entre chaque commandes comme ça tu n'as qu'une ligne hein ;)
Je parle d'optimiser dans le sens ou tu as un seul appel de messagerequester() dans le code..
~~~~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
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Pierre Papier Ciseaux

Message par boby »

Tu parles sérieusement en nombre de lignes ?
Non c'était simplement une blague...
Je parle d'optimiser dans le sens ou tu as un seul appel de messagerequester() dans le code..
dans les 2 cas il n'y a qu'un seul appel... il n'y a donc aucune question d'opti...
Répondre