Objekte vergleichen



  • Zurzeit versuche ich mich an einem Programm (soll ziemlich umfassend werden), das zum schnelleren Ablauf eines DSA kampfes führen soll. Da DSA (das schwarze Auge) ein sehr erweiterbares Pen and Paper Rollenspiel ist möchte ich auch mein Programm möglichst erweiterbar gestalten.

    Nun bin ich an dem Teil dass ich eine Klasse für Ruestungen machen will. Eine Rüstung hat in DSA nur einen RS (Rüstungswert) einen BE (Behinderungswert) und eine Zone an welcher diese Rüstung befestigt ist. Laut den DSA Basisregeln gibt es optional wer den Kampf wirklich ausreizen und möglichst realistisch gestalten will die Regel mit den Trefferzonen. Es sind dort folgende Trefferzonen beschrieben für einen Menschen: Kopf, Brust, Arm, Fuß, Bauch. So für den Anfang genügt mir das aber ich möchte später vielleicht noch die Trefferzone Hand oder Schulter dazu.

    Programmiertechnisch hab ich mir zuerst gedacht mit einem enum. Jedoch ist dieser Typ nicht wirklich erweiterbar. Deshalb hab ich mir gedacht mit Klassen, nämlich dass alle Zonen (Arm, Bauch, usw.) von der Klasse Zone erben und ich somit wenn die Rüstung aus mehreren Teilen besteht einen vector aus verschiedenen Zonen erstellen kann (Arm, Bauch, usw. die von Zone erben)

    Pseudocode dazu:

    class Zone
    {
    };
    
    class Arm : public Zone
    {
    
    };
    
    class Kopf : public Zone
    {
    
    };
    
    class Ruestung
    {
         private:
              vector <Zone *> *zonen;
    
         public:
            Ruestung()
            {
            }
    
    usw.
    }
    

    Nun möchte ich aber weiters vergleichen ob ich wenn ich dem Gegner auf den Helm haue er auch wirklich einen Helm hat.

    Das heißt der Gegner hat ein Attribut Ruestung und ich möchte mit einer for Schleife erörtern ob die Zone Kopf überhaupt bei seiner Ruestung inkludiert ist oder ob ich ihm nicht seinen Kopf spalte 🤡

    Kann ich irgendwie Objekte vergleichen ob sie der gleiche Typ sind. z.B.: ob in dem vector zonen von der Rüstung der Arm geschützt ist.

    Pseudocode:

    for(int i = 0; i < zonen->size(); i++)
    {
        if(zonen->at(i) == Kopf //wie vergleichen, == geht nicht, oder geht das überhaupt
    }
    


  • Ja, mit typeid. Aber meistens ist das kein gutes Design...



  • Kopf, Arm und Bauch haben aber keine Methoden mit unterschiedlichem Code, also ist das Aufbrechen in unterschiedliche Klassen übertrieben.



  • asdasdasd schrieb:

    Ja, mit typeid. Aber meistens ist das kein gutes Design...

    Damit das etwas konstruktiver ist:

    Wenn du es dir einfacher machen willst, dann mach es so:

    class Zone
    {
     virtual void hit() = 0;
    };
    
    class Kopf : public Zone
    {
     virtual void hit()
     {
      std::cout << "AUA!\n";
     }
    };
    
    class GibtsNet : public Zone
    {
     virtual void hit() { } // Nichts, gibts nicht!
    };
    


  • asdasdasd schrieb:

    Ja, mit typeid. Aber meistens ist das kein gutes Design...

    Warum ist das so schlecht? Bringt das manchmal Probleme mit sich?

    asdasdasd schrieb:

    Damit das etwas konstruktiver ist:

    Wenn du es dir einfacher machen willst, dann mach es so:

    class Zone
    {
     virtual void hit() = 0;
    };
    
    class Kopf : public Zone
    {
     virtual void hit()
     {
      std::cout << "AUA!\n";
     }
    };
    
    class GibtsNet : public Zone
    {
     virtual void hit() { } // Nichts, gibts nicht!
    };
    

    Das sieht mir nach einer halbwegs passablen Lösung aus. Danke 🙂 Aber bin noch immer auf neue Vorschläge gespannt. Außer das Arsenal ist erschöpft, dann kann der Thread geschlossen werden.



  • reuabreliza schrieb:

    asdasdasd schrieb:

    Ja, mit typeid. Aber meistens ist das kein gutes Design...

    Warum ist das so schlecht? Bringt das manchmal Probleme mit sich?

    Solch ein Design ist nur schwer und mühselig erweiterbar. Stell dir vor, du willst neue Subklassen hinzufügen. Nun mußt du alle Stellen im Code ändern, die per TypeId eine Aktion / Signal für die neue Subklasse auslösen müssen, ändern. So etwas ist sehr fehleranfällig und im OOP auch unnötig.

    Gruß Kimmi



  • Hier dürfte enum angebracht sein.

    Jedoch ist dieser Typ nicht wirklich erweiterbar

    Wie kommst du darauf?

    enum Zone {Arm,Kopf,...};
    class Ruestung
    {
       private:
         vector<Zone> zonen; 
    [...]
    
    for(int i = 0; i < zonen.size(); i++)
    {
        if (zonen.at(i) == Kopf)...;
    }
    


  • Das ist mir klar. Ich hätte die erweiterung eher so gemeint. Fuß, Hand, Auge, Herz, Nase usw. , aber trotzdem danke.


Anmelden zum Antworten