Anfängerfrage zum Thema Daten sortieren und abrufen



  • Also, wenn ich das richtig abschätze, dann kann ich für jede Eigenschaft, die die Waffen haben sollen ein eigenes Feld machen - oder ich mach ein Array mit mehreren Dimensionen (berichtigt mich nur, wenn die Überlegung falsch sein sollte *g*).
    Einfach, aber genial. Danke 🙂



  • Oder auch irgendwie so:

    struct Weapon
    {
        std::string name;
        int         dmg;
        // Weitere Eigenschaften..
    
        Weapon() {} // Standard-Konstruktor
    
        Weapon( std::string n, int d ) : name(n), dmg(d) {}
    
        bool operator==( const Weapon& other ) const
        { return name == other.name; }
    };
    
    std::map<std::string,Weapon> weapons;
    
    // irgendwo Waffen 'laden':
    weapons["Schwert"] = Weapon( "Schwert", 17 );
    weapons["Dolch"] = Weapon( "Dolch", 6 );
    
    Weapon chooseWeapon()
    {
        std::cout << "Verfügbare Waffen: " << std::endl;
        for ( std::map<std::string,Weapon>::const_iterator i=weapons.begin(); i!=weapons.end(); i++ )
            std::cout << "  " << i->first << " (" << i->second.dmg << " Schaden)" << std::endl;
    
        std::string choice;
        bool weapon_found = false;
        do
        {
            std::cout << "Bitte eine Waffe auswählen: ";
            std::cin >> choice;
    
            if ( weapons.find(choice) != weapons.end() )
                weapon_found = true;
            else
                std::cout << "Ungültige Eingabe, bitte nochmal versuchen" << std::endl;
    
        } while ( ! weapon_found );
    
        return weapons[choice];
    }
    

    edit: Bzw kannst du auch einen std::vector statt einer std::map benutzen, kommt aber halbwegs aufs selbe raus.

    edit2: :p Dafür hat Nexus in seinem Post den sequenziellen Zugriff drin, das ist für einen Anfänger wahrscheinlich eine Ecke einfacher 🙂



  • FoxY schrieb:

    Also, wenn ich das richtig abschätze, dann kann ich für jede Eigenschaft, die die Waffen haben sollen ein eigenes Feld machen - oder ich mach ein Array mit mehreren Dimensionen (berichtigt mich nur, wenn die Überlegung falsch sein sollte *g*).
    Einfach, aber genial. Danke 🙂

    Ja, das wäre eine Möglichkeit. Wenn du allerdings mehrere Eigenschaften hast, lohnt es sich mit der Zeit, ein Array von Klasseninstanzen machen. Ich weiss nicht, ob du dich mit Klassen bereits auskennst, ansonsten ist das mit dem Array vielleicht eine gute Übung.

    Mit Klassen ginge es etwa so:

    struct Waffe
    {
       std::string Name;   // Halt irgendwelche Eigenschaften
       int Schaden;
       int Kosten;
       Waffe(std::string NeuerName, int NeuerSchaden, int NeueKosten) // Konstruktor
       : Name(NeuerName), Schaden(NeuerSchaden), Kosten(NeueKosten) {};
    };
    
    int main()
    {
       Waffe WaffenArray[7];
       WaffenArray[0].Waffe("Schwert", 4, 250);
       WaffenArray[1].Waffe("Speer", 7, 350);
       // und so weiter
       int WaffenName, WaffenSchaden, WaffenKosten;
       // hier käme die Eingabe der Nummer mit allem drum und dran;
       cin >> Index; // halt zwischen 0 und 7
       MeinName = WaffenArray[Index].Name; // hier könntest du auf die Klassenmember zugreifen
       MeinSchaden = WaffenArray[Index].Schaden;
       MeineKosten = WaffenArray[Index].Kosten;
    }
    

    Oder du könntest noch extra Funktionen dazu machen...

    Edit: Verdammt, zu spät 😉



  • Die letzten beiden Beispiele kann ich jetzt noch etwas schwer einschätzen. Ich weiß zwar, was Strukturen, Klassen usw. sind, aber die Möglichkeiten sind mir in ihrer vollen Pracht noch ein Rätsel 😕

    Ich glaub, da muss ich mich erstmal noch ein wenig reinlesen.



  • Ja, falls du noch nicht gross mit Klassen gearbeitet hast, sind unsere Methoden nicht unbedingt geeignet. Vorläufig würde ich es entweder bei einem 2D-Array oder mehreren eindimensionalen Arrays belassen, dann vertiefst du auch gerade ein anderes wichtiges Kapitel von C++ 😉



  • Achja, eine kleine Frage hätte ich da noch. Es hat eigentlich nicht wirklich mit dem bisherigen Thema zu tun, aber ich wollte keinen extra Thread dafür eröffnen.

    Und zwar benutze ich Dev-C++. Wenn ich da versuche zu debuggen taucht die Meldung auf, dass in dem Programm keine Debugging Informationen erhalten sind und ob ich erneut Kompilieren und Debugging aktivieren möchte. Bringt aber nichts, wenn ich bestätitge.
    Mir ist nicht ganz klar, was er da für Informationen braucht.



  • Passiert das nicht nur, wenn du versuchst, von einem Header aus zu kompilieren? Machs mal von einer .cpp-Datei aus...

    Ich hatte früher auch Dev-C++, aber bin auf Microsoft Visual C++ 2008 Express umgestiegen. Das würde ich dir auch empfehlen, der ist nämlich moderner und bietet mehr Funktionen und Benutzerfreundlichkeit (z.B. IntelliSense).



  • Darauf hab ich auf Grund persönlicher Antipathien gegen Microsoft verzichtet *g*
    Aber sieht wohl so aus, als wäre Visual C++ ein Grund, mal zähneknirschend über den Stolz hinwegzusehen.



  • FoxY schrieb:

    Darauf hab ich auf Grund persönlicher Antipathien gegen Microsoft verzichtet *g*
    Aber sieht wohl so aus, als wäre Visual C++ ein Grund, mal zähneknirschend über den Stolz hinwegzusehen.

    Guck Dir mal Codeblocks an. Das sollte ausreichend sein.



  • Du musst es natürlich selber wissen, ich finde VC++ eigentlich okay, und Dev-C++ ist wirklich mühsam dagegen... Ich würde VC++ einfach mal ausprobieren, und sonst kannst du ja immer noch zurückwechseln 😉

    Ansonsten gibt es z.B. noch Code::Blocks und einige weitere Entwicklungsumgebungen.
    Dev-C++ hat einfach das Problem, dass er veraltet ist. Teilweise werden auch gewisse Features nicht unterstützt (und er hat - glaube ich - auch einige Bugs).



  • Also ich hoffe mal, ich nerve nicht mit meinen häufigen Fragen, aber ich hätte noch eine - diesmal aber aus reiner Neugierde.

    Wie werde solche Dinge eigentlich in professionellen Projekten gelöst? Das letzte mal, als ich in einem kommerziellen Spiel rumgeschnüffelt hab (nur mit legalen Methoden, versteht sich), habe ich nur einfache Tabellen gefunden, wie man sie in jedem Textdokument vermuten könnte. Die enthielten ebenfalls alle Daten, die ich jetzt in Arrays stopfe.

    Im Übrigen auch Danke für den Ratschlag bezüglich Visual C++. Der Editor allein ist schon übersichtlicher, von dem ganzen Zucker drum herum garnicht zu sprechen.



  • Hallo,

    also das Problem mit dem Debuggen bei Dev-Cpp ist, dass er, selbst wenn du nach der Meldung debugging aktivieren willst, es nicht tut...du musst das per Hand aktivieren, das muss irgendwo in den Projektoptionen gehen. Leider kann ich das jetzt nicht genau nachschaun, habe das Teil vor kurzem deinstalliert^^ Code::Blocks und auch Microsoft VS sind da konfortabler...abgesehen davon, dass MVS etwas over the Top ist für kleinere Projekte (meine Meinung)...ansonsten ist auch Wascana(eclispe) nicht schlecht...

    Sahen die "Tabellen" in etwa so aus:
    Schwert 6 3 6
    Axt 7 18 6
    Peitsche 8 18 9

    Wenn ja, entsprechen diese Werte folgendem (z.B.):
    Waffenname : Damage als Krieger : Damage als Magier : Damage als Dieb

    Lies die Daten zeilenweiße bzw. Wortweiße ein und speicher sie entsprechend...z.B. in eine Struktur

    struct Waffe
    {
    std::string name;
    int dmgWarrior;
    int dmgMage;
    int dmgThief;
    }

    oder in einem 2-dimensionalem Array. Oder in einer eigenen Klasse.

    Professionelle Projekte nutzen, selbstdefinierte Formate, es sei denn, es gibt schon schöne, wie z.B. für 3D-Modelle etc...selbdefiniert wäre auch das, wie oben erwähnt^^

    Grüsse



  • Das klingt auf jeden Fall interessant. Ich glaub, das wird mein nächstes Zwischenziel, wenn ich die Grundlagen und die Objektorientierung abgeschlossen hab.

    Danke für all die geduldigen und hilfreichen Antworten 🙂


Anmelden zum Antworten