[Speicherverwaltung] Kartenspiel



  • Hallo ich möchte gerne MauMau und Knack realisieren. Ich habe entsprechend ein 52er Deck in einer Resource gepackt und suche eine Speicherverwaltung, ich bräuchte die Position des Bildes in der Resource bsp. ID 1-52, den Wert der Karte (2-11) und den Namen (Caro 2 - Kreuz Ass).
    Wie realisiert ma soetwas in C++, ich weis in Delphi gibt es records und in php verschachtelte Arrays aber in C++ ?

    Danke für die Unterstützung 🕶



  • Hallo

    In C/C++ gibts Klassen/Strukturen (entspricht Delphi-records) und Arrays auf Arrays/Klassen/Strukturen (das was du vermutlich mit verschachtelt meinst). Dabei braucht du nicht mal ein dynamisches Array, ein einfaches C-Array mit 52 festen Elementen reicht aus.

    Anstelle der Ressourcen würde ich dir die VCL-eigene TImageList empfehlen, das läßt sich sowohl zur Entwurfszeit als auch zur Laufzeit einfacher und direkter benutzen.
    Um trotzdem Ressourcen zu laden siehe TBitmap::LoadFromRessource.

    bis bald
    akari



  • Vielen Dank

    Strukturen hört sich interessant an möglicherweise werde ich es damit umsetzen aber erstmal forschen wie es funktioniert 😉
    Wie man Resourcen lädt ist kein Problem habe ich schon fertig mit ID, mit TImageList habe ich noch nie etwas gemacht, aber eben gesehn das man damit nur .ico und .bmp laden kann (Borland 6), ich habe die Karten aus der cards.dll von Windows entnommen und sie in einer Resourcedatei gepackt da ich 1. die Bilder versteckt haben möchte und 2. noch keinen Nachteil von Resourcen kenne :p
    Mit Klassen und Pointer kenne ich mich noch nicht sehr gut aus und möchte erstmal ohne auskommen, ein einfaches C-Array reicht eben nicht wenn ich mehr als nur eine Information benötige.

    mfg



  • Hallo

    Strukturen sind im Grunde das gleiche wie Klassen, wobei Strukturen gewohnheitsmäßig eher für reine Datensammlungen genommen werden, Klassen hingegen für komplexe Zusammensetzungen aus Attributen, Methoden und Operatoren.
    Der einzige echte effektive Unterschied ist aber nur die Standard-Sichtbarkeit der Member (Strukturen : public, Klassen : private)

    Ressourcen an sich haben keine Nachteile, eine TImageList hat den Vorteil das es sich besser in die Klassenstruktur der VCL einbindet.
    Da du aber schon alles in einer fertigen DLL hast, lohnt sich der Umbau wohl nicht.

    Klar reicht ein einfaches C-Array aus. Natürlich kein Array auf ein simplen Datentyp wie int, sondern eben auf deine Karten-Struktur

    struct MyCard
    {
      // ... einzelne Attrubute einer Karte
    };
    MyCard Cards[52];
    

    bis bald
    akari



  • Vielen herzlichen Dank akari

    Ich bin schon ziemlich weit gekommen bei den Grundlagen, d.h. ich kann die Karten durchschalten, Werte und Namen werdne zugeordnet mittels einer Struktur.
    Es läuft alles mit Ressourcen aber ich würde gerne wissen wie es mit der TImageListe aussieht, ich habe es auch ausprobiert, dabei fiel mir auf das die bilder total klein geworden sind. Also ich habe in die Liste 32 Karten eingeladen und dann mal Testweise eine geladen. In der Liste stehen Sachen wie "Dehnen", "Zentrieren" und "Strecken" das brauch ich doch garnicht, aber eine Option muss man wählen...
    Verwaltet diese Imagelist das intern auch wie Ressourcen oder muss man die Bilder mit im Projektordner speichern ?

    Danke für die Hilfe 🕶



  • Hi,
    Du kannst bei einer TImageList die Werte Width und Height so setzen, daß sie zu den Karten passen, dann verschwinden diese Optionen (dehnen, etc). Die Bilder müssen dann nicht noch einmal extra dabei liegen, sondern sie werden dann in die ausführbare Datei mit hineinkompiliert.
    Viele Grüße,
    Christian



  • Danke habs hinbekommen.

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    short int wert = 0;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      ImageList1->GetBitmap(wert,Image1->Picture->Bitmap);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Image1Click(TObject *Sender)
    {
      ImageList1->GetBitmap(++wert,Image1->Picture->Bitmap);
    }
    

    1. Ich habe 32 Spielkarten (149*225px) eingeladen
    2. Dieses Program auszuführen dauert bei meinem Rechner 20sek (kompilieren)
    3. Er macht nichts beim OnClick Ereignis

    Also bis jetzt ziemlich unkomfortabel 😞
    Der einzige Vorteil gegenüber der Resource ist das der startwert bei 0 beginnen darf und nicht bei 1.

    mfg



  • Er macht schon was, zeigt es aber nicht an ... Invalidate() nicht vergessen!



  • Ja ok aber angesichts des Zeitaufwandes sehe ich da kein Vorteil, zumal sowas wie Invalidate() bei den Ressourcen nicht beachtet werden muss, entweder integriert oder andere Technik ich schätze mal letzteres. Aber das ist ja nicht normal das das kompilieren so lange dauert...
    Ich bleib bei Resourcen.
    Danke für eure Hilfe



  • Hä??? 😕
    Wenn Du die Bilder aus Ressourcen (im Gegensatz zum Englischen im Deutschen übrigens mit zwei s 😉 ) lädst, brauchst Du genau so ein Invalidate() in Image1Click, sonst wird er die Anzeige auch nicht aktualisieren.
    Was genau für einen Zeitaufwand meinst Du? Doch nicht etwa die 20 Sekündchen kompilieren?

    Warum genau willst Du überhaupt sämtliche Karten zu Beginn nacheinander anzeigen lassen (die Sache mit dem MouseClick)? Und warum sind es nur noch 32? Am Anfang hattest Du noch von 52 gesprochen ...

    Fragen über Fragen ...



  • Es geht nur darum ein Vorteil für die Imagelist zu finden, daher habe ich ein wenig rumprobiert. Das 52er Deck liegt mir in einer Ressource vor genauer gesagt von der cards.dll
    Das 32 Deck habe ich ausm I-net geladen sie liegen in bmp-Format vor damit man sie der Imagelist zuweisen kann. Das ist doch wirklich viel speicheraufwand 32 bmp-karten in ein Programm zu kompilieren, ja die 20 Sekunden jedesmal beim ausführen sind schon nervig 😉
    Sagen wir so es ist kein vorteil 🙂
    Wenn die Imagelist jpg oder gif unterstützen könnte dann würde ich sie noch besser finden.
    Auch weil man hier ab dem Index "0" laden kann und somit unter Benutzung von Arrays nicht dauernd umrechnen muss.
    Ist jetzt auch nicht so dramatisch war reines ausprobieren 👍


Anmelden zum Antworten