Premier projet (CatBot)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Premier projet (CatBot)

Message par FR4NK13 »

Bonjour tout le monde :)
Je débute tout juste en Purebasic (j'ai déjà un peu touché à la programmation donc je connais à peu près tout ce qui est variable, conditions, etc) mais je ne suis malheureusement pas très douée pour apprendre seule...

Je voulais donc savoir si parmi vous, il y aurait des gens intéressés pour suivre mon projet et m'aider en m'expliquant comment réaliser le code de mon programme en fonction de mes attentes.

J'aimerais réaliser un petit animal virtuel (type tamagoshi pour ceux qui ont connus) mais bien plus élaboré pour faire un bot réaliste au maximum.

J'ai déjà fait une base, très sommaire pour l'instant, qui n'attend qu'une (ou plusieurs) bonne(s) âme(s) charitable pour m'aider à continuer son évolution :)

Voici déjà un bug rencontré :

- Il y a un petit système de temporisation dont le but est d’afficher un message au bout de cinq secondes (idéalement, la durée doit par la suite pouvoir être variable et aléatoire afin de générer des événements aléatoires, comme par exemple l’animal qui va miauler, faire une bêtise, etc)

le message s’affiche bien au bout de cinq secondes, mais revient régulièrement ensuite et de manière assez anarchique selon moi… (c’est l’ami qui m’a fait découvrir purebasic qui me l’a fait, car je voulais pouvoir utiliser une fonction delay() à la base, mais qui ne bloque pas le programme et on ne trouvait pas, alors j’ai cherché à faire un système d’heure afin de m’en servir pour mes événements)

J’espère que mon projet n’est pas trop ambitieux, surtout vu mon niveau super débutant... :lol: :oops:


Voici déjà mon code tel qu’il est pour l’instant, qui a certainement besoin d'être mis au propre :

Code : Tout sélectionner


Enumeration
#Fenetre
#Bouton_Quitter
#Bouton_Nourrir
#Bouton_Caresser
#Bouton_Frapper
#Bouton_Appeler
#texte_accueil
#Heure
#HeureDemarrage
#Meteo
#Meteo2
#Fichier
#RanResult
#ID_Nouveau
#TestTexte
EndEnumeration

Global X.i=10
Global Y.i=5
Global BienEtre.i = 1
Global Joie.i = 1
Global Colere.i = 1
Global Nourriture.i = 1 
Global TotalBouffe.i 
Global Texte.s = "Bonjour l'ami, voici... un gentil chaton"
Global TempsMeteo.s
Global Des.i
Global ResultTemps.i
Global HeureDemarrage.i
Global glEvent.i,glGadget.i,glType.i,RanResult.s,RanResultI.i

Procedure.s DateToString(MODE_DATE=0)
  Select MODE_DATE
    Case 1 ; date
      ladate.s = Str(Day(Date()))+"/"+Str(Month(Date()))+"/"+Str(Year(Date()))
    Case 2 ; heure
      ladate.s = Str(Hour(Date()))+":"+Str(Minute(Date()))+":"+Str(Second(Date()))
    Default ; date + heure
      ladate.s = Str(Day(Date()))+"/"+Str(Month(Date()))+"/"+Str(Year(Date()))+" - "+Str(Hour(Date()))+":"+Str(Minute(Date()))+":"+Str(Second(Date()))
  EndSelect
  ProcedureReturn ladate.s
EndProcedure

Procedure AfficheHeure()
SetGadgetText(#Heure,    DateToString() )
EndProcedure

Procedure Fenetre() 
  
    RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  

  If RanresultI = 1 
 Global Temps.s 
     EndIf
  If RanresultI = 2
  Global Temps2.s 
  EndIf 
  
  HeureDemarrage = (Second(Date()))
  
  If OpenWindow(#Fenetre, 0, 0, 500, 500, "CHATON", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ;StringGadget (#Heure, 5, 1, 150, 30, "",#ES_CENTER|#PB_String_ReadOnly)
  TextGadget(#Heure, 10,300,200,20,DateToString() )
  AddWindowTimer(#Fenetre,10,1000)
  BindEvent(#PB_Event_Timer,@AfficheHeure(),0)
   
  TextGadget(#Texte_accueil,10,5,100, 100,Texte)
  
  ResultTemps = Random(2,1)
  
  If ResultTemps = 1 : TempsMeteo = "Il fait un beau soleil" : EndIf
  If ResultTemps = 2 : TempsMeteo = "Il fait gris, il va pleuvoir" : EndIf
  
  TextGadget(#Meteo,10,260,200, 20,TempsMeteo)
    
  ButtonGadget(#Bouton_Quitter, 10, 60, 200, 20, "Fermer")   
  ButtonGadget(#Bouton_Nourrir, 10, 90, 200, 20, "Nourrir")  
  ButtonGadget(#Bouton_Caresser, 10, 120, 200, 20, "Caresser")  
  ButtonGadget(#Bouton_Frapper, 10, 150, 200, 20, "Frapper")
  ButtonGadget(#Bouton_Appeler, 10, 180, 200, 20, "Appeler")  
  ButtonGadget(#ID_Nouveau, 10,210,200 ,20,"Jeu")      
    
  ;TextGadget(#RanResult, 10,240,200,20,""+RanResult)   
   MessageRequester("Info","La gamelle est vide",64) 
        If (Hour(Date())) = 19 Or (Hour(Date())) = 12 Or (Hour(Date())) = 9
          MessageRequester("Info","Il est l'heure de nourrire le chaton !!!",64)
       Else 
        If (Hour(Date())) = 10 Or (Hour(Date())) = 14 Or (Hour(Date())) = 16 Or (Hour(Date())) = 20
          MessageRequester("Info","Le chaton dort...",64)
        EndIf
        EndIf 
      EndIf 
     
EndProcedure ;

Procedure Nourrir()
  
  TotalBouffe = TotalBouffe + Nourriture  
  
  If TotalBouffe => 4
    MessageRequester("Info","La gamelle déborde... inutile d'en mettre tant !",64)  
    TotalBouffe = 3
   Else      
     MessageRequester("Info","Vous avez mis "+TotalBouffe+" ration(s) de croquettes !",64) 
     
   EndIf  
   
 EndProcedure
 
 Procedure Caresser()
   Joie = Joie + BienEtre
   MessageRequester("Info"," "+Joie+"",64)
   RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
  
  If RanresultI = 1 
MessageRequester("Info","Le chaton Ronronne",64)
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Le chaton ferme les yeux",64)  
       
  EndIf
  
  ;If colere > 0 : Joie - colere : EndIf
      If Joie = 5
  Joie = #True 
EndIf
If Joie = #True
  MessageRequester("Info"," le chanton est heureux ;)",64)
  EndIf 
 EndProcedure
 
 Procedure Frapper()
    RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
   
  If RanresultI = 1 
    MessageRequester("Info","Le chaton part en courant",64)
    Colere = 1
  EndIf
  
  If RanresultI = 2
    MessageRequester("Info","Le chaton feule",64)  
    Colere = 2
   EndIf
   
   EndProcedure
   
 Procedure Appeler()
     RanResult = ""  
  RanResultI = Random(3,1)  
  RanResult = Str(RanResultI)  
  If RanresultI = 1 
    MessageRequester("Info","Le chaton ne vous calcule pas",64)  
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Le chaton vient en courant",64)  
  EndIf
    If RanresultI = 3
     MessageRequester("Info","Le chaton dresse l'oreille",64)  
EndIf
 EndProcedure
 
 Procedure OpenRAN()
  If ReadFile(#Fichier,"carctere.ran")          
       RanResult  =  "Nombre : "+ReadString(#Fichier)   
       SetGadgetText(#RanResult,RanResult)       
     CloseFile(#Fichier)        
   EndIf
 EndProcedure
 
Procedure SaveRAN()       
  If CreateFile(#Fichier,"caractere.ran", 0)               
    WriteStringN(#Fichier,RanResult)        
   CloseFile(#Fichier)      
 EndIf  
EndProcedure

Procedure Jeu()                      
     RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
  SaveRAN()  
  If RanresultI = 1 
    MessageRequester("Info","Vous lancez une balle. Le chat ne calcule pas la balle",64)  
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Vous lancez une balle. Le chat poursuit la balle",64)  
 
  EndIf 
EndProcedure                                                                                                                           
  
;-Procedure au démarrage
Fenetre() 
   
;-Boucle du Programme


Repeat
  
If Second(Date()) - HeureDemarrage = 5

  MessageRequester("Ha Ha","Le chat vient vers vous")
  HeureDemarrage = 0
  EndIf
  
       Event = WaitWindowEvent()
       glGadget= EventGadget()
       glType = EventType() 
     
        If glEvent = #PB_Event_Gadget      
    
 Select glGadget   
  Case #PB_Event_Gadget      
  Case #ID_Nouveau :  Jeu()          
 EndSelect          
 
 EndIf
 
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget() 
             
             Case #Bouton_Nourrir
             Nourrir() 
             
           Case #Bouton_Quitter 
             CloseWindow(#Fenetre)
             End
             
           Case #Bouton_Caresser
             Caresser()
             
           Case #Bouton_Frapper
             Frapper()
             
           Case #Bouton_Appeler
             Appeler()
             
           Case #ID_Nouveau :  
             Jeu() 
             

         EndSelect
            
     EndSelect
     
        Until Event = #PB_Event_CloseWindow
        
        End

Merci d'avance à ceux qui liront mon message et bonne journée :)
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Premier projet (CatBot)

Message par Ar-S »

Salut à toi
Projet que j'ai toujours voulu faire mais manque cruellement de temps pour reprendre ton code.

Il te faut utiliser des timers pour des messages à intervalle réguliers

ex :

Code : Tout sélectionner


Global NewList Message.s()
Global.b BOT

Bot = 0

; liste de messages
AddElement (Message())
Message() = "Bonjour"
AddElement (Message())
Message() = "Pb c'est top"
AddElement (Message())
Message() = "yeahhhh"
AddElement (Message())
Message() = "J'aime l'été"


If OpenWindow(0, 0, 0, 400, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(1, 10, 10, 200, 20, "lance les messages du bot")
    ButtonGadget(2, 10, 30, 200, 20, "stop les messages du bot")
    StringGadget(10,10,55,400,25,"",#PB_String3D_ReadOnly)
    
    ; Ajout du minuteur 3 toutes les 5 secs
    AddWindowTimer(0, 3, 5000)

    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_Timer And EventTimer() = 3
        
        ;variable bot qui dit si oui ou non le bot affiche
        If BOT = 1
          SelectElement (message(), Random(3))
          SetGadgetText(10, message())
        EndIf
        
      ElseIf Event = #PB_Event_Gadget
        
        Select EventGadget()
            
          Case 1
            BOT = #True
            
          Case 2
            BOT = #False           
        
          EndSelect
          
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
  EndIf

~~~~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: Premier projet (CatBot)

Message par FR4NK13 »

Bonjour Ar-S,

Je te remercie pour ta réponse qui a résolu mon bug :)
voici comment j'ai inclus ton code dans le mien (j'ai fait un petit ajustement au passage)
Ce n'est pas terminé je dois le replacer le texte et retirer le champ de saisi, mais je m'en occuperai plus tard ce n'est rien de bien compliqué.

J'aimerais savoir s'il est possible maintenant que ces messages s'affichent à intervalle non régulier (par exemple un à 15h, puis un à 17h12, un à 17h30, un à 19h.... etc

Code : Tout sélectionner



Enumeration
#Fenetre
#Bouton_Quitter
#Bouton_Nourrir
#Bouton_Caresser
#Bouton_Frapper
#Bouton_Appeler
#texte_accueil
#Heure
#HeureDemarrage
#Meteo
#Meteo2
#Fichier
#RanResult
#ID_Nouveau
#TestTexte
EndEnumeration

Global X.i=10
Global Y.i=5
Global BienEtre.i = 1
Global Joie.i = 1
Global Colere.i = 1
Global Nourriture.i = 1 
Global TotalBouffe.i 
Global Texte.s = "Bonjour l'ami, voici... un gentil chaton"
Global TempsMeteo.s
Global Des.i
Global ResultTemps.i
Global HeureDemarrage.i
Global glEvent.i,glGadget.i,glType.i,RanResult.s,RanResultI.i

Procedure.s DateToString(MODE_DATE=0)
  Select MODE_DATE
    Case 1 ; date
      ladate.s = Str(Day(Date()))+"/"+Str(Month(Date()))+"/"+Str(Year(Date()))
    Case 2 ; heure
      ladate.s = Str(Hour(Date()))+":"+Str(Minute(Date()))+":"+Str(Second(Date()))
    Default ; date + heure
      ladate.s = Str(Day(Date()))+"/"+Str(Month(Date()))+"/"+Str(Year(Date()))+" - "+Str(Hour(Date()))+":"+Str(Minute(Date()))+":"+Str(Second(Date()))
  EndSelect
  ProcedureReturn ladate.s
EndProcedure

Procedure AfficheHeure()
SetGadgetText(#Heure,    DateToString() )
EndProcedure

Procedure Fenetre() 
  
    RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  

  If RanresultI = 1 
 Global Temps.s 
     EndIf
  If RanresultI = 2
  Global Temps2.s 
  EndIf 
  
  HeureDemarrage = (Second(Date()))
  
  If OpenWindow(#Fenetre, 0, 0, 500, 500, "CHATON", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ;StringGadget (#Heure, 5, 1, 150, 30, "",#ES_CENTER|#PB_String_ReadOnly)
  TextGadget(#Heure, 10,300,200,20,DateToString() )
  AddWindowTimer(#Fenetre,10,1000)
  BindEvent(#PB_Event_Timer,@AfficheHeure(),0)
   
  TextGadget(#Texte_accueil,10,5,100, 100,Texte)
  
  ResultTemps = Random(2,1)
  
  If ResultTemps = 1 : TempsMeteo = "Il fait un beau soleil" : EndIf
  If ResultTemps = 2 : TempsMeteo = "Il fait gris, il va pleuvoir" : EndIf
  
  TextGadget(#Meteo,10,260,200, 20,TempsMeteo)
    
  ButtonGadget(#Bouton_Quitter, 10, 60, 200, 20, "Fermer")   
  ButtonGadget(#Bouton_Nourrir, 10, 90, 200, 20, "Nourrir")  
  ButtonGadget(#Bouton_Caresser, 10, 120, 200, 20, "Caresser")  
  ButtonGadget(#Bouton_Frapper, 10, 150, 200, 20, "Frapper")
  ButtonGadget(#Bouton_Appeler, 10, 180, 200, 20, "Appeler")  
  ButtonGadget(#ID_Nouveau, 10,210,200 ,20,"Jeu")      
    
  ;TextGadget(#RanResult, 10,240,200,20,""+RanResult)   
   MessageRequester("Info","La gamelle est vide",64) 
        If (Hour(Date())) = 19 Or (Hour(Date())) = 12 Or (Hour(Date())) = 9
          MessageRequester("Info","Il est l'heure de nourrire le chaton !!!",64)
       Else 
        If (Hour(Date())) = 10 Or (Hour(Date())) = 14 Or (Hour(Date())) = 16 Or (Hour(Date())) = 20
          MessageRequester("Info","Le chaton dort...",64)
        EndIf
        EndIf 
      EndIf 
     
EndProcedure ;

Procedure Nourrir()
  
  TotalBouffe = TotalBouffe + Nourriture  
  
  If TotalBouffe => 4
    MessageRequester("Info","La gamelle déborde... inutile d'en mettre tant !",64)  
    TotalBouffe = 3
   Else      
     MessageRequester("Info","Vous avez mis "+TotalBouffe+" ration(s) de croquettes !",64) 
     
   EndIf  
   
 EndProcedure
 
 Procedure Caresser()
   Joie = Joie + BienEtre
   MessageRequester("Info"," "+Joie+"",64)
   RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
  
  If RanresultI = 1 
MessageRequester("Info","Le chaton Ronronne",64)
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Le chaton ferme les yeux",64)  
       
  EndIf
  
  ;If colere > 0 : Joie - colere : EndIf
      If Joie = 5
  Joie = #True 
EndIf
If Joie = #True
  MessageRequester("Info"," le chanton est heureux ;)",64)
  EndIf 
 EndProcedure
 
 Procedure Frapper()
    RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
   
  If RanresultI = 1 
    MessageRequester("Info","Le chaton part en courant",64)
    Colere = 1
  EndIf
  
  If RanresultI = 2
    MessageRequester("Info","Le chaton feule",64)  
    Colere = 2
   EndIf
   
   EndProcedure
   
 Procedure Appeler()
     RanResult = ""  
  RanResultI = Random(3,1)  
  RanResult = Str(RanResultI)  
  If RanresultI = 1 
    MessageRequester("Info","Le chaton ne vous calcule pas",64)  
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Le chaton vient en courant",64)  
  EndIf
    If RanresultI = 3
     MessageRequester("Info","Le chaton dresse l'oreille",64)  
EndIf
 EndProcedure
 
 Procedure OpenRAN()
  If ReadFile(#Fichier,"nb.ran")          
       RanResult  =  "Nombre : "+ReadString(#Fichier)   
       SetGadgetText(#RanResult,RanResult)       
     CloseFile(#Fichier)        
   EndIf
 EndProcedure
 
Procedure SaveRAN()       
  If CreateFile(#Fichier,"nb.ran", 0)               
    WriteStringN(#Fichier,RanResult)        
   CloseFile(#Fichier)      
 EndIf  
EndProcedure

Procedure Jeu()                      
     RanResult = ""  
  RanResultI = Random(2,1)  
  RanResult = Str(RanResultI)  
  SaveRAN()  
  If RanresultI = 1 
    MessageRequester("Info","Vous lancez une balle. Le chat ne calcule pas la balle",64)  
     EndIf
  If RanresultI = 2
    MessageRequester("Info","Vous lancez une balle. Le chat poursuit la balle",64)  
 
  EndIf 
EndProcedure                                                                                                                           
  
;-Procedure au démarrage
Fenetre() 
   
;-Boucle du Programme

Global NewList Message.s()
Global.b BOT

; liste de messages
AddElement (Message())
Message() = "Le chat se promène dans la maison"
AddElement (Message())
Message() = "Le chat miaule"
AddElement (Message())
Message() = "Le chat part en courant"
AddElement (Message())
Message() = "Le chat regarde par la fenêtre"

BOT = #True

;If OpenWindow(0, 0, 0, 400, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
    StringGadget(10,10,55,400,25,"",#PB_String3D_ReadOnly)
   
    ; Ajout du minuteur 3 toutes les 5 secs
    AddWindowTimer(0, 3, 5000)

    Repeat
      Event = WaitWindowEvent()
     
      If Event = #PB_Event_Timer And EventTimer() = 3
       
        ;variable bot qui dit si oui ou non le bot affiche
        If BOT = 1
          SelectElement (message(), Random(3))
          SetGadgetText(10, message())
        EndIf
       
      ElseIf Event = #PB_Event_Gadget
       
        Select EventGadget()
           
          EndSelect
         
      EndIf   
     
    Until Event = #PB_Event_CloseWindow
  ;EndIf
         
    
 Select glGadget   
  Case #PB_Event_Gadget      
  Case #ID_Nouveau :  Jeu()          
 EndSelect          
 
     Select Event
     
       Case #PB_Event_Gadget
         Select EventGadget() 
             
             Case #Bouton_Nourrir
             Nourrir() 
             
           Case #Bouton_Quitter 
             CloseWindow(#Fenetre)
             End
             
           Case #Bouton_Caresser
             Caresser()
             
           Case #Bouton_Frapper
             Frapper()
             
           Case #Bouton_Appeler
             Appeler()
             
           Case #ID_Nouveau :  
             Jeu() 

         EndSelect
            
     EndSelect
        
        End
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Premier projet (CatBot)

Message par boby »

Une autre approche :

Code : Tout sélectionner

Global NewList message.s(), timer, NextEventTimer = 5000
; liste de messages
AddElement (Message())
Message() = "Bonjour"
AddElement (Message())
Message() = "Pb c'est top"
AddElement (Message())
Message() = "yeahhhh"
AddElement (Message())
Message() = "J'aime l'été"
Declare Close() : Declare Events()
If OpenWindow(0,0,0,100,100,"BOT",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  TextGadget(0,10,10,80,20,"")
  timer = ElapsedMilliseconds()
  BindEvent(#PB_Event_CloseWindow,@Close())
  Repeat : WaitWindowEvent(10) : Events() : ForEver
EndIf

Procedure Events()
  If ElapsedMilliseconds() - timer >= NextEventTimer
    Debug "Changement du message"
    SelectElement(message(),Random(ListSize(message())-1))
    SetGadgetText(0,message())
    NextEventTimer = Random(20000,1000)
    timer = ElapsedMilliseconds()
  EndIf
EndProcedure
Procedure Close()
  End
EndProcedure
Je te conseil aussi de regarde du coté des structures plutot qu'une blinde de variable pour définir l'état d'un même "objet" (ici ton chat).
exemple :

Code : Tout sélectionner

EnableExplicit
Structure chat
  x.i
  y.i
  BienEtre.i
  Joie.i
  Colere.i
  Nourriture.i
  TotalBouffe.i
EndStructure
Global Animale.chat, ButtonNourrire, ButtonJouer, ButtonCogner
Animale\x = 10
Animale\y = 5
Animale\BienEtre = 1
Animale\Colere = 1
Animale\Joie = 1
Animale\Nourriture = 1
Declare nourrire()
Declare jouer()
Declare cogner()
Declare close()
If OpenWindow(0,0,0,200,300,"CatBot",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  ButtonNourrire = ButtonGadget(#PB_Any,10,10,50,20,"Nourrir")
  ButtonJouer = ButtonGadget(#PB_Any,10,40,50,20,"Jouer")
  ButtonCogner = ButtonGadget(#PB_Any,10,70,50,20,"Cogner")
  BindEvent(#PB_Event_CloseWindow,@close())
  BindGadgetEvent(ButtonNourrire,@nourrire())
  BindGadgetEvent(ButtonJouer,@jouer())
  BindGadgetEvent(ButtonCogner,@cogner())
  Repeat : WaitWindowEvent() : ForEver
EndIf

Procedure close()
  End
EndProcedure

Procedure nourrire()
  Animale\Nourriture +1
  Debug "Nourriture : " + Str(Animale\Nourriture)
EndProcedure

Procedure jouer()
  Animale\Joie + Random(3)
  Animale\Colere - Random(2)
  If Animale\Colere < 0 : Animale\Colere = 0 : EndIf
  Debug "Joie : " + Str(Animale\Joie)
  Debug "colere : "+Str(Animale\Colere)
EndProcedure

Procedure cogner()
  Animale\Colere + Random(5)
  Animale\Joie - Random(3)
  If Animale\Joie < 0 : Animale\Joie = 0 : EndIf
  Debug "colere : "+Str(Animale\Colere)
  Debug "Joie : " + Str(Animale\Joie)
EndProcedure
  
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Premier projet (CatBot)

Message par Ar-S »

Pour ton besoin d'action a des moments précis, fais un timer chaque seconde qui choppe l heure et les minutes. Ainsi lorsque heure = heurecible AND minute = minutecible
Affiche message x ou y
~~~~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: Premier projet (CatBot)

Message par FR4NK13 »

Bonjour Boby,

Merci pour le temps passer sur mon code, mais je ne comprends pas trop, dans ton 2e exemple, il n'y a seulement que la moitié de mon programme et qui ne fonctionne pas ??

Ar-S,

Merci pour l'explication mais je ne comprends pas non plus, je suis super débutante et longue à la détente, pourrais-tu me mettre un exemple concret pour que je comprenne mieux s'il te plaît ?

Merci beaucoup pour votre aide à tous les deux, et je suis désolée pour mon incompréhension, je me sens un peu nulle... je débute toute juste et je n'ai pas lu beaucoup de documentation car je ne comprends rien, j'aurais besoin je crois de plus d'explications :oops:

Passez une bonne soirée
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Premier projet (CatBot)

Message par Ar-S »

Voilà j'ai modifié mon code un peu à la walou mais ça reprend
- Le timer
- Les structures (qui effectivement sont précieuses comme l'a dit boby)
- et la gestion des évènements de date()

Essaye de te dépatouiller avec ça. J'ai profité du "calme" de la nuit pour te pondre ça mais comme je te l'ai dit je sais pas si j'aurai le temps de te répondre souvent comme ça.

Amuse toi bien

Code : Tout sélectionner


Global NewList Message.s()
Global.b BOT


Structure temps
  HeureDepart.b
  MinDepart.b
  SecDepart.b
  HeureCible.b
  MinCible.b
  SecCible.b
  Message.s
EndStructure



Bot = 0

; liste de message
AddElement (Message())
Message() = "ALERTE 1"
AddElement (Message())
Message() = "ALERTE 2"
; AddElement (Message())
; Message() = "yeahhhh"
; AddElement (Message())
; Message() = "J'aime l'été"


If OpenWindow(0, 0, 0, 400, 100, "Exemple Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(1, 10, 10, 200, 20, "CLIC Pour lancer l'alerte 1 dans 10s")
    ButtonGadget(2, 10, 30, 200, 20, "stop les messages du bot")
    StringGadget(10,10,55,400,25,"",#PB_String3D_ReadOnly)
    
    ; Ajout du minuteur 3 toutes les 1 secs
    AddWindowTimer(0, 3, 1000)
    
    Value = 0
    Repeat
      Event = WaitWindowEvent()
      
      ;////////// GESTION DU TIMER CHAQUE SECONDE
      If Event = #PB_Event_Timer And EventTimer() = 3
        
        ; Chaque sec on récupère l'heure complète
        Heure = Hour(Date())
        Min = Minute(Date())
        Sec = Second(Date())
        
        ; Affichage de l'heure dans la barre de titre 
        SetWindowTitle(0, Str(Heure) +":"+ Str(Min) +":"+ Str(Sec) )
        
        ; Dans ceci Alert1.temps\MinCible on créé une alerte Alert1 qui se sert de la structure Temps créé en début de code et on utilise le paramètre MinCible de cette structure.
        ; Idem pour Alert1\SecCible ..
        ; L'avantage est que tu peux ensuite créé autant d'Alerte que tu veux en utilisant le même schema
        
        
         If BOT = 1 And Heure = Alert1.temps\HeureCible And min = Alert1.temps\MinCible And Sec = Alert1\SecCible
          SelectElement (message(), 0)
          SetGadgetText(10, message())
          
          SetGadgetText(1,  "et dans 21s la seconde alerte")
          
        ElseIf BOT = 1 And Heure = Alert2.temps\HeureCible And min = Alert2.temps\MinCible And Sec =Alert2\SecCible
          
          SelectElement (message(), 1)
          SetGadgetText(10, message())
          DisableGadget(1,0)
        EndIf
        
        
        ;//// GESTION DES GADGETS
      ElseIf Event = #PB_Event_Gadget
        
        Select EventGadget()
            
          Case 1
            
            ; Recupération d
            HeureDepart = Hour(Date())
            MinDepart = Minute(Date())
            SecDepart = Second(Date())
            
            HeureCible = Hour(Date())
            ; Pour l'exemple, on va envoyer un message 
            ; 10 sec apres le clic puis 21 sec apres
            Alert1\SecCible = SecDepart + 10
            Alert2\SecCible = Alert1\SecCible + 21
            Alert1\MinCible = MinDepart
            Alert2\MinCible = MinDepart
            Alert1\HeureCible = HeureDepart
            Alert2\HeureCible = HeureDepart
            
            ; Gestion du dépassement de 60 seconde. On incrémente une minute
            If Alert1\SecCible > 60
              Alert1\SecCible - 60
              Alert1\MinCible + 1
            EndIf
            ; idem
            If Alert2\SecCible > 60
              Alert2\SecCible - 60
              Alert2\MinCible + 1
            EndIf
            ; Dans cette exemple je ne gère pas le dépassement d'heure, mais la procédure est la même
            
            
            ; Un petit débug pour que tu vois les heures des alertes 
            Debug "Heure de départ : " + Str(HeureDepart) + ":" + Str(MinDepart) + ":" + Str(SecDepart)
            Debug "Alert 1 : " + Str(Alert1\HeureCible) + ":" + Str(Alert1\MinCible) + ":" + Str(Alert1\SecCible)
            Debug "Alert 2 : " + Str(Alert2\HeureCible) + ":" + Str(Alert2\MinCible) + ":" + Str(Alert2\SecCible)
            
            BOT = #True
            DisableGadget(1,1)
          Case 2
            BOT = #False           
             DisableGadget(1,0)
          EndSelect
          
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
  EndIf

~~~~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: Premier projet (CatBot)

Message par boby »

FR4NK13,

Il n'y a que la moitié de ce que tu veux faire car le but de mon poste n'était pas de refaire tout ton code, uniquement de te parler des structures, j'ai donc fait un petit exemple sur comment les utiliser en reprenant l'idée de ton topic. Si chez toi ça ne fonctionne pas c'est probablement par-ce que tu n'as pas activée le débugger (Icon d'un petit insect vert dans l'IDE de pure basic) car j'affiche les résultats sur celui-ci.

La simplicité du débugger de pure est pour moi une de ses grandes forces, aussi je t'invite très fortement à l'activer et à t'en servir plus que de raison.

Information importante à savoir à propos du debug, lors de la création d'un executable, toutes ligne de code contenant un debug sera ignorée !
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Premier projet (CatBot)

Message par microdevweb »

@FR4NK13,

Perso je ne saurais trop te conseiller avant de coder de faire une analyse, papier.

Exemple :
Action du personnage:
Manger,Dormir,Râler,Vieillir, mourir etc....

Déclencheurs:
manger (facteur temps)
Quantité de nourriture (selon age)
etc ...

Action du player:
Nourrir, border, sortir etc...

Ensuite perso. je ferais cela en 2 couches, une couche model qui va être réellement le moteur du jeu et une couche graphique qui va afficher le personnage et permettre à l'utilisateur de lancer des actions.

La couche model :

Etape 1 écrire les structures, listes variables qui contiendrons les données nécessaire à la vie du personnage.
Exemple

Code : Tout sélectionner

Structure Perso
   vie.i
    energie.i
    etc....
EndStructure
Structure Aliment
    energie.i
    etc....
EndStructure

monPerso.Perso,cookie.Aliment
Ecrire les procédures pour la gestion des action ;
Exemple:
Procedure manger(aliment)
monPerso\energie += aliment.energie
endProcedure

Une fois que le model tourne tu peut alors t’attaquer au détails, l'interface graphique la gestion.

Perso je n'utiliserais pas de timers car il disparaissent quand tu quitte le programme, je mémoriserais la date naissance (première ouverture du jeu) et chaque ouverture en comparent les date saurais calculer l'age Idem pour la faim date du dernier repas etc.

Voila j'espère que cela pourra t'inspirer
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
FR4NK13
Messages : 72
Inscription : mar. 03/juil./2018 9:30

Re: Premier projet (CatBot)

Message par FR4NK13 »

Bonjour Ar-S, bonjour Boby :)

Ar-s, merci pour ton code, je vais regarder ça et je reviendrai vers toi après. Je n'attendais pas réellement que l'on me code mon programme à ma place, bien entendu, et je te remercie beaucoup pour le temps que tu as passé hier et dans la nuit pour m'aider.
Ce que j'aurais bien aimé surtout, ce sont des explications. Comme je suis pas capable de comprendre les documentations sur PB, ce que j'attends, c'est que l'on m'explique les fonctions dont j'ai besoin au fure et à mesure.

Par exemple dans ton dernier code, je n'ai pas tout compris, mais ce qui est bien chez moi c'est que j'apprends vite lorsque l'on m'explique et je progresse un peu à chaque fois que je bidouille dans un code que l'on me propose :)

Cela dit, des explications sont toujours précieuses et bienvenues, et me permettent d'avancer plus vite dans mon apprentissage donc n'hésite pas la prochaine fois à m'expliquer un peu plus :)

Je trouve ça dommage que tu n'aies pas pu faire ce projet qui te tenait à coeur.

Boby, oui à vrai dire j'avais bien compris l'idée, le truc c'est que je n'avais pas vraiment compris ce demi code que tu m'as donné :lol: je vais essayer de relire à tête reposée, pas toujours évident pour moi d'arriver à avoir du calme autours de moi...

Microdevweb, bonjour ! :)

Ce que tu dis à la fin m'intéresse beaucoup, car j'aimerais pouvoir enregistrer des informations aléatoire entre autre (pour créer le caractère par exemple) et c'était le but de la procédure "SAVERAN" que m'a montré mon ami mais il n'a jamais trop su m'aider mieux dans mon projet, pour ça qu'il m'a conseillé de m'inscrire ici pour avoir de l'aide.

Pourrais-tu m'expliquer plus en détail comment enregistrer un maximum d'informations comme les événements aléatoires les plus importants type séquelles, éventuellement descendance ou truc du genre ? Je verrais bien un système d'apprentissage aussi de l'animal, qui peut être sauvage au début puis s'apprivoiser avec le temps, ou encore apprendre de ses bêtises, ne pas manger un aliment qui l'aurait rendu malade une seconde fois, apprendre les règles de la maison, etc...

Passez une bonne journée et à bientôt, je repasse d'ici ce soir avec mes questions.

Encore merci :)
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Premier projet (CatBot)

Message par microdevweb »

Quand j'aurais un peut de temps je te ferais une analyse Uml (de base que tu devra compléter c'est en cherchant que l'on apprend)

Et par après un code de base.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Premier projet (CatBot)

Message par Ar-S »

J'ai mis des commentaires explicatifs devant les trucs importants.
Si tu ne comprends pas des bouts de codes ou leur agencements. Précises lesquels ;)
Je t'invite aussi à regarder du coté de la section des tutos.
Tout ne te sera pas utiles mais il y a des exemples commentés.
~~~~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: Premier projet (CatBot)

Message par microdevweb »

Voici déjà le cas d'utilisation use case

Image
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Premier projet (CatBot)

Message par microdevweb »

Un exemple de diagramme d'activité

Image
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: Premier projet (CatBot)

Message par boby »

Pourrais-tu m'expliquer plus en détail comment enregistrer un maximum d'informations comme les événements aléatoires les plus importants type séquelles, éventuellement descendance ou truc du genre ? Je verrais bien un système d'apprentissage aussi de l'animal, qui peut être sauvage au début puis s'apprivoiser avec le temps, ou encore apprendre de ses bêtises, ne pas manger un aliment qui l'aurait rendu malade une seconde fois, apprendre les règles de la maison, etc...
Exemple simple de sauvegarde :

Code : Tout sélectionner

Structure animal
  faim.i
  someil.i
  soife.i
  joie.i
EndStructure
Global pet.animal
pet\faim = 1
pet\someil = 2
pet\soife = 3
pet\joie = 4
If OpenFile(0,GetTemporaryDirectory()+"save")
  WriteInteger(0,pet\faim)
  WriteInteger(0,pet\someil)
  WriteInteger(0,pet\soife)
  WriteInteger(0,pet\joie)
  CloseFile(0)
EndIf
Puis pour recharger ce que tu as sauvegardé :

Code : Tout sélectionner

Structure animal
  faim.i
  someil.i
  soife.i
  joie.i
EndStructure
Global pet.animal
If OpenFile(0,GetTemporaryDirectory()+"save")
  pet\faim = ReadInteger(0)
  pet\someil = ReadInteger(0)
  pet\soife = ReadInteger(0)
  pet\joie = ReadInteger(0)
  CloseFile(0)
  DeleteFile(GetTemporaryDirectory()+"save")
EndIf
Debug pet\faim
Debug pet\someil
Debug pet\soife
Debug pet\joie
Répondre