Page 5 sur 5
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 13:29
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...
Désolé...
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 14:02
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 ?
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

Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 14:49
par boby
Ca marche mal ce code chez moi c'est normal ?

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 :
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
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 15:25
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 ?

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...
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
Merci à tous pour votre aide et votre patience... des fois, je m'exaspère moi même

Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 15:45
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.
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 16:41
par FR4NK13
Bon alors je me suis essayée mais j'ai la mauvaise impression d'avoir fait n'importe quoi...
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
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 17:10
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
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 17:57
par FR4NK13
Olalala..... j'ai l'impression que je ne vais jamais m'en sortir ><
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 18:04
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)
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 18:09
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 ?
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 18:33
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)
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
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 18:44
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.
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 21:24
par Ar-S
boby a écrit :
6 lignes ! vs 5 lignes !
Bouya ! ça c'est de l'optimisation ! héé ouais...
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..
Re: Pierre Papier Ciseaux
Publié : jeu. 02/août/2018 21:55
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...