Greedy

Programmation avancée de jeux en PureBasic
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Greedy

Message par Micheao »

falsam a écrit :M'en fou j'irais proposer mon jeu sur le forum anglais ou là je rencontrerai des membres enthousiastes qui me diront "Whaou it's great, it's amazing :)"
tu préfère les Rosbifs :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Greedy

Message par falsam »

Parfois oui. Si je ne me réfère qu'au jeux (MMO) que je fréquente en ligne, les communautés francophones sont des catastrophes : Constamment en train de se taper sur la gueule.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Greedy

Message par Micheao »

falsam a écrit :Parfois oui. Si je ne me réfère qu'au jeux (MMO) que je fréquente en ligne, les communautés francophones sont des catastrophes : Constamment en train de se taper sur la gueule.

je suis d'accord avec toi .
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Greedy

Message par Micoute »

Ca, c'est l'esprit gaulois !
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 !
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Greedy

Message par Ar-S »

Faut faire 10 000 avec un jet ?
Pour le moment j'ai fait

2500 - 2600 - 2500

avec ces combis

Code : Tout sélectionner

Debug Scoring(SortString("331116"))
Debug Scoring(SortString("662261"))
Debug Scoring(SortString("226666"))
Par contre faut que tu filtres la valeur entrée car là on peut mettre 1-9AZ
~~~~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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Greedy

Message par falsam »

Houla je n'ai pas du être assez clair je pense.

Le code scoring.pb que je montre n'est qu'un process appelé par le programme principal du jeu que je n'ai pas publier pour le moment car il merdouille quelque peu.
Ar-S a écrit :Faut faire 10 000 avec un jet ?
Non et se serait impossible.

­■ Quand un joueur entre dans la partie, son score est initialisé à zero point. (of course)
- Pour entrer dans la partie, il va devoir jouer les dés plusieurs fois de suite sans interruption jusqu'à obtenir ces fameux 1000 points ou plus.
- Chaque combinaison de dés représentant des points évalués par scoring.pb, et écartée du prochain lancé.
- Si le lancé suivant donne des points, alors le joueur pourra relancer les dés.
- Si le lancé suivant ne donne pas de points, alors il perd son tour et son score revient à zéro.

Quand un joueur est enfin entrée dans la partie, son score est au moins à 1000 points. (of course)
- Quand c'est à lui de jouer, il va Roller : C'est à dire lancer les dés
- Il sélectionne une combinaison de dés donnant un résultat évalué par scoring.pb
- Si ce résultat lui convient il pourra placer ce résultat dans son score et son tour passe.
- Si il ne Place pas son résultat dans son score, il a la possibilité de Roller encore une fois avec les dés non sélectionnés pour augmenter son résultat MAIS avec le risque de ne pas obtenir de point supplémentaire. Et là c'est le drame car dans ce cas, son résultat revient à 0 et il ne peut plus le Placer dans son score.

L'objectif de ce jeu est d'atteindre les 10 000 points ou plus pour terminée la partie.
Celui qui dépasse le plus ces 10 000 points sera le gagnant.

La petite astuce et d'essayer de na pas trop dépasser par exemple les 9900 points, puis quand c'est de nouveau à vous de jouer, de roller autant de fois qu'il le faut en espérant pouvoir dépasser largement ces 10 000 points.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Greedy

Message par Ar-S »

Ah ok il me manquait l'élément "jeu pas terminé" :D
~~~~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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Greedy

Message par falsam »

Ar-S a écrit :Ah ok il me manquait l'élément "jeu pas terminé" :D
Toujours pas terminé mais un début :)

Le code que je vous présente est brut de décoffrage sans aucun design pour le moment dont le seul but est de tester le gameplay.

Je souhaite uniquement savoir si il y a des bugs et pour ça je compte sur vous :)

Le code seul ci-dessous ne fonctionne pas car il est lié au scoring que j'ai publié précédemment.

Mais vous pouvez télécharger les deux codes ainsi que les combinaisons possibles du gameplay sur ce lien
:arrow: Greedy

La règle du jeu se trouve au premier message de ce topic mais vous serez guidé tout au long de ce jeu.

Dernière précision, dans cette version le jeu est mono-joueur afin de ne tester que le gameplay.

C'est une version béta qui porte le numéro 0.07

Code : Tout sélectionner

EnableExplicit

Enumeration Fonts
  #FontGlobal
EndEnumeration

Enumeration Window
  #Mainform
EndEnumeration

Enumeration Gadget
  #Roll 
  #Place
  
  #Reset
  #NewPlayer
  
  #HighScore
  #PlaceScore
  #RollScore
  #SelMessage
  #GameMessage
  
  #Life
EndEnumeration

Enumeration Extra 100
  #EndStage 
  #EndLife 
  #EndGame
EndEnumeration

;Les 6 dés
Structure sDice
  id.i  ;Identifiant gadget représentant le dé
  Num.i ;Numéro entre 1 et 6
  Sel.b ;0:Pas sélectionné, 1:Selectionné, 2:Plus sélectionnable
EndStructure
Global NewList Dice.sDice()

;Liste des joueurs
Structure sPlayer
  UserName.s
  HightScore.i
  PlaceScore.i
  Live.i
EndStructure
Global NewList Players.sPlayer()

Global SubmitRoll.s = "" ;Chaine contenant les dés qui sera soumise au scoring
Global RollScore = 0 ;Score Rollé 
Global SubmitScore = 0 ;Score obtenu pas la selection

Declare Start()
Declare OnDiceSelect()
Declare OnPlay()
Declare OnReset()

;Routine calculant le score donné par les dés avant et aprés avoir lancer les dés 
IncludeFile "scoring.pb"

Start()

;Le jeu démarre 
Procedure Start()
  Protected n = 0;Index pour la création des dés
  
  LoadFont(#FontGlobal, "", 11)
  SetGadgetFont(#PB_Default, FontID(#FontGlobal))
  
  OpenWindow(#Mainform, 0, 0, 500, 250, "Greedy", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  ;Affichage des 6 dés
  ;Les buttons gadgets seront remplacés par des canvas pour l'affichage des dés 
  For n = 0 To 5
    AddElement(Dice())
    Dice()\id = ButtonGadget(#PB_Any, 10 + n*50, 10, 40, 40, "?", #PB_Button_Toggle)
    SetGadgetData(Dice()\id, n)
    DisableGadget(Dice()\id, #True)
    BindGadgetEvent(Dice()\id, @OnDiceSelect())
  Next
    
  ;Affichage du plus haut score atteint par le joueur
  TextGadget(#PB_Any, 350, 20, 80, 22, "High Score")
  TextGadget(#HighScore, 440, 20, 50, 22, "0", #PB_Text_Right)
  
  ;Affichage du score Placé
  TextGadget(#PB_Any, 350, 50, 80, 22, "Place Score")
  TextGadget(#PlaceScore, 440, 50, 50, 22, "0", #PB_Text_Right)
  
  ;Affichage du score Rollé
  TextGadget(#PB_Any, 350, 80, 80, 22, "Roll Score")
  TextGadget(#RollScore, 440, 80, 50, 22, "0", #PB_Text_Right)
  
  ;Affichage du nombre de vies
  TextGadget(#PB_Any, 350, 110, 80, 22, "Life")
  TextGadget(#Life, 440, 110, 50, 22, "0", #PB_Text_Right)
  
  ;Button Roll
  ButtonGadget(#Roll, 10, 100, 80, 22, "Roll")
  BindGadgetEvent(#Roll, @OnPlay())
  
  ;Button Place
  ButtonGadget(#Place, 110, 100, 80, 22, "Place")
  DisableGadget(#Place, #True) 
  BindGadgetEvent(#Place, @OnPlay())
  
  ;Button Reset
  ButtonGadget(#Reset, 210, 100, 80, 22, "Reset")
  DisableGadget(#Reset, #True) 
  BindGadgetEvent(#Reset, @OnReset())
  
  ;Message d'information sur le jeu
  TextGadget(#GameMessage, 10, 140, 480, 22, "Pour commencer, cliquer sur Roll.")
  
  ;Score des dés en cours de sélection
  TextGadget(#SelMessage, 10, 170, 480, 50, "Vous devez ensuite cliquer sur Roll autant de fois qu'il le faut pour atteindre 1000 points afin d'entrer dans la partie.")
  
  ;Dans cette version le jeu est mono-joueur 
  AddElement(Players())
  Players()\UserName = "Player"
  
  ;Début du jeu
  OnReset()
  
  Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure


;Un ou plusieurs dés sont sélectionnés 
Procedure OnDiceSelect() 
  
  SubmitRoll = "" ;Chaine qui sera soumise au scroring
  SubmitScore = 0 ;Score obtenu par la chaine soumise au scoring
  
  ;Quel est le dé qui a étè sélectionné ?
  SelectElement(Dice(), GetGadgetData(EventGadget()))
  
  If Dice()\Sel = 0
    Dice()\Sel = 1  ;Le dé est sélectionné
  Else
    Dice()\Sel = 0  ;Le dé n'est plus sélectionné
  EndIf
     
  ;Constitution de la chaine qui sera soumise au scroring
  ;Cette chaine est composée des dés sélectionnés
  ForEach Dice()   
    If Dice()\Sel = 1 ;Un dés est sélectionné 
      SubmitRoll + Str(Dice()\Num) ;Ajout du dé dans la chaine de scoring
    EndIf
  Next
    
  ;Soumission de la selection de dés au scoring
  If SubmitRoll <> ""
    SubmitScore = Scoring(SortString(SubmitRoll))
  EndIf
  
  ;Affichage des points retournée par le scoring
  SetGadgetText(#SelMessage, "Votre sélection donne " + Str(SubmitScore) + " points." + #CRLF$ + 
                             "Vous pouvez Roller ou Placer (Si vous avez cette option)")
  
  ;Est que les points obtenus par cette soumission peuvent être placer ?
  Players()\PlaceScore = Val(GetGadgetText(#PlaceScore))
  RollScore = Val(GetGadgetText(#RollScore))
  
  ;Régle : Pour entrer dans la partie il faut faire au moins 1000 points 
  ;Peut on autoriser à placer les points obtenus ?
  If Players()\PlaceScore + RollScore + SubmitScore >= 1000
    DisableGadget(#Place, #False) ;Le score provisoire peut être placer
  Else
    DisableGadget(#Place, #True) 
  EndIf
  
  ;Le joueur peut'il roller ?
  If SubmitScore <> 0  
    DisableGadget(#Roll, #False) ;Oui
  Else
    DisableGadget(#Roll, #True) ;Non car il n'a pas sélectionner de dé
  EndIf
  
EndProcedure

;Le joueur a Rollé ou Placé des points.
;Des dés sont sélectionnés par un joueur qui décide de 
; - Place : Placer les dés dans son score
; - Roll  : De continuer à jouer pour augmenter son score rollé
Procedure OnPlay()
  Protected Play = EventGadget() ;#Role = 0 & #Place = 1 
  Protected DiceSelect.i = 0
  Protected RoleTest.s, PossiblePoints = 0
  Protected n = 0
  
  ;-Tronc commun 
  DisableGadget(#Roll, #True)
  DisableGadget(#Place, #True)
  
  Players()\PlaceScore = Val(GetGadgetText(#PlaceScore))
  RollScore = Val(GetGadgetText(#RollScore))
  
  SubmitRoll=""
  
  SetGadgetText(#SelMessage, "")
  
  ;Mise à jour du Score Rollé 
  ;SubmitScore est misé à jour depuis OnDiceSelect()
  SetGadgetText(#RollScore, Str(RollScore + SubmitScore))
  
  ;Combien de dés sont déja sélectionnés?
  ForEach Dice()
    If Dice()\Sel = 1 Or Dice()\Sel = 2 ;Le dés a été selectionné
      Dice()\Sel = 2 ;Il ne pourra plus être selectionner
      DiceSelect + 1
      DisableGadget(Dice()\id, #True)
    EndIf
  Next
    
  ;- Action Roll : Il y a t'il encore des dés pouvant donner des points ?
  If Play = #Roll And DiceSelect < 6    
    ForEach Dice()
      If Dice()\Sel = 0
        DisableGadget(Dice()\id, #False) ;Le dés est selectionnable
        Dice()\Num = Random(6, 1) ;Recherche du prochain numéro 
        RoleTest + Str(Dice()\Num) ;Ajout de ce numéro dans la chaine de scoring
        SetGadgetText(Dice()\id, Str(Dice()\Num)) ;Affichage du numéro de dés
      EndIf        
    Next
    
    SetGadgetText(#SelMessage, "A présent, sélectionner vos dés.")
    
    If RoleTest <> ""
      PossiblePoints =  Scoring(SortString(RoleTest))
    EndIf
    
    If PossiblePoints = 0 ;Regardons si ça donne quelques points ?
      ;Ha non: Quel dommage :p
      SetGadgetText(#GameMessage, "Vous venez de perdre " + GetGadgetText(#RollScore) + " points.")
      
      ;Les dés sont inactifs
      ForEach Dice()
        DisableGadget(Dice()\id, #True)
      Next
      
      ;Le joueur perd une vie sur les 3 de départ
      Players()\Live - 1 
      SetGadgetText(#Life, Str(Players()\Live))
      
      If Players()\Live = 0 
        Play = #EndLife ;Plus de vie
      Else
        SetGadgetText(#SelMessage, "Attention surveillez le nombre de vie")
      EndIf
      
      DisableGadget(#Reset, #False)
    Else 
      SetGadgetText(#GameMessage, "Vous pouvez faire " + PossiblePoints + " points au maximum.") 
    EndIf 
    
    DisableGadget(#Roll, #True)
    DisableGadget(#Place, #True)
  EndIf 
  
  ;Action Roll et tous les dés sont selectionnés
  If Play = #Roll And DiceSelect = 6
    SubmitScore = 0
    ForEach Dice()
      Dice()\Sel = 0
      If Play = 0
        Dice()\Num = Random(6, 1)
        SetGadgetText(Dice()\id, Str(Dice()\Num))
      EndIf
      
      DisableGadget(Dice()\id, #False)
      SetGadgetState(Dice()\id, #False)
    Next  
    
    OnPlay()
  EndIf
    
  ;- Action Place 
  If Play = #Place ;Place    
    ;Le joueur récupére 3 vies 
    Players()\Live = 3
    SetGadgetText(#Life, Str(Players()\Live))
    
    ;Mise à jour du score placé
    Players()\PlaceScore + RollScore + SubmitScore
    SetGadgetText(#PlaceScore, Str(Players()\PlaceScore))
    SetGadgetText(#RollScore, "0")  
    SetGadgetText(#GameMessage, "")
    RollScore = 0 
    SubmitScore = 0
    
    ;Désactivation de tous les dés
    ForEach Dice()
      DisableGadget(Dice()\id, #True)
    Next
    
    DisableGadget(#Roll, #False) 
    DisableGadget(#Place, #True)
    
    ;Si le joueur à placé son roll tout en ayant un score >= 10000 point, son tour est terminée
    If Players()\PlaceScore >=10000
      Play = #EndStage
    Else
      ForEach Dice()
        Dice()\Sel = 0
        SetGadgetState(Dice()\id, #False)
      Next
      SetGadgetText(#GameMessage, "Cliquez sur Roll")
    EndIf  
  EndIf
  
  ;- 10000 points ou + 
  If Play = #EndStage
    If Players()\PlaceScore > Players()\HightScore
      Players()\HightScore = Players()\PlaceScore
      Players()\PlaceScore = 0
      Players()\Live = 0
    EndIf
    SetGadgetText(#HighScore, Str(Players()\HightScore))
    SetGadgetText(#GameMessage, "Bravo, Vous venez d'atteindre les 10 000 points")    
    DisableGadget(#Roll, #True)
    DisableGadget(#Place, #True)
        
    If ListSize(Players()) > 1    
      ;Joueur suivant
      ;......
    Else
      ;Le joueur est tout seul
      DisableGadget(#Reset, #False)
      SetGadgetText(#SelMessage, "Cliquez sur reset pour recommencer.")
    EndIf    
  EndIf
  
  ;-Perte des vies 
  If Play = #EndLife
    DisableGadget(#Roll, #True)
    DisableGadget(#Place, #True)
    ;DisableGadget(#Reset, #False)
    ;SetGadgetText(#GameMessage, "Vous avez perdu tous vos points,")
    ;SetGadgetText(#SelMessage, "Cliquer sur reset pour recommencer.") 
    
    If ListSize(Players()) > 1    
      ;Joueur suivant
      ;......
    Else
      ;Le joueur est tout seul
      DisableGadget(#Reset, #False)
      SetGadgetText(#SelMessage, "Cliquez sur reset pour recommencer.")
    EndIf    
  EndIf
    
EndProcedure

Procedure OnReset()
    ForEach Dice()
      Dice()\Num = 0
      Dice()\Sel = 0
      SetGadgetText(Dice()\id, "?")
      DisableGadget(Dice()\id, #True)
      SetGadgetState(Dice()\id, #False)
    Next  
    
    If players()\Live = 0 
      Players()\PlaceScore = 0
      Players()\Live = 3
      SetGadgetText(#PlaceScore, "0")
      SetGadgetText(#Life, Str(Players()\Live))
    EndIf
    
    SetGadgetText(#GameMessage, "Cliquez sur Roll")
    SetGadgetText(#SelMessage, "")        
    
    SubmitRoll = ""
    SubmitScore = 0
    RollScore = 0
    SetGadgetText(#RollScore, "0")     
          
    DisableGadget(#Roll, #False)
    DisableGadget(#Place, #True)
    DisableGadget(#Reset, #True)
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Greedy

Message par Ollivier »

Whao... It's great! Amazing...

(bon on va essayer de se concentrer 2 minutes...)
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Greedy

Message par Ollivier »

@Falsam

le "game play" de ton jeu, c'est 15 lignes.

est-ce vraiment des valeurs que tu cherches? Où bien est-ce une méthode de transformation de ton énoncé en algo?

Si tu as un doute, "synchronise" par une variable "Mode.I" et exécute via un Select Mode. Ça diminue (beaucoup) le besoin de faire tester. Et puis le programme ressemble alors grandement au grafcet que tu as dessiné au préalable.
Répondre