C++ Einkaufsliste aber wie?



  • Hi, also ich glaube die Diceklasse kannst du auch einfach als Memberfunktion implementieren, vielleicht auch als static member funktion, dann kannst du sie auch unabhängig von einem Objekt benutzen.
    Ist ne Designfrage ob du jetzt unbedingt in einer Monsterklasse eine Dicefunktion brauchst/haben möchtest, aber irgendwie empfinde ich es als Overkill für ein einfaches Würfeln eine Klasse zu erstellen.
    Nimm vielleicht sowas:

    class Monster
    {
    [...]
    static int roll(int WuerfelAugen = 20)
    {
    blablabla
    }

    };

    Ok, eigentlich unsinnig, daher besser:

    Erstell ne Klasse Spiel oder ähnliches die eben diese rollmethode dann besitzt.

    Bei deiner Kampffrage bin ich mir unsicher wie du das meinst:

    Könntest z.B. eine Kampfmethode erstellen in der Klasse Monster:

    class Monster
    {
    [..]
    bool Kampf(Monster Gegner)
    {
    Dice W20(20);
    while(min(this->Leben,Gegner.Leben)>0)
    {
    [...]//dein Kampfskript
    }
    }
    }



  • So nun meine Antwort auf beide Themen:

    Ich werde die Kampffunktion in der Klasse Monster machen.

    Die funktioniert ja (wie du auch im Code den ich dir per Mail gegeben habe) folgender massen:

    kampfmethode.

    Objekt Oger Klasse Monster.
    Objekt Mensch Klasse Monster.
    Objekt W20 Klasse dices.
    
    Oger wirft W20
    if(W20 <=Angriff Oger)
    {
           Mensch muss sich verteidigen, wirft W20;
           if(W20>=Verteidigung Mensch) //kann schalg nicht parieren
           {
               der schlag trifft den menschen, Leben Mensch - Schaden Oger; 
           }
           pariert schlag des ogers;
           Mensch greifft an , W20;
           if(W20<=Angriff Mensch)
           {
           Oger muss sich verteidigen, wirft W20;
           if(W20>=Verteidigung Oger) //kann schalg nicht parieren
           {
               der schlag trifft den Oger, Leben Oger - Schaden Mensch; 
           }
           pariert schlag des Menschen;
    }
    

    Im Main möchte ich wenn eien Kampf stat findet das so machen:

    Ich (Mensch muss kämpfen) mein gegner ist X (Oger,troll oder was auch immer, wird mit Monster X; erstellt)

    Es soll nun die Methode Kampf ausführen und automatisch die Werte des vorher erstellten Gegners übernehmen.

    Ich weiss wie ich den Kampf machen will jedoch weiss ich nciht wie es dei Werte übernehmen kann :S

    Ich hoffe man versteht was ich meine?
    Oder rede ich nach zu vielem Herumprobieren nur noch wirres Zeug? xD

    Gruss und Danke an alle

    Nimda4



  • Die Werte werden doch automatisch kopiert, wenn du den Gegner via call by value an die Kampfmethode übergibst.



  • Namenloser324 schrieb:

    Die Werte werden doch automatisch kopiert, wenn du den Gegner via call by value an die Kampfmethode übergibst.

    Hmmm ich verstehe nicht wie genau das gehen soll :S

    Ist das so gemeint?:

    void kampffunktion(Mensch,Monster1)
    


  • Äh, jetzt vermischt du aufruf und definition der Funktion.

    Also:
    Wenn du deine Funktion wie folgt definierst:

    void kampf(Mensch Spieler,Monster Gegner)
    

    Dann sagst du damit dem Compiler das beim Aufruf der Funktion die Parameter als Kopie übergeben werden,d.h. es werden in der Funktion nur Kopien mit exakt dem gleichen Inhalt verwendet(streng genommen heißt das, dass der Kopierkonstruktor der Klasse aufgerufen wird).



  • Achso und wenn du mehrere Gegner verwenden möchtest änderst du einfach die Funktion zu:

    void Kampf(Mensch Spieler,std::vector<Monster> Gegner)
    

    und in der Funktion verwendest du dann eine Schleife die durch alle Gegner durchläuft. Im Grenzfall mit nur einem Gegner funktioniert es dann identisch zum sonstigen Fall.



  • Namenloser324 schrieb:

    Achso und wenn du mehrere Gegner verwenden möchtest änderst du einfach die Funktion zu:

    void Kampf(Mensch Spieler,std::vector<Monster> Gegner)
    

    und in der Funktion verwendest du dann eine Schleife die durch alle Gegner durchläuft. Im Grenzfall mit nur einem Gegner funktioniert es dann identisch zum sonstigen Fall.

    Danke werde ich sofort versuchen zu testen 😃

    Gruss

    Nimda4



  • Hab das mit deinem Code getestet funktioniert zwar noch ncith werde aber noch einwenig mich im Internet schlau machen und weiter versuchen bevor ich weider nachfrage 😃

    Habe aber noch eine Frage bezüglich Seite 1 dieses Thema mti dem Code für den Waffen Einkauf ich hab das jetzt mal nach gebildet und es sieht wie folgt aus:

    [code]
    #include <stdio.h>
    #include <tchar.h>
    #include <stdio.h>
    #include <tchar.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    using namespace std;
    
    class Waffe 
    { 
        public: 
        Waffe(string CName,string CDmg,string CKosten){Name = CName;Dmg = CDmg;Kosten=CKosten;} 
        string Name,Dmg,Kosten; 
    }; 
    class Waffenliste 
    { 
        public: 
        void add(Waffe item) 
        { 
            Liste.push_back(item); 
        } 
        vector<Waffe> Liste; 
    }; 
    int main() 
    { 
    	string Geld;
    	int Geld_2=100;
        Waffenliste liste; 
        ifstream file("waffe.txt"); 
        if(file.good()) 
        { 
    
            while(!file.eof()) 
            { 
            vector<string> zeile; 
            string line; 
            getline(file,line); 
            do 
            { 
    		//generiert Substring und fügt den gleich dem vektor hinzu 
                zeile.push_back(line.substr(0,line.find(" "))); 
    		//wenn danach noch ein leerzeichen kommt löscht er bis zu diesem sonst alles 
                if(line.find(" ")!= string::npos) 
                line.erase(0,line.find(" ")+1); 
                else 
                line.erase(); 
            } 
            while(!line.empty()); 
            liste.add(Waffe(zeile[0],zeile[1],zeile[2])); 
            } 
    
        } 
        file.close(); 
        for(unsigned int i = 0 ; i<liste.Liste.size();i++) 
        cout << "Name: " << liste.Liste[i].Name << "(Dmg " << liste.Liste[i].Dmg << ",Kosten " << liste.Liste[i].Kosten << ")" << endl; 
    	cout <<"eingeben\n";
    	int x;
    	cin >>x;
    	Geld=liste.Liste[x].Kosten;
    	int value = atoi(Geld.c_str()); 
    	Geld_2=Geld_2-value;
    	cout <<Geld_2;
    	cout << "Waffe " << liste.Liste[x].Name << "gekauft" << endl; 
    	system("pause");
    }
    

    [/code]

    Jedoch wenn ich 2 Eingebe stürzt das Programm ab, weil (wie ich herausgefunden habe) es gar kein 2 gibt.

    Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein.

    waffe.txt

    Dolch 20 50
    Schwert 60 200
    

    Ausgabe wenn ich 1 Drücke:
    "-200Waffe Schwertgekauft"

    Ausgabe bei 2 oder höhere Zahl(bei höherer Zahl ist es ja klar):
    "Debug Assertion failed
    .
    .
    .
    "
    Abort Retry Ignor

    Weiss jemand wiso es das Erste nicht einliesst?

    Gruss

    Nimda4



  • nimda4 schrieb:

    Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein.

    Deine 'Liste' ist keine Liste, sondern ein Vektor. Und wenn der zwei Einträge hat, dann haben diese die Indizes 0 und 1.



  • [/code]

    Belli schrieb:

    nimda4 schrieb:

    Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein.

    Deine 'Liste' ist keine Liste, sondern ein Vektor. Und wenn der zwei Einträge hat, dann haben diese die Indizes 0 und 1.

    Hab ich gerade auch festgestellt und wollte es posten da sah ich deinen Post xD

    Ich danke dir trotzdem 🙂

    Ich habe noch eine Frage.
    Wie kann ich bei folgender Funktion dafür Sorgen das die Abstände die ich mit <<" " gemacht habe automatisch erstellen alssen je nach dem wie lang der string ist?

    [code]
        for(unsigned int i = 0 ; i<liste.Liste.size();i++) 
        cout << i <<"    " << liste.Liste[i].Name <<"      " << liste.Liste[i].Dmg <<"    " << liste.Liste[i].Kosten << endl; 
    	cout <<"eingeben\n";
    	int x;
    	cin >>x;
    	Geld=liste.Liste[x].Kosten;
    	int value = atoi(Geld.c_str()); 
    	Geld_2=Geld_2-value;
    	cout <<Geld_2;
    	cout << "Waffe " << liste.Liste[x].Name << "gekauft" << endl;
    

    [/code]

    Ich habe mri überlegt ob es so geht:
    String maximal länge.
    Teilen in 4 Teile je nach dem wie Lang z.b der Name ist (die 4 Kategorienen).

    Gruss

    Nimda4



  • Ich bin mir nicht sicher, ob ich verstanden habe, was Du willst, aber

    #include<iomanip>
    #include <iostream>
    
    ...
    
    int main()
    {
       ...
    
       std::cout << std::setw(20) << "Name" << setw(20) << "Vorname\n";
    
       ...
    

    ist vielleicht das, was Du suchst?
    Übrigens Hut ab! Ich bin immer wieder erstaunt, wieviel man trotz weitgehender Ahnungslosikeit erreichen kann.



  • Naja, man wächst mit der Aufgabe. Ist meines ERachtens motivierender mit einer Sache loszulegen und sich nebenbei mit der Thematik auseinanderzusetzen.

    Für dein letzes Problem mit den <<" " verwende für die Ausgabe doch ne eigene Funktion, welche nachschaut wie lang die strings sind und dann für jeden Fall entsprechende Leerzeichen einfügt, auch wenn ich nicht weiß wieso du das machen möchtest.



  • Belli schrieb:

    Ich bin mir nicht sicher, ob ich verstanden habe, was Du willst, aber

    #include<iomanip>
    #include <iostream>
    
    ...
    
    int main()
    {
       ...
    
       std::cout << std::setw(20) << "Name" << setw(20) << "Vorname\n";
    
       ...
    

    ist vielleicht das, was Du suchst?
    Übrigens Hut ab! Ich bin immer wieder erstaunt, wieviel man trotz weitgehender Ahnungslosikeit erreichen kann.

    Vielen Dank für dein Kompliment 😃

    Zur Zeit habe ich ja kein Buch und muss alles im Internet zusammen lesen-.-^^

    Leider ist es nicht ganz das was ich möchte.

    Ich möchte folgendes:

    Nr.    Name       DMG     Kosten
    0      Schwert    20      200
    1      Dolch      10      100
    

    Es soll automatisch die Abstände anpassen also die Abtände zwischen den einzelnen Sachen.

    @Namenloser324
    Sehe ich genau so 😃
    Macht so viel mehr Spass und langsamm verstehe ich einig ezusammenhänge. Aber natürlich werde ich noch das Buch durcharbeiten.

    Gruss Nidma4



  • Namenloser324 schrieb:

    Naja, man wächst mit der Aufgabe. Ist meines ERachtens motivierender mit einer Sache loszulegen und sich nebenbei mit der Thematik auseinanderzusetzen.

    Das wäre dann akzeptabel wenn man...
    a) ...auch schlecht gelerntes wieder leicht vergessen würde...*
    b) ...dann keine Anderen ständig bemüht...**

    * Viele Bücher wählen nicht ohne Grund einen aufbauenden Weg, da so einige Fehler vermieden werden können. Der Mensch ist aber ein Gewohnheitstier, so wie z.B. jemand der Jahrelang Java programmiert hat, häufig bei C++ in Probleme rennt weil er sich auf sein altes Javawissen verlässt, oder jemand der sich einen dreckigen Programmierstil angewöhnt hat, diesen auch nur langsam ablegt.

    ** Ein Forum dient zwar der Hilfestellung, aber der Sinn verfliegt wenn jemand alles in kleinen Häppchen nachfragt. Die Steigerung ist dann alle Codeschnippel die man im Internet findet zu verwenden, ohne den Sinn wirklich zu verstehen, und sich dann Wundern wenn merkwürdige Fehler auftreten.



  • asc schrieb:

    Ich habe noch neue Bücher bei mir rumfliegen, nur habe ich diese schon einem anderen angeboten dem ich zumindest bis zum Wochenende Zeit lassen will. Ggf. kannst du mich ja mal kontaktieren.

    @nimda4: Bislang hat sich der Erste nicht gemeldet, kannst mich wie gesagt bei Bedarf mal kontaktieren (Mail über Profil)



  • Dazu musst Du vor der Ausgabe einmal die Länge des breitesten Strings pro Spalte feststellen und dann:

    int breiteSpalteEins = /*zum Beispiel:*/ 8;
    int breiteSpalteZwei = /*zum Beispiel:*/ 12;
    int breiteSpalteDrei = /*zum Beispiel:*/ 10;
    int breiteSpalteVier = /*zum Beispiel:*/ 14;
    
    cout << left;  //linksbündige Ausgabe
    for(unsigned int i = 0 ; i<liste.Liste.size();i++)
        cout << setw(breiteSpalteEins) << i << setw(breiteSpalteZwei) << 
        liste.Liste[i].Name << setw(breiteSpalteDrei) << liste.Liste[i].Dmg << 
        setw(breiteSpalteVier) << liste.Liste[i].Kosten << endl;
    


  • Belli schrieb:

    Dazu musst Du vor der Ausgabe einmal die Länge des breitesten Strings pro Spalte feststellen und dann:

    int breiteSpalteEins = /*zum Beispiel:*/ 8;
    int breiteSpalteZwei = /*zum Beispiel:*/ 12;
    int breiteSpalteDrei = /*zum Beispiel:*/ 10;
    int breiteSpalteVier = /*zum Beispiel:*/ 14;
    
    cout << left;  //linksbündige Ausgabe
    for(unsigned int i = 0 ; i<liste.Liste.size();i++)
        cout << setw(breiteSpalteEins) << i << setw(breiteSpalteZwei) << 
        liste.Liste[i].Name << setw(breiteSpalteDrei) << liste.Liste[i].Dmg << 
        setw(breiteSpalteVier) << liste.Liste[i].Kosten << endl;
    

    Vielen Danke werde ich im Verlauf des Tages probieren.

    Gruss

    Nimda4



  • asc schrieb:

    asc schrieb:

    Ich habe noch neue Bücher bei mir rumfliegen, nur habe ich diese schon einem anderen angeboten dem ich zumindest bis zum Wochenende Zeit lassen will. Ggf. kannst du mich ja mal kontaktieren.

    @nimda4: Bislang hat sich der Erste nicht gemeldet, kannst mich wie gesagt bei Bedarf mal kontaktieren (Mail über Profil)

    Hast eine Mail von mir 😃

    Gruss

    Nimda4



  • Hab jetzt trotzdem das ich auf das Buch warte noch eine Frage.

    Ich habe ja folgende Klasse:

    [code]
      public: 
        Monster()      // Standardkonstruktor 
        : name(""),    // Initialiserungsliste 
          leben(0), 
          Angriff(0),
    	  Vert(0),
    	  Schaden(0)
        { 
          //Konstruktorrumpf 
        } 
    
        Monster(   // Konstruktor mit Parametern 
         std::string const & name, 
    	 int leben, 
    	 int Angriff,
    	 int Vert,
    	 int Schaden) 
        : name(name),       // Zuweisung Parameter zur Membervariablen 
          leben(leben), 
          Angriff(Angriff),
    	  Vert(Vert),
    	  Schaden(Schaden)
        { 
        } 
    
    		void test() //Testfunktion
    		{
    			std::cout <<name <<"\n" <<leben <<"\n" <<Angriff <<"\n" <<Vert <<"\n" <<Schaden <<"\n";
    		}
    
    		void kampf()
    		{
    
    		}
    
        ~Monster() // Destruktor 
        { 
        } 
    };
    

    [/code]

    Ich möchte die void Kampf() so machen das ich dort meine Werte dort Benutzen kann.
    Muss ich dafür eine neue Klasse für mich machen da es nicht mit 2 Objekten in einer Methode der gleichen Klasse funktioniert?

    Oder geht es doch?

    Beispiel

    Monster Ich("Hans",100,12,14,50);
    Monster Oger("Oger",130,11,12,45);

    Und dann möchte ich hier die Funtkion aufrufen und es soll zuerst das Objekt "ICH" nehmen und dann den Oger.

    Wenn es möglich ist möchte ich es imemr so machen das der Erste der oben steht als erstes Objekt nimmt und dann das untere.

    Und wenn ich eine Funktion einer anderen Klasse aufrufen möchte kann ich das mit "friend" machen?

    Gruss

    Nimda4



  • wie bereits gesagt:

    void kampf(std::vector<Monster> Gegnergruppe)
    {

    //hier kannst du deine eigenen Werte benutzen und wenn Monster friend deiner //Klasse ist auch die der Monster
    }


Anmelden zum Antworten