Idée pour gestion de cartes

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Idée pour gestion de cartes

Message par Ar-S »

Salut,

En ce jour férié j'en ai profité pour créer mon dessin pour le jeu sur lequel je bosse.
Un BlackJack.
Image

J'ai commencé sur du canvas avec un paquet de cartes. Le soucis est que je dois mettre 5 ou 6 jeux.
J'aimerai donc votre avis sur la gestion de ces cartes. Je pense donc basculer vers un openwindowscreen

J'ai commencé par une structure comme ceci

Code : Tout sélectionner

Structure carte
  SP.i ; num sprite
  Val.b ; Valeur de la carte
  Fam.s ; famille (pic coeur carreau treffle)
  Nom.s ; Sous forme de string mais je pense virer celle ci qui est inutile
EndStructure

J'ai ensuite mis ça dans un tableau
Dim carte.carte(51) ; (52 cartes)
Avant d'aller plus loin, selon vous, dois-je faire un tableau de 6*52 cartes? 6 tableaux de 52 cartes?
Sachant que je mets ensuite tout dans une liste chainée.


Bref je n'ai pas l'habitude de gérer autant d'images/sprites, encore moins quand il y en a X copies de chaque.

Vos conseils m'intéressent. D'avance merci
~~~~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 : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Idée pour gestion de cartes

Message par falsam »

Et pourquoi pas tout dans la liste directement

Code : Tout sélectionner

Structure Carte
  jeu.i     ; de 1 à 5 (ou 6)
  carte.i ; 1 à 52 (Correspond aux sprites)
EndStructure

Global NewList Sabot.Carte()

;Remplissage du sabot (5 jeux dans cet exemple)
For jeu = 1 To 5 
  For carte = 1 To 52
    AddElement(Sabot())
    Sabot()\jeu = jeu
    Sabot()\carte = carte
  Next
Next

CountCards = ListSize(Sabot()) - 1

;Mélanger le jeu
RandomizeList(Sabot())

;Tirage des cartes durant la parties 
ForEach Sabot()
  Debug Str(Sabot()\carte) + " du jeu " + Str(sabot()\jeu)
Next
Dernière modification par falsam le lun. 06/avr./2015 16:31, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

Merci Falsam je vais mater ça.
~~~~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
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Idée pour gestion de cartes

Message par majikeyric »

Code : Tout sélectionner

;Mélanger le jeu
For n = 0 To CountCards
  SelectElement(Sabot(), Random(CountCards, 0))
  *FirstElement = @Sabot()
 
  SelectElement(Sabot(), Random(CountCards, 0))
  *SecondElement = @Sabot()
 
  SwapElements(Sabot(), *FirstElement, *SecondElement)
Next
On peut simplement utiliser : RandomizeList(Sabot()) pour mélanger
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Idée pour gestion de cartes

Message par falsam »

Mais ouiIIIIiii ça fonctionne bien. Comment ai je pu passer à cotés de cette fonctionnalité !!! Merci majikeyric :)

le code est modifié en conséquence. Ar-S on attend la suite :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 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 : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

Merci majikeyric ! j'étais aussi passé coté de cette fonction.
Je partais aussi dans du swapelement avec du random (hors pointeur)
~~~~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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Idée pour gestion de cartes

Message par Ollivier »

@Ar-S

Salut, dans la lignée de l'idée de Falsam (qui présente déjà une structure tout à fait fonctionnelle), tu peux tenter de réduire les arguments.

Code : Tout sélectionner

Structure Carte
   Sprite.I
   Desc.I
   Angle.F
EndStructure

Global Dim Carte.Carte(207)
Le champ "Desc.I" (description) contient suffisamment de place pour stocker l'intégralité de la description d'une carte via ses bits.

Ex:
b0 : carte affichée(1) ou non (0)
b1 : couleur (0=noir 1=rouge)
b2 à b3 : numéro de sabot original
(00=1er
01=2nd
10=3ème
11=4ème)
b4 à b7 numéro de carte
(0000 libre pour éventuel Joker
01h à 0Ah = cartes de 1 à 10
0Bh = valet
0Ch = dame
0Dh = roi
0Eh à 0Fh = libre pour nouvelles règles)
b8 à b31 = champ de bits libres pour séquencer le programme.

Là, avec 8 bits de description tu sais d'où vient ta carte, si elle est affichée, et qu'est-ce qu'elle représente.
Dans la structure "CARTE" tu as le numéro de sprite. Donc tu sais sa position (SpriteX(), etc...) et sa taille (SpriteWidth() ).

Il te reste 24 bits (en mode 32 bits) pour définir où se trouve ta carte durant la partie, si sa valeur est en cours de comptabilisation, etc...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

Merci Ollivier pour ta suggestion.
J'avoue que je ne pige pas trop cette histoire de bits. (pour info j'ai pas besoin de connaître la couleur par exemple)

Pour le moment je planche sur 2 questions.
1ère question
Je bosse en OpenWindowScreen() pleine écran. Mon image de la table fait 1920 x 1080 et mes sprites sont dessinés sur cette base.
Si je passe sur mon portable qui est en 1600 de large, j'applique un resizeimage en 1600 (un desktopWidth(0)) x 1080/coef (le coef est de 1.23)
Ma question est la suivante. Doit-on se taper un zoomsprite sur tous les sprites pour les mettre au prorata de la table ?

Seconde question et j'en reviens à mes cartes.
- Mes images png de cartes sont dans un dossier datas
- Elles se nomme 1Cxxx.png 1CAxxx.png 1Txxx.png 1Pxxx.png (coeur carreau trèfle pic). Pour les figure les noms de fichiers commencent par 10Vxxx.png etc...
Voilà comment je procède pour charger les valeurs de mes 52 cartes.

Code : Tout sélectionner

Enumeration Cartes 1
  #S1:#S2:#S3:#S4:#S5:#S6:#S7:#S8:#S9:#S10:#S11:#S12:#S13
  #S14:#S15:#S16:#S17:#S18:#S19:#S20:#S21:#S22:#S23:#S24:#S25:#S26
  #S27:#S28:#S29:#S30:#S31:#S32:#S33:#S34:#S35:#S36:#S37:#S38:#S39
  #S40:#S41:#S42:#S43:#S44:#S45:#S46:#S47:#S48:#S49:#S50:#S51:#S52
EndEnumeration

Structure SP
  L.i
  H.i
  X.i
  Y.i
  Speed.b
  Path.s
  SID.i
  VAL.i
EndStructure

Global Dim SP.SP(52) ; je commencerai à 1 pas à 0

Procedure ChargeImage(Dossier.s)
  Protected MonSprite
  
  Directory$ = GetCurrentDirectory()+Dossier.s
  MonSprite = 1
  If ExamineDirectory(0, Directory$, "*.png")  
    While NextDirectoryEntry(0)
      If DirectoryEntryType(0) = #PB_DirectoryEntry_File
        NomCarte.s = DirectoryEntryName(0)
        Duo.s = Left (NomCarte,2)
        If Duo = "10"
            VALEUR = 10
          Else
            VALEUR = Val(Left(duo,1))   
          EndIf

          
          SP(MonSprite)\Path = GetCurrentDirectory()+Dossier.s+"\"+DirectoryEntryName(0)
          SP(MonSprite)\SID  = LoadSprite(MonSprite, SP(MonSprite)\Path)
          SP(MonSprite)\VAL  = VALEUR
          SP(MonSprite)\H    = SpriteHeight(MonSprite)
          SP(MonSprite)\L    = SpriteWidth(MonSprite)
;           SP(MonSprite)\X    =
;           SP(MonSprite)\Y    =
;           SP(MonSprite)\Speed =
          MonSprite + 1
      EndIf
    Wend
    FinishDirectory(0)
  EndIf

EndProcedure

ChargeImage("datas")

; TEST
Debug "#S1 : " + #S1
Debug "SP(1)\Path : "+ SP(1)\Path
Debug "Valeur : " + SP(1)\VAL

Les debug montrent que ça fonctionne bien du coup je me paume pour dupliquer ça dans 6 sabots (enfin 6 sabots en tout)
~~~~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
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Idée pour gestion de cartes

Message par Ollivier »

Ar-S a écrit :je pige rien aux bits
Il y a des avantages et des inconvénients à utiliser les bits.
Le principal avantage c'est l'optimisation ASM plus simple à mettre en place, une fois ton programme créé. C'est des JUMP, des CALL et des Jcc qui n'existent plus, remplacés par des calculs logiques/maths plus rapide.

L'inconvénient, c'est la complexité au départ.
Conclusion: c'est perdre du temps maintenant, et en gagner plus tard.

Maintenant, vu que ça ne te parle pas trop, et que les ordinateurs sont rapides, cette nécessité perd du terrain!

Dans ce cas, une structure exhaustive fera l'affaire (ce qui rejoint la suggestion de Falsam).

Désolé pour la couleur: j'ai juste considéré le rouge et le noir (2 états), ce qui est une erreur. Il faut évidemment considérer 4 couleurs (4 états): pique, etc...

Pour ton WindowedScreen(), tu peux ajuster chaque sprite. Si tu considères 208 cartes, c'est 3 lignes (for:resize:next ou for:transform:next ou for:zoom:next, etc...). C'est vrai que c'est pénible si tu considères plusieurs jeux de carte: pour ajuster, c'est 2n+1 lignes de code ou n est le nombre de paramètres de chaque carte.

Peut-être laisser OpenWindowedScreen() ajuster lui-même automatiquement? L'inconvénient dans ce cas, c'est l'impossibilité d'obtenir un plein écran "propre" via OpenScreen() mais juste un plein écran "déguisé" avec OpenWinScreen().

Là encore, tout est question de gourmandise en ressources. Si ton ordi est rapide, "windowed" ou "fullscreen", c'est pareil.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

Merci pour ta réponse.
Je suis en train de positionner mon menu et un rollhover au dessus pour faire joli (je viens de faire le 1er c'est propre).
Je redimensionnerai les Sprites en boucle vu que je stock les tailles en structure, ça devrait le faire.
Par contre je retrouve ce p...tain de lag de la souris RAT5.. Faudra que j'ajoute l'astuce vu dans de précédents sujets concernant ce prob. C'est vraiment chiant.
Si y'a aucun soucis dans aucun jeu, il doit y avoir tout de même quelque chose qui chie avec PB de ce coté.

Petit aperçu de l'evolution graphique de la chose et du 1er rollhover du menu :)
http://stock.ldvmultimedia.com/bjack.gif
~~~~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
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: Idée pour gestion de cartes

Message par Micheao »

c'est de la bombe ton jeu tu es doué
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

Pour le moment c'est pas grand chose mais merci ;)
~~~~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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Idée pour gestion de cartes

Message par Ar-S »

---- j'annule mon dernier bug, je suis débile -----
je l'éditerai au prochain soucis.
~~~~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
Répondre