Öffentliches RPG Projekt



  • cooky451 schrieb:

    Ich hoffe dir ist bewusst, dass das ganze Konzept was mit der stdafx.h einher geht kein Standard-C++ ist? (Da du ja eh #pragma once nutzt.. na ja, kann man auch später noch ändern wenn man will.)

    Dragon4411 schrieb:

    Ich habe mal ein Teil eurer Vorschläge umgesetzt:

    Nä, eher nicht. Immer noch einfach int genommen bei Dingen die float, unsigned oder u/intX_t sein sollten. Zudem keine Klasse für Rüstungen. std::string musst du nicht manuell initialisieren, das macht der schon selbst. Ein Parameterloser Konstruktor macht hier keinen Sinn, auch das wurde schon besprochen. Wenn keine Parameter erwartet werden reicht (), (void) ist in C++ unnötig. Zudem du das inkonsistent gemacht hast. In Zeile 13 steht übrigens Schildwert statt SchildWert, liest du deinen Code eigentlich noch mal durch, nachdem du ihn schreibst? Und seit wann ist ein Händler ein Monster? Und der Charakter? Und warum ist der Händler kein NPC? Und wozu hast du überhaupt eine Klasse NPC, wenn du QuestNPC dann wieder nur von Monster erben lässt? Und oh, du hast ja eine Klasse für Rüstungen. Warum zum Geier benutzt du sie dann nicht auch? Und bei der Quest Klasse erstellst du ein enum ID, aber anstatt das zu nutzen hast du noch 2 separate Variablen die den Queststatus speicher, ein string und ein int. Was denn jetzt. Argh. Dazu noch ein lehrer, nicht virtueller Destruktor - warte, der ist ja doch virtuell. Warum steht das dann nicht sofort da? Und deine Klasse "waffe" schreibst du jetzt plötzlich klein statt wie sonst alle Klassennamen groß, entscheide dich. (Was irgendwie den Verdacht verstärkt, dass du dir den Code nicht noch mal durchgelesen hast, das springt doch sofort ins Auge.)

    Bleibt also zusammenzufassen: Sieht aus wie verständnislos zusammenkopiert, und dabei haste noch nicht mal deinen Compiler drüber schauen lassen, der sollte an ein paar Stellen nämlich meckern. Lies deinen Code noch mal ganz genau durch, und frag dich bei jeder Zeile warum sie da steht, was sie macht, etc.

    Das mit (void) macht mein MVS 2008 automatisch, daher dachte ich das es richtig ist.

    Was meinst du mit: "Warum steht das dann nicht sofort da"?
    Und wo ist das: "std::string musst du nicht manuell initialisieren, das macht der schon selbst. Ein Parameterloser Konstruktor macht hier keinen Sinn"?

    Waffe gross/klein hab ich bereits geändert, aber vergessen im Post zu ändern :S

    Einige Klassen werden nicht benutzt (zur Zeit) das ist richtig.
    Die werden noch benutzt 😉

    Ich hab mich Entschiden Gegner als Monster zu erstellen, Charakter als ein Monster mit "Zusatzwerten" und einen NPC ebenfals als Monster da diese dann nur sprechen müssen.

    Ich hab ein paar Sachen angepasst und der Compeiler gibt keinen Error aus.

    Bitte nicht vergessen ich bin Anfänger und bin gern offen für Ratschläge und Hilfestellungen.
    Das ich die Typen alle als int oder String deklariert habe, ist schlicht und einfach das ich es simpel halten möchte.

    Gruss,
    Dragon



  • Darf ich noch schnell Fragen ob ich das richtig sehe, ich könnte fast immer unsigned int nehmen?
    Da die Werte nie im - Bereich?

    Gruss&Danke,

    Dragon



  • Dragon4411 schrieb:

    Darf ich noch schnell Fragen ob ich das richtig sehe, ich könnte fast immer unsigned int nehmen?
    Da die Werte nie im - Bereich?

    Bin selber noch Anfänger, hatte dir auch ne Mail geschrieben. 😉
    MMn kannst du unsigned int für alles nehmen, außer Werte, wie wenn z.b. ein Rüstungsteil zwar +5 auf Stärke, aber -2 auf Konstitution gibt. (grade gesehen, dass solche Attribute nicht vorkommen, sry :))
    Geld kannst du auch int lassen, wenns nen Dispo geben soll, wär auch mal was 😃

    berichtigt mich, wenn ich was falsches gesagt habe 🙂



  • Ich schreib dir mal ein kleines Beispiel:

    struct primary_attributes
    {
      float strength;
      float dexterity;
      float stamina;
      // ...  
      primary_attributes(float strength, float dexterity, float stamina)
        : strength(strength)
        , dexterity(dexterity)
        , stamina(stamina)
        // ...
      {}
    };
    
    struct attributes // Diese Attribute folgen aus primary_attributes + Rüstung und müssen dementsprechend neu berechnet werden, wenn z.B. etwas anderes angelegt wird.
    {
      float health;
      float mana;
      // ...
      attributes(float health, float mana)
        : health(health)
        , mana(mana)
      {}
    };
    

    Warum float? Weil diese Dinge durch eventuelle Modifier etc. (z.B. 1.5% mehr Lebenspunkte) verändert werden. Das sind keine diskreten Werte, könnte man auch sagen.

    struct equipment : public item
    {
      enum equip_type
      {
        helm, 
        pants, 
        // ..
      };
      equip_type type; // SO nutzt man enum
      std::string name; // Wenn man extra Namen möchte "Todeshose der Zerstörung", oder was da so üblich ist.
      std::uint16_t value; // Basis-Rüstungswert / Schaden bei Waffen
    
      equipment(equip_type type, const std::string& name, std::uint16_t value)
        : type(type)
        , name(name)
        , value(value)
      {}
    };
    
    // Hier könnte man uU auch Vererbung einsetzen, aber das muss man an den Rest anpassen und ist wohl teilweise auch Geschmackssache.
    
    // Aber wichtig ist:
    
    class character
    {
      std::unique_ptr<equipment> helm_slot_; // Nutze deine Klassen! Wozu hast du sie denn sonst?
      std::unique_ptr<equipment> pants_slot_; // Die Idee hier ist, wenn der Pointer 0 ist, ist der slot nicht besetzt
      // ..
      // Da würde man bei Vererbung natürlich den richtigen Typ angeben.
    
      std::uint64_t experience_;
      std::uint64_t gold_; // Von mir aus auch std::int64_t, 
      // aber "int" kann auch 2 byte groß sein, das läuft dann über wenn man mehr als 32767 gold hat.
    
      primary_attributes primary_attributes_;
      attributes attributes_;
    
      // ...
    
      character(std::uint64_t xp, std::uint64_t gold, primary_attributes pa, attributes a, /* ... */)
        : // ...
      {}
    };
    

    So, das nur mal als kleines Beispiel, wie man so etwas aufbauen kann. Was bringt dir eine Rüstungsklasse, wenn du sie nicht benutzt?

    berichtigt mich, wenn ich was falsches gesagt habe 🙂

    Siehe mein Kommentar zu int. 😉



  • cooky451 schrieb:

    Ich schreib dir mal ein kleines Beispiel:

    struct primary_attributes
    {
      float strength;
      float dexterity;
      float stamina;
      // ...  
      primary_attributes(float strength, float dexterity, float stamina)
        : strength(strength)
        , dexterity(dexterity)
        , stamina(stamina)
        // ...
      {}
    };
    
    struct attributes // Diese Attribute folgen aus primary_attributes + Rüstung und müssen dementsprechend neu berechnet werden, wenn z.B. etwas anderes angelegt wird.
    {
      float health;
      float mana;
      // ...
      attributes(float health, float mana)
        : health(health)
        , mana(mana)
      {}
    };
    

    Warum float? Weil diese Dinge durch eventuelle Modifier etc. (z.B. 1.5% mehr Lebenspunkte) verändert werden. Das sind keine diskreten Werte, könnte man auch sagen.

    struct equipment : public item
    {
      enum equip_type
      {
        helm, 
        pants, 
        // ..
      };
      equip_type type; // SO nutzt man enum
      std::string name; // Wenn man extra Namen möchte "Todeshose der Zerstörung", oder was da so üblich ist.
      std::uint16_t value; // Basis-Rüstungswert / Schaden bei Waffen
    
      equipment(equip_type type, const std::string& name, std::uint16_t value)
        : type(type)
        , name(name)
        , value(value)
      {}
    };
    
    // Hier könnte man uU auch Vererbung einsetzen, aber das muss man an den Rest anpassen und ist wohl teilweise auch Geschmackssache.
    
    // Aber wichtig ist:
    
    class character
    {
      std::unique_ptr<equipment> helm_slot_; // Nutze deine Klassen! Wozu hast du sie denn sonst?
      std::unique_ptr<equipment> pants_slot_; // Die Idee hier ist, wenn der Pointer 0 ist, ist der slot nicht besetzt
      // ..
      // Da würde man bei Vererbung natürlich den richtigen Typ angeben.
    
      std::uint64_t experience_;
      std::uint64_t gold_; // Von mir aus auch std::int64_t, 
      // aber "int" kann auch 2 byte groß sein, das läuft dann über wenn man mehr als 32767 gold hat.
    
      primary_attributes primary_attributes_;
      attributes attributes_;
    
      // ...
    
      character(std::uint64_t xp, std::uint64_t gold, primary_attributes pa, attributes a, /* ... */)
        : // ...
      {}
    };
    

    So, das nur mal als kleines Beispiel, wie man so etwas aufbauen kann. Was bringt dir eine Rüstungsklasse, wenn du sie nicht benutzt?

    berichtigt mich, wenn ich was falsches gesagt habe 🙂

    Siehe mein Kommentar zu int. 😉

    Danke schön 😃
    Schau mir das ganze sofort an und versuche es zu verstehen.

    Das mit den 1.5% (als beispiel) wollte ich ja nicht machen daher hab ich das Leben als int definiert.
    Eine Rüstung hat bei mir zur Zeit nur einen Rüstungswert.
    Später evtl. Leben+40.



  • xStrykex schrieb:

    Dragon4411 schrieb:

    Darf ich noch schnell Fragen ob ich das richtig sehe, ich könnte fast immer unsigned int nehmen?
    Da die Werte nie im - Bereich?

    Bin selber noch Anfänger, hatte dir auch ne Mail geschrieben. 😉
    MMn kannst du unsigned int für alles nehmen, außer Werte, wie wenn z.b. ein Rüstungsteil zwar +5 auf Stärke, aber -2 auf Konstitution gibt. (grade gesehen, dass solche Attribute nicht vorkommen, sry :))
    Geld kannst du auch int lassen, wenns nen Dispo geben soll, wär auch mal was 😃

    berichtigt mich, wenn ich was falsches gesagt habe 🙂

    Danke dir das du dir die Mühe machst mir zu Antworten.
    Du hast recht, werde die Datentypen nun anpassen.



  • cooky451

    Ich habe noch kurz eine Frage.
    Da ich ANfänger bin ist mir noch nicht klar wie ich dann im Endefeck die Rüstungen oder Waffen mit deinem Beispiel erstellen kann.

    ZB:

    Waffe
    Dolch der unendlichen Tötung
    Schaden: 10
    Preis: 50
    Angriff: 12
    Verteidigung: 11

    Rüstung
    Schild der Tapferen Reckens
    Typ: Schild
    Ruestungswert: 5

    Wie erstelle ich die (sofern die Klassen dafür vorhanden sind)
    Ich möchte sie dann ja nicht so erstellen:

    Waffe DolchXX("Dolch der unendlichen Törung",10,50,12,11);

    Beim Charakter finde ich das gut da dieser nur einmal erstellt werden muss.

    Und ich frage mich ob ich das mit dem Charakter gegenstände anlegen mit Set_HelmRuestungswert und so was machen soll.

    Ich finde das allgemeine Problem liegt bei mir im Verständnis bzw. der Logik wie ich was wo rein schreiben kann und was wie bearbeiten soll 😞

    PS: Hättest du evtl. mal Zeit ein wenig zu chatten?

    Gruss,

    Dragon



  • Dragon4411 schrieb:

    Waffe
    Dolch der unendlichen Tötung
    Schaden: 10
    Preis: 50
    Angriff: 12
    Verteidigung: 11

    Preis und Attribut-"Modifizierer" musst du noch in die Klasse stecken, war ja nur ein kleines Beispiel. 😉

    Dragon4411 schrieb:

    Ich möchte sie dann ja nicht so erstellen:

    Waffe DolchXX("Dolch der unendlichen Törung",10,50,12,11);

    😕 Warum nicht? Würde so in etwa aussehen, mit der entsprechenden Erweiterung um Preis etc.

    equipment blubb(equipment::dagger, "Dolch der alles kaputt macht", 10, 50, ..);
    

    Wo ist das Problem?

    Dragon4411 schrieb:

    Und ich frage mich ob ich das mit dem Charakter gegenstände anlegen mit Set_HelmRuestungswert und so was machen soll.

    Eine Methode bei der der Charakter die Ausrüstung wechselt ist sicher sinnvoll, aber die Werte setzt du natürlich nicht, du übergibst das Ding, was er anziehen soll.

    Dragon4411 schrieb:

    Ich finde das allgemeine Problem liegt bei mir im Verständnis bzw. der Logik wie ich was wo rein schreiben kann und was wie bearbeiten soll 😞

    Tjoa, vielleicht hast du doch noch etwas zu wenig Erfahrung. Wichtig ist, dass dir wirklich bei jeder einzelnen Zeile ganz genau klar sein muss, was da passiert und wozu das da steht. Und das bezieht sich auf jedes Zeichen!

    Dragon4411 schrieb:

    PS: Hättest du evtl. mal Zeit ein wenig zu chatten?

    Joa, im IRC (irc.euirc.net), #c++, #cpp-games oder #prettyos



  • cooky451 schrieb:

    Dragon4411 schrieb:

    Waffe
    Dolch der unendlichen Tötung
    Schaden: 10
    Preis: 50
    Angriff: 12
    Verteidigung: 11

    Preis und Attribut-"Modifizierer" musst du noch in die Klasse stecken, war ja nur ein kleines Beispiel. 😉

    Dragon4411 schrieb:

    Ich möchte sie dann ja nicht so erstellen:

    Waffe DolchXX("Dolch der unendlichen Törung",10,50,12,11);

    😕 Warum nicht? Würde so in etwa aussehen, mit der entsprechenden Erweiterung um Preis etc.

    equipment blubb(equipment::dagger, "Dolch der alles kaputt macht", 10, 50, ..);
    

    Wo ist das Problem?

    Dragon4411 schrieb:

    Und ich frage mich ob ich das mit dem Charakter gegenstände anlegen mit Set_HelmRuestungswert und so was machen soll.

    Eine Methode bei der der Charakter die Ausrüstung wechselt ist sicher sinnvoll, aber die Werte setzt du natürlich nicht, du übergibst das Ding, was er anziehen soll.

    Dragon4411 schrieb:

    Ich finde das allgemeine Problem liegt bei mir im Verständnis bzw. der Logik wie ich was wo rein schreiben kann und was wie bearbeiten soll 😞

    Tjoa, vielleicht hast du doch noch etwas zu wenig Erfahrung. Wichtig ist, dass dir wirklich bei jeder einzelnen Zeile ganz genau klar sein muss, was da passiert und wozu das da steht. Und das bezieht sich auf jedes Zeichen!

    Dragon4411 schrieb:

    PS: Hättest du evtl. mal Zeit ein wenig zu chatten?

    Joa, im IRC (irc.euirc.net), #c++, #cpp-games oder #prettyos

    Ich dachte das wäre ein wenig mühsam ^^
    Wie wäre es mit einem Textfile?

    Hättest du heute Abend Zeit einwenig sich auszutauschen?

    Gruss,

    Dragon



  • Dragon4411 schrieb:

    phlox81 schrieb:

    Verwendest du dafür eine UI?
    Oder machst du das auf der Konsole?

    Das ganze ist an Anfänger gerichtet und findet daher in der Konsole statt.
    Sollte es irgendwann dann mal fertig sein, kann es immer noch umkonzipiert werden.

    Gruss,

    Dragon4411

    Das ist in 90% aller Fälle falsch. So ein "unkompliziertes Umkonzipieren" ist leichter gesagt als getan. Wenn du dir nicht im Vorfeld schon ganz genau überlegst und geeignete Schnittstellen implementierst, kann das sehr schwierig sein. Viele sagen sich am Anfang "ach, ich mach das einfach mal so, und wenn es nicht passt, kann ich am Ende alles noch ändern.". Wenn aber das Projekt wächst und es soweit ist, merken sie schnell, dass der damit verbundene Arbeitsaufwand 10mal größer ist, als am Anfang angenommen. Du wirst beim Debuggen bestimmt keine Freude haben.



  • Dragon4411 schrieb:

    Hättest du heute Abend Zeit einwenig sich auszutauschen?

    Wie gesagt, einfach anschreiben im IRC, wenn ich da bin antworte ich. 😉 Und bitte lass die full-quotes, das spammt die Seite so zu.



  • okei mach ich 🙂

    Kann leider erst am Abend bin jetzt dann am arbeiten.



  • Ist mein Verständnis hier richtig?

    #pragma once
    class Monster
    {
    public: //Alle folgenden Variablen sind Öffentlich sprich von überall aus, veränderbar
    int Leben;
    int Mana;
    int Geld;
    int EXP;
    int Level;
    int Angriff;
    int Verteidigung;
    int Schaden;
    int RuestungsWert;
    std::string WaffeName;
    std::string Name; //Eerstellen der Variablen
    Monster()
    : Name(""),
    WaffeName(""),
    Leben(0),
    Mana(0),
    Geld(0),
    EXP(0),
    Level(0),
    Angriff(0),
    Verteidigung(0),
    Schaden(0),
    RuestungsWert(0) //???Was brint mir das? Alle Variabeln auf "NULL" Zustand setzen?

    {
    //Konstruktorrumpf
    }

    Monster(
    std::string const & MonsterName,
    std::string const & MonsterWaffeName,
    int Leben,
    int Mana,
    int Geld,
    int EXP,
    int Level,
    int Angriff,
    int Verteidigung,
    int Schaden,
    int RuestungsWert)
    //???Warum muss ich die noch mal angeben?
    : Name(MonsterName),
    WaffeName(MonsterWaffeName),
    Leben(Leben),
    Mana(Mana),
    Geld(Geld),
    EXP(EXP),
    Level(Level),
    Angriff(Angriff),
    Verteidigung(Verteidigung),
    Schaden(Schaden),
    RuestungsWert(RuestungsWert)
    //??? Zuweisungen für erstellung Objekt mit Werten, aber wieso muss ich die nochmal verbinden?
    {
    }

    void MonsterKampf()
    {
    //Kampfhandlung
    }

    virtual ~Monster(void) //Destruktor

    };



  • Ne, du hast eher gar nichts verstanden. Guck dir meinen Code noch mal an. 😉



  • daddy_felix schrieb:

    out schrieb:

    out schrieb:

    Du lernst es nie

    Welcher Spaten klaut sich hier meinen - nicht registrierten - Benutzernamen. Shame on you. 🙄

    dann registriere dich doch.

    OT: irgendwie gehen mir die ganzen nicht registrierten Deppen so langsam auf den Keks. Ich habe das Gefühl, das das meistens "richtige" User sind, die da irgendeinen Mist hinrotzen wollen, ohne dass das unter ihrem Namen geschieht.

    Pass mal auf mein Freundchen, ich schreibe hier keinen Mist. Da wo ich bin willst du erst einmal hin.



  • cooky451 schrieb:

    Ne, du hast eher gar nichts verstanden. Guck dir meinen Code noch mal an. 😉

    Jetzt bin ich verwirrt xD



  • out schrieb:

    Pass mal auf mein Freundchen, ich schreibe hier keinen Mist. Da wo ich bin willst du erst einmal hin.

    Pass du mal eher auf deinen Ton auf. Mir ist schon klar, dass du hier viele hilfreiche Tipps gibst. Damit bist du unter den unregistrierten aber eine löbliche Ausnahme.



  • daddy_felix schrieb:

    out schrieb:

    Pass mal auf mein Freundchen, ich schreibe hier keinen Mist. Da wo ich bin willst du erst einmal hin.

    Pass du mal eher auf deinen Ton auf. Mir ist schon klar, dass du hier viele hilfreiche Tipps gibst. Damit bist du unter den unregistrierten aber eine löbliche Ausnahme.

    Bitte nicht streiten :S

    Ich würde mal sagen out hat bewiesen das er sehr grosse Kentnisse besitzt und fachlich sehr kompetent ist.

    Ich würde gerne auch so viel Wissen besitzen wie du.



  • Ich würde sagen, dieser Beitrag gehört ins Projekte-Forum.



  • Kann man dich auch anders als über das Forum kontaktieren?


Anmelden zum Antworten