PureBasic

Forums PureBasic
Nous sommes le Lun 16/Déc/2019 6:51

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 74 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante
Auteur Message
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Mer 01/Aoû/2018 21:38 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
Citation:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 7:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2213
Localisation: 50200 Coutances
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 GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 7:44 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
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:
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:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:10 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Tu appel une fonction qui n'existe pas.
Citation:
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".


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:18 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
Citation:
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:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 24/Aoû/2005 10:42
Messages: 470
Tu testes ta variable Resultat, mais tu lui as attribué la valeur d'une constante au début de ta procédure !!!!
Code:
Protected resultat = #PB_MessageRequester_YesNo

Il faut que tu attribues le résultat de ton appel a MessageRequester() à ta variable Resultat.
Comme ça :
Code:
Resultat = MessageRequester("info","tu as gagné! On rejoue?",#PB_MessageRequester_YesNo)

et comme ça :
Code:
Resultat = MessageRequester("info","Tu as perdu! On rejoue ?",#PB_MessageRequester_YesNo)

Et tu vires
Code:
Protected resultat = #PB_MessageRequester_YesNo

_________________
Bureau : Win10 64bits
Maison : Macbook Pro 13" Retina / SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone X 256 Go


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:41 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:42 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
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.

Citation:
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:
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)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 8:47 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
Boby,

actuellement j'en suis là :

Code:
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 9:25 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Ton erreur est visible à des Km à la ronde, je vais essayer de te traduire ton code, tu vas essayer de trouver ton erreur.

Code:
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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 11:53 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
Merci beaucoup Boby pour ta "traduction" qui m'aide à comprendre un peu mieux le problème :D

Code:
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 ? :|


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 12:12 
Hors ligne

Inscription: Mar 03/Juil/2018 9:30
Messages: 72
Voilà j'ai trouvé une solution qui fonctionne mais qui ne me convient pas car trop brouillon :

Code:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 12:58 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Mon, "explication" répondait à cette question :
Citation:
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


Citation:
Du coup pourquoi ma condition est biaisée ?


reprend ton premier code et regarde bien OU se trouve ta condition :
Code:
    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:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 13:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8785
--- 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:
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 :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Pierre Papier Ciseaux
MessagePosté: Jeu 02/Aoû/2018 13:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1662
Localisation: Belgique
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:
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.71 beta 2


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 74 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye