Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comment créer une liste d'images


Sujet :

Lazarus Pascal

  1. #21
    Futur Membre du Club
    Comment créer une liste d'images
    Citation Envoyé par BeanzMaster Voir le message
    Bonsoir,

    J'ai du mal à comprendre ta logique avec tous ces TImages et cette liste basée dessus. Pourrais tu nous faire un petit zip des sources de ton projet avec le fichier "card.res" pour que l'on puisse y jeter un oeil, tester et t'aider du mieux possible.
    J'ai l'impression que ton approche n'est pas la plus facile à mettre en place, j'ai l'impression que tu te complique la vie.

    Une petit plus serait également de nous décrire les règles de jeux de ton solitaire.

    A+

    Jérôme

    Bonjour Jérôme,

    Le but de ce programme n'est pas de créer un FreeCell puisque je l'ai déjà écrit en Delphi7 et il fonctionne très bien. Le but est plutôt de me familiariser avec Lazarus. En essayant de le transcrire dans ce langage je suis tombé sur le problème de la création des listes et comme je n'aime pas abandonner j'ai créé ce groupe de discussion.
    Voici en simplifié, les règles du jeu du FreeCell:
    Le tapis est composé de trois parties:
    La partie inférieure est composée de 8 cases (ce sont les images de 1 à 8).
    Au démarrage du jeu les 52 cartes sont distribuées sur ces 8 images, il y a donc 4 images avec 7 cartes et 4 images avec 6 cartes. Les cartes sont décalées pour qu'elles soient toutes visibles.
    La partie supérieure est divisée en deux parties:
    A gauche 4 Images ne pouvant accueillir qu'une seule image à la fois, elles servent à dégager les cartes gênantes.
    A droite 4 Images destinées à recevoir les cartes de la même couleur dans l'ordre. Par exemple: sur la première case les cœurs en commençant par l'as puis 2 jusqu'au roi. Seule la dernière carte déposée est visible (pas de décalage). Le jeu est terminé et réussi lorsque toutes les 4 cases affichent un roi, toutes les autres cases sont alors vides.
    N'importe quelle carte peut être déposée sur les 4 cases en haut à gauche.
    Pour déplacer une carte d'une des 8 images du bas il faut que celle-ci soit de valeur directement inférieure et de couleur différente à celle sur laquelle on la dépose.
    (ex:un 7 de cœur peu être déposé sur un 8 de pique...)
    Il est même possible de déplacer un groupe de cartes si celui-ci est ordonné (ordre croissant et couleurs alternées, s'il y a des cases de libre en haut à gauche ou en bas).
    Pour réussir il faut donc:
    essayer de libérer les as pour commencer, sans encombrer toutes les cases en haut à gauche.
    De jongler en déplaçant les cartes du bas pour caser les 2, 3...jusqu'au roi.

    Pour ce qui concerne mon programme :
    chaque carte est un Record qui contient le nom du fichier inclus dans Cartes.res (ex:C011.bmp pour le roi de cœur) et un booléen pour l'affichage en vidéoinverse.
    Les cartes affichées dans l'Image1 (première image du bas) forment Liste1, les cartes déposées sur l'Image16 (dernière image en haut à droite) forment Liste16.
    Liste0 sera formée par les cartes en cours de déplacement.
    Liste est composée des 17 listes d'index 0 à 16.
    ListIm est une liste contenant les 17 images (Image0 n'est pas utiliée)
    Pour déplacer une carte, je clique sur la carte à déplacer et j'en déduis par son index l'Image_s source et la Liste_s source puis je clique sur l'Image de destination, j'ai alors l'Image_d et Liste_d, il me reste alors à comparer la carte source à la dernière carte de la liste de destination.
    L'intérêt des listes est multiple dans ce programme:
    - je place à l'index 0 des listes de cartes une carte factice indiquant les emplacements où cliquer
    -j'affiche ensuite automatiquement ces cartes en utilisant la liste des images...etc le tout sans clic.

    J'espère que ma démarche pour la conception de ce programme est un peu plus claire!
    Quant au zip de mon source, je veux bien l'envoyer mais je ne sais comment, je ne maîtrise pas assez ce moyen de correspondance.

    A+
    JC

  2. #22
    Membre expert
    Salut JC

    Citation Envoyé par vieuxprof1 Voir le message
    Bonjour Jérôme,

    Le but de ce programme n'est pas de créer un FreeCell puisque je l'ai déjà écrit en Delphi7 et il fonctionne très bien. Le but est plutôt de me familiariser avec Lazarus. En essayant de le transcrire dans ce langage je suis tombé sur le problème de la création des listes et comme je n'aime pas abandonner j'ai créé ce groupe de discussion.
    Alors autant en profiter pour l'améliorer

    Citation Envoyé par vieuxprof1 Voir le message

    Pour ce qui concerne mon programme :
    chaque carte est un Record qui contient le nom du fichier inclus dans Cartes.res (ex:C011.bmp pour le roi de cœur) et un booléen pour l'affichage en vidéoinverse.
    .....
    merci de ces explications, c'est un peu plus claire, une seule chose pourquoi vouloir mettre tes "Timage" dans tes listes alors que tu as tes "record" ? je ne comprend pas cette logique
    car tes événements de souris sont traités par tes "TImage" donc tu connait forcément la source ou et la destination de tes cartes. Donc si je comprend bien tu veux copier le PICTURE.BITMAP du TImage source et remplacer le PICTURE.BITMAP du Timage cible, c'est bien ça ? Je suppose également que tes Timages on tous les mêmes dimensions, non ?

    Donc, si j'ai bien tout compris. Pour ma part, à l'arrache( il y a peut-être quelques erreurs de frappes) pour gérer les cartes comme tu le souhaites, je ferai quelque chose comme ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    Interface
     
    Const
      cNomResourceCartes : Array[0..3] of Array[1..13] of String = (
                        ('CC001', 'CC002', ..., 'CC013'), // Cartes de coeur
                        ('CR001', 'CR002', ..., 'CR013'), // Cartes de carreaux
                        ('CT001', 'CT002', ..., 'CT013'), // Cartes de trefle
                        ('CP001', 'CP002', ..., 'CP013') ); // Cartes de pique
     
    Type
     
      TCouleurCarte = (ccCoeur, ccCarreau, ccTrefle, ccPique);
      TCarte = record
        Couleur : TCouleurCarte;
        ImageIndex : Byte;    
        Visible : Boolean;  
      end;
      PCarte = ^TCarte;
     
      //je ferai peut-être aussi une liste centralisée des "pointeurs" 
      //TListeCartes : Array[1..52] of PCarte; 
      //ou comme ceci TListeCartes : Array[TCouleurCarte] of array[1..13] of PCarte 
      // et la le "Couleur : TCouleurCarte;" dans le record pourrait-être supprimé et je mettrai un "ImageCarte : TBitmap" à la place
      // ce qui nous affranchirai du tableau ci-dessous
     
      TImageCartes = array[TCouleurCarte] of [1..13] of TBitmap;
     
     
      function RecupereImageCarte(Couleur : TCouleurCarte; ImageIndex : Byte) : TBitmap;
      function CreerCarte(Couleur : TCouleurCarte; ImageIndex : Byte; EstVisible : Boolean : PCarte;
     
      function AjouteCarteDansListe(Liste : TList; UneCarte : PCarte) : Integer;
      function PiocheDerniereCarteDansListe(Liste : TList) : PCarte;
      procedure EffaceDerniereCarteDansListe(Liste : TList);
      procedure DetruitListe(Liste : TList);
     
      procedure TransfertImageCarteVersTImage(UnTImage : TImage; CarteImage : TBitmap);
     
      procedure InitListeDeCartes;
      procedure DetruitListeDeCartes;
     
    Var
      Cartes : TImageCartes;
      ListeDeCarte : TList;
     
    implementation  
     
      function CreerCarte(Couleur : TCouleurCarte; ImageIndex : Byte; EstVisible : Boolean : PCarte;
      Var
        NouvelleCarte : PCarte;
      begin
        new(NouvelleCarte);
        NouvelleCarte^.Couleur := Couleur; 
        NouvelleCarte^.ImageIndex := ImageIndex;
        NouvelleCarte^.Visible := EstVisible;
        Result := NouvelleCarte;
      end;
     
      function RecupereImageCarte(Couleur : TCouleurCarte; ImageIndex : Byte) : TBitmap;
      begin
         Result := Carte[Couleur][ImageIndex];
      end;
     
      function AjouteCarteDansListe(Liste : TList; UneCarte : PCarte) : Integer;
      begin
         Result := List.add(UneCarte);
      end;
     
      function PiocheDerniereCarteDansListe(Liste : TList) : PCarte;
      begin
         Result := Liste.Items[(Liste.Count - 1)]
      end;
     
      procedure EffaceDerniereCarteDansListe(Liste : TList);
      var
        p : PCarte;
        idx : Integer;
      begin
         idx := Liste.Count - 1;
         p := Liste.Items[idx];
         Liste.Delete(idx);
         // Dispose(p); // ici on ne supprime pas le pointeur car il va être déplacer dans une autre liste on retire juste la référence dans la liste
      end;
     
      procedure DetruitListe(Liste : TList);
      var
        i : Integer;
        p : PCarte;
      begin
     
        for i := (Liste.Count - 1) downto 0 do  // ici on pourrais utiliser une boucle while avec la methode EffaceDerniereCarteDansListe
        begin
           p := List.items[i]; 
           List.Delete(i);
           Dispose(p);
         end;
         FreeAndNil(List);
      end;
     
      procedure TransfertImageCarteVersTImage(UnTImage : TImage; CarteImage : TBitmap);
      begin
         UnTImage.Canvas.Draw(0,0,CarteImage);
      end;
     
      procedure InitListeDeCartes;
      var
        i, j : Integer;
      begin
        for i := 0 to 3 do 
        begin
          for j := 1 to 13 do
          begin
             Cartes[TCouleurCarte(i)][j] := TBitmap.Create;
             Cartes[TCouleurCarte(i)][j].LoadFromResourceName(HInstance, cNomResourceCartes[i][j]);
          end;
        end;
      end;
     
      procedure DetruitListeDeCartes;
      var
        i, j : Integer;
      begin
        for i := 0 to 3 do 
        begin
          for j := 13 downto 1 do
          begin
             FreeAndNil(Cartes[TCouleurCarte(i)][j])
          end;
        end;
      end;



    Voila te restes plus qu'a utiliser les différentes méthodes pour gérer tes règles et comportements

    Citation Envoyé par vieuxprof1 Voir le message

    J'espère que ma démarche pour la conception de ce programme est un peu plus claire!
    Quant au zip de mon source, je veux bien l'envoyer mais je ne sais comment, je ne maîtrise pas assez ce moyen de correspondance.

    A+
    JC
    Il suffit de cliquer sur l'icone en forme de trombone et d'aller chercher ton fichier sur ton disque

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #23
    Membre expert
    Allez pour la route il te suffirait dans le "OnClick" de tes TImage en définissant la propriété "Tag" au préalable, qui correspondrait au numéro de tes listes.

    De faire quelque chose comme ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    Type
        TForm1 = Class(TForm)
            Image1 : TImage;
            Image2 : TImage;
            //...
            Image16 : TImage;
     
            procedure ImageClick(Sender : TObject); // une seule méthode pour TOUS les "TImage"
        protected
            FSelectionCarte : PCarte;
            FPick : Boolean;
            FPickListNumero : Integer;
            FPickImage :TImage;
     
            Listes : Array[1..16] of TList;
     
            procedure DeplaceCarte(DeListeNumero, VersListeNumero :  Byte);
     
        public
        end;
     
    interface
     
      procedure TForm1.DeplaceCarte(DeListeNumero, VersListeNumero :  Byte);
      begin
         FSelectionCarte := PiocheDerniereCarteDansListe(Listes[DeListeNumero]);
         EffaceDerniereCarteDansListe(Listes[DeListeNumero]);
         AjouteCarteDansListe(Listes[VersListeNumero],FSelectionCarte); 
      end;
     
      procedure TForm1.ImageClick(Sender : TObject);
      Var 
        Img : TImage;
        TempCarte : PCarte;
      begin
         Img := TImage(Sender);
         if not(FPick) then
         begin
           FPickListNumero := Img.Tag;
           FPickImage := Img;
           FPick := True;
         end
         else
         begin
            DeplaceCarte(FPickListNumero, Img.Tag);
            TransfertImageCarteVersTImage(Img, RecupereImageCarte(FSelectionCarte^.Couleur, FSelectionCarte^.ImageIndex));
     
            if Listes[FPickListNumero].Count > 0 then
            begin
              TmpCarte :=PiocheDerniereCarteDansListe(Listes[FPickListNumero]);
              TransfertImageCarteVersTImage(FPickImage, RecupereImageCarte(TmpCarte^.Couleur, TmpCarte^.ImageIndex));
            end
            else  AfficheCarteVersoDansTImage(FPickImage);
     
            FClick := False;
         end;
      end;


    Note que dans le code du précédent message il faudrait rajouter des contrôles dans le genre if Listes[FPickListNumero].Count > 0 then dans "PiocheDerniereCarteDansListe" et dans "EffaceDerniereCarteDansListe" pour éviter des erreurs en cas de clic sur un TImage dont la liste de carte serait vide.

    Du coup je me suis pris au jeu

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #24
    Membre actif
    Salut,
    j'ai trouvé une série de sources Lazarus sur des jeux de cartes et en plus en français. Daniel Botton utilise une autre technique pour afficher les cartes . A étudier ...
    Les sources se trouvent ici : Jeux de cartes




    Nullosse

  5. #25
    Futur Membre du Club
    Citation Envoyé par Nullosse Voir le message

    Bonjour Nullosse,

    Merci pour ta réponse, ma motivation principale n'est pas de créer ce FreeCell mais surtout d'approfondir ma pratique de Lazarus et le maniement des listes dans ce langage.
    J'aimerais apprendre à:
    -créer une liste quelconque:d'Images, de Panels, de string, de Records, de listes etc...
    -d'ajouter ou supprimer un élément de la liste,
    -de lire un élément de la liste et de modifier une propriété de cet élément
    -enfin apprendre à manipuler les listes d'une manière générale

    Cordialement

    JC

    Citation Envoyé par BeanzMaster Voir le message

    Bonjour Jérôme,

    Merci pour vos réponses, je vais mettre un certain temps pour analyser votre solution et comprendre le fonctionnement des procédures. Je rappelle que je ne suis qu'un amateur qui essaye encore à 75 ans à apprendre des choses.
    Dans ma procédure OnClick sur une image j'ai moi aussi utilisé la propriété Tag qui a la même valeur que le numéro de l'image cliquée. Ce Tag est aussi l'index dans la liste des listes qui me permet de récupérer les cartes affichées dans cette image.
    D'autre part, je dois aussi pouvoir déplacer un groupe de cartes d'une image sur une autre, je ne sais pas si cette possibilité existe dans votre solution.
    En attendant je mets en pièces jointes mon exécutable FreeCell écrit en Delphi pour clarifier encore le débat.

    Cordialement
    JC

  6. #26
    Membre éclairé
    Citation Envoyé par vieuxprof1 Voir le message
    ... à 75 ans ... ]
    A six mois près, je vous suis .

    Cordialement.

    Pierre.

  7. #27
    Membre expert
    Bonsoir à tous les deux et chapeau bas messieurs

    Je me suis prêté au jeu de relever ce défi. Cela m'a changé du traitement d'images.

    Bref voilà je suis parti en gros sur la méthode que j'ai exposée hier.

    J'ai commenté le code source et ai nommé toutes les méthodes en français, pour que cela soit plus facile à comprendre.

    Il ne restera plus qu'une chose implémenter, la méthode pour déplacer plusieurs cartes. C'est facilement faisable en introduisant une méthode et versification supplémentaire dans l'évènement onclick des TImages pour savoir où on clique et en déduire le nombre de cartes à déplacer.



    Si tu as des questions JC et si tu veux plus d'explications sur une partie du code n'hésite pas.

    Bonne soirée


    EDIT : Les images des cartes proviennent de opengameart
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #28
    Membre expert
    Petite erreur dans le code

    il faut changer la méthode function TMainForm.ValidationCarteSurTasDeCarte(IndexListe : Integer; CarteADeposer : PCarte) : Boolean;

    par

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    function TMainForm.ValidationCarteSurTasDeCarte(IndexListe : Integer; CarteADeposer : PCarte) : Boolean;
    Var
      Carte : PCarte;
      Liste : TList;
    begin
      Result := False;
      Liste := RetourneListeSuivantIndex(IndexListe);
     
      if Liste.Count < 1 then Exit(true); //------> Ligne à ajouter
     
      Carte := Liste.Items[(Liste.Count - 1)]; // On recupere la derniere carte
      Case Carte^.Couleur of
        ccCoeur, ccCarreau : Result := (CarteADeposer^.Couleur = ccPique) or (CarteADeposer^.Couleur = ccTrefle);
        ccPique, ccTrefle : Result := (CarteADeposer^.Couleur = ccCoeur) or (CarteADeposer^.Couleur = ccCarreau);
      end;
      if Result then
      begin
        Result := Result and (Carte^.Valeur > CarteADeposer^.Valeur);
      end;
    end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #29
    Membre actif
    Salut,
    BeanzMaster, joli travail ! As-tu essayé ton projet sous linux ? Sous centos 8 , Lazarus 2.0.8 les cartes apparaissent toutes en noir chez moi . Un souci de configuration chez moi ?



    Nullosse

  10. #30
    Futur Membre du Club
    Comment créer une liste d'images
    Citation Envoyé par BeanzMaster Voir le message
    Petite erreur dans le code

    il faut changer la méthode function TMainForm.ValidationCarteSurTasDeCarte(IndexListe : Integer; CarteADeposer : PCarte) : Boolean;

    par

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    function TMainForm.ValidationCarteSurTasDeCarte(IndexListe : Integer; CarteADeposer : PCarte) : Boolean;
    Var
      Carte : PCarte;
      Liste : TList;
    begin
      Result := False;
      Liste := RetourneListeSuivantIndex(IndexListe);
     
      if Liste.Count < 1 then Exit(true); //------> Ligne à ajouter
     
      Carte := Liste.Items[(Liste.Count - 1)]; // On recupere la derniere carte
      Case Carte^.Couleur of
        ccCoeur, ccCarreau : Result := (CarteADeposer^.Couleur = ccPique) or (CarteADeposer^.Couleur = ccTrefle);
        ccPique, ccTrefle : Result := (CarteADeposer^.Couleur = ccCoeur) or (CarteADeposer^.Couleur = ccCarreau);
      end;
      if Result then
      begin
        Result := Result and (Carte^.Valeur > CarteADeposer^.Valeur);
      end;
    end;
    Bonjour Jérôme,

    Après une pause pour fêter le déconfinement, les affaires reprennent.
    Je n'ai pas encore étudié votre programme, je m'y attelle aujourd'hui, mais je ne résiste pas à l'envie de vous envoyer le source du FreeCell en Delphi.
    Je demande simplement de l'indulgence pour ma manière de programmer mais toutes les critiques seront les bienvenues.
    A+
    JC

  11. #31
    Membre expert
    Citation Envoyé par Nullosse Voir le message
    Salut,
    BeanzMaster, joli travail ! As-tu essayé ton projet sous linux ? Sous centos 8 , Lazarus 2.0.8 les cartes apparaissent toutes en noir chez moi . Un souci de configuration chez moi ?



    Nullosse
    Salut à tous

    D'abord merci Je viens testé chez moi, sous Manjaro et Lazarus 2.0.8 même combat C'est ce genre de trucs bien pourris qui m'a convaincu de coder ma propre solution pour les bitmap (BZScene. Note : ne fonctionne pas encore totalement sous linux, il faut que j'upload la 1ere mise à jour ).

    Sous linux si tu reste avec des bitmap 24 bit pas de soucis, mais dès lors que tu joue avec des bitmaps 32 bit c'est une vrai m......

    Compile on Windows, crash on Linux !!!!
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #32
    Membre actif
    Salut,
    Citation Envoyé par BeanzMaster Voir le message
    Salut à tous
    Sous linux si tu reste avec des bitmap 24 bit pas de soucis, mais dès lors que tu joue avec des bitmaps 32 bit c'est une vrai m......
    Effectivement si je remplace dans le programme les pf32bit par des pf24bit cela fonctionne sous linux et en plus la partie :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
      // NE FONCTIONNE PAS CHEZ MOI ?????????????? ENCORE UNE TRUC BIEN POURRI DE LA GESTION DES BITMAPS AVEC LAZARUS
              Img.Canvas.CopyMode := cmNotSrcCopy;
              Img.Canvas.Draw(0, Decalage + 50, Carte^.Image);
              Img.Canvas.CopyMode := cmSrcCopy;

    fonctionne aussi. Plus besoin du NegateBitmap



    Nullosse

  13. #33
    Expert éminent sénior
    Salut,

    je m'immisce pour un détail qui me chiffonne visuellement, concernant ce FreeCell :



    la zone que j'ai sélectionnée avec The Gimp mesure 14 pixels de large quand les 3 zones à gauche et les 2 premières à droite ne mesurent que 10 px.
    Quant à la dernière zone à droite, elle tombe à 8.

    Je vous laisse gérer et je m'en vais sur la pointe des pieds,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #34
    Membre expert
    Citation Envoyé par Jipété Voir le message
    Salut,

    je m'immisce pour un détail qui me chiffonne visuellement, concernant ce FreeCell :



    la zone que j'ai sélectionnée avec The Gimp mesure 14 pixels de large quand les 3 zones à gauche et les 2 premières à droite ne mesurent que 10 px.
    Quant à la dernière zone à droite, elle tombe à 8.

    Je vous laisse gérer et je m'en vais sur la pointe des pieds,
    Salut tu chipotes , j'ai pas calculé les marges pour un centrage parfait, j'ai placé les TImage à l'oeil
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  15. #35
    Futur Membre du Club
    Citation Envoyé par BeanzMaster Voir le message
    Salut tu chipotes , j'ai pas calculé les marges pour un centrage parfait, j'ai placé les TImage à l'oeil
    Bonjour Jérôme,

    Bravo pour la réalisation de ce programme, on voit la patte du professionnel, et avec quelle rapidité... chapeau ! Ce programme est une mine pour moi, il contient plein de nouveautés, il suffit que je prenne le temps d'en étudier chaque ligne.
    Je constate quand même que vous avez éludé le problème des listes de Timage et de la liste de listes par l'utilisation des tableaux !
    Sinon à l'exécution j'ai constaté quelques bogues :
    j'ai réussi à gagner alors qu'il restait un 2 de cœur en rab
    j'ai aussi réussi à déplacer un 4 rouge sur un 6 noir
    La règle du FreeCell interdit de reprendre une carte des tas en haut à droite. L' idée est néanmoins à retenir, elle peut permettre de créer un FreeCell facile et un difficile.
    Quant aux questions, j'en ai trop à poser :
    comment avez vous créé le fichier *.lfm est-ce qu'il se crée comme les fichiers .res ?
    Quelle différence y a-t-il entre un record et un packed record
    quel est l'intérêt de mettre certaines méthodes dans Public ou Private,
    je retiens la façon de mettre un bitmap en vidéo inverse et d'inclure une fonction à l'intérieur d'une procédure
    etc...
    Est-ce que vous avez regardé le source de mon FreeCell sous Delphi ? Vous verrez la différence de programmation entre un pro et un bricoleur !
    Je suis aussi un amateur de Sudoku. J'en ai créé un sous Delphi et sous Lazarus mais en Linux. Je vous envoie en pièce jointe l'exécutable sous Delphi car il es accompagné d'un fichier d'aide.

    A+
    JC

  16. #36
    Membre expert
    Bonjour JC
    Citation Envoyé par vieuxprof1 Voir le message
    Bonjour Jérôme,

    Bravo pour la réalisation de ce programme, on voit la patte du professionnel, et avec quelle rapidité... chapeau ! Ce programme est une mine pour moi, il contient plein de nouveautés, il suffit que je prenne le temps d'en étudier chaque ligne.
    Loin d'être un pro, j'ai commencé à programmer en pascal entre vers 14/16 ans, et je suis encore un jeunot avec mes 43 balais

    Citation Envoyé par vieuxprof1 Voir le message

    Je constate quand même que vous avez éludé le problème des listes de Timage et de la liste de listes par l'utilisation des tableaux !
    ....
    Est-ce que vous avez regardé le source de mon FreeCell sous Delphi ?
    Oui, c'est le plus simple, utiliser des TList pour ça n'a pas beaucoup d'intérêt et cela simplifie les interractions.
    J'ai regardé tes sources Delphi 7, comme je le pensais tu t'es compliqué la vie. Je comprend pourquoi tu as des difficultés à le passer sous Lazarus.
    Le gros hic vient que les TImage/TBitmap ne fonctionnent pas tout à fait de la même manière sous Lazarus.

    Citation Envoyé par vieuxprof1 Voir le message

    Sinon à l'exécution j'ai constaté quelques bogues :
    j'ai réussi à gagner alors qu'il restait un 2 de cœur en rab
    j'ai aussi réussi à déplacer un 4 rouge sur un 6 noir
    La règle du FreeCell interdit de reprendre une carte des tas en haut à droite. L' idée est néanmoins à retenir, elle peut permettre de créer un FreeCell facile et un difficile.
    Oui effectivement, j'ai relevé aussi quelques erreurs (par exemple on peux mettre un 9 de coeur sur un valet de pique) par rapport aux règles. Il faut modifier les méthodes de validations et le "imageclick" pour les corriger

    J'ai fait quelques améliorations dans ce sens et j'ai aussi ajouté la possibilité de déplacer plusieurs cartes à la fois. Je posterai les sources après un petit nettoyage


    Citation Envoyé par vieuxprof1 Voir le message

    Quant aux questions, j'en ai trop à poser :
    comment avez vous créé le fichier *.lfm est-ce qu'il se crée comme les fichiers .res ?
    Le fichier lfm et res sont automatiquement créé par Lazarus. Le lfm c'est comme le dfm sous Delphi. Un fichier texte qui décrit la "form"

    Citation Envoyé par vieuxprof1 Voir le message

    Quelle différence y a-t-il entre un record et un packed record
    La packed record pour rester simple "Packed" sera compressé et on pourra le forcé à s'aligné en mémoire sur un nombre de bit voulu, mais c'est une autre histoire.
    Pour plus d'infos retrouves les tutoriels de Gilles sur le sujet des enregistrements 1 et 2
    Citation Envoyé par vieuxprof1 Voir le message

    quel est l'intérêt de mettre certaines méthodes dans Public ou Private,
    C'est une question de hiérarchie dans les objets, si tu as un objet B qui hérite d'un objet A. L'objet B n'aura pas accès au méthodes "Private" de l'objet A.

    Je te conseil de lire les excellent tutoriels de Gilles sur la POO : Les notions fondamentales puis la serie des POO à gogo 1 - 2 - 3 et 4


    Dans les "Form" je mets très souvent les méthodes qui servent au fonctionnement interne dans "Private" ou "Protected" et je met dans "Public" les méthodes qui seront utilisés directement par l'utilisateur comme ici "NouveauJeu"

    Citation Envoyé par vieuxprof1 Voir le message

    je retiens la façon de mettre un bitmap en vidéo inverse et d'inclure une fonction à l'intérieur d'une procédure
    etc...
    Attention pour la méthode "Video inverse" elle très empirique et comme je le disais le graphisme avec Lazarus n'est pas aussi simple qu'avec Delphi.
    Puis il y a aussi l'utilisation des type énumérés.

    Retrouves également ici plus de cours pour Lazarus et le langage pascal
    N'hésites pas allez faire également un tour dans les rubriques FAQ et Sources, les liens sont en haut de la page

    Citation Envoyé par vieuxprof1 Voir le message

    Je suis aussi un amateur de Sudoku. J'en ai créé un sous Delphi et sous Lazarus mais en Linux. Je vous envoie en pièce jointe l'exécutable sous Delphi car il es accompagné d'un fichier d'aide.

    A+
    JC
    Merci

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  17. #37
    Expert confirmé
    hello,
    moi aussi je viens apporter mon petit grain de sel
    Pourquoi ne pas utiliser le drag & drop pour déplacer les cartes. Avec le TDragObject on peut faire un déplacement graphique.




    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  18. #38
    Futur Membre du Club
    comment créer une liste d'images
    Salut,

    Le but de la transcription de mes programmes de Delphi en Lazarus est justement le Drag and Drop...

    Amicalement

    JC

  19. #39
    Futur Membre du Club
    Comment créer une liste d'images
    Bonjour,

    Je reste sur ma faim pour ce qui concerne la gestion des listes d'images et listes de listes. J'ai néanmoins appris à m'en passer en utilisant des tableaux à la place.
    Je remercie tous ceux qui ont bien voulu participer à cette discussion, en particulier Jérôme, Pierre, Jipété, Nullosse... et qui y ont consacré du temps.
    Si d'ici demain soir personne n'y a rajouté de commentaire je déclarerai la discussion close.

    Cordialement
    JC

  20. #40
    Membre extrêmement actif
    Nous feras-tu le plaisir de nous permettre d'utiliser et d'étudier ton jeu ?
    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...