Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  C++ Einkaufsliste aber wie?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 10:37:48 19.04.2012   Titel:   C++ Einkaufsliste aber wie?            Zitieren

Hallo Liebe Programmier Geminde

Ich würde gerne in C++ eine Art Shop schreiben in dem man verschiedene Waffen hat welche, einen Preis haben und einen Schaden.
Wie kann ich dies machen?
Den Shop möchte ich als eine Funktion haben und es soll wenn eine auswahl getroffen worden ist, diese "Speichern"

Beispiel:

Herzlich willkommen im Shop was möchtest du kaufen?
1. Schwert (18 DMG, 200 Euro)
2. Dolch (10 DMG, 100 Euro)
3. Armbrust (14 DMG, 300 Euro)

Wenn ich jetzt 1 eingebe soll er mir auf einen String "Schwert" schreiben, mir auf einen Integer die DMG (18) schreiben und von meinem Geldbeutel(global oder lokale variable??) 200 abziehen.

Ich habe zwar eine Lösung gefunden, jedoch ist diese sehr, sehr ungeschickt und brauchtzu viel Platz (Sehr langer Code):

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <csetjmp>
#include <stddef.h>
#include <iostream>
#include <conio.h>
#include <dos.h>
#include <conio.h>
#include <Windows.h>
 
using namespace std;
 
int a;
int c;
int geldbeutel;
 
int shop(int c)
{
      cout<<"Bitte Waffe auswählen\n";
        cin>>a;
        switch(a)
        {
            case 1: c=1; break;
            case 2 : c=2; break;
            case 3 : c=3; break;
        }
            std::system("cls");
            return(c);
            break;
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
     switch(shop(0))
     {
    case 1:
    if(geldbeutel>=200)
    {
            waffe="Schwert";
                 schaden=18;
                 geldbeutel=geldbeutel-200;
                 break;
    }
    else
    {
        cout <<"zuweniggeld\n";
    }
 
    case 2:
    if(geldbeutel>=100)
    {
        waffe="Dolch";
                 schaden=10;
                 geldbeutel=geldbeutel-100;
                 break;
    }
    else
    {
        cout <<"zuweniggeld\n";
    }
 
    case 3:
    if(geldbeutel>=300)
    {
        waffe="Armbrust";
                 schaden=14;
                 geldbeutel=geldbeutel-300;
                 break;
    }
    else
    {
        cout <<"zuweniggeld\n";
    }


Bei so wenigen Waffen währe diese Lösung für mich in ordungn nun habe ich jedoch 100+ Waffen -.-

Klassen habe ich mir auch angeschaut und die Variabeln auf KLassen zu schreiben wäre kein Problem jedoch habe ich immer das gleiche Problem:
Die Auswahl welche Waffe gekauft wurde.

Kann mir wer weiterhelfen?

Ich verwende den Microsoft Visual Studio 2008 Compailer.

Mit Freundlichen Grüssen

nimda4
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 11:00:15 19.04.2012   Titel:              Zitieren

Hallo, folgendes wäre z.B. denkbar:

Du schreibst in eine Textdatei alle Kombinationen von Waffe und Schaden und ähnlichen Informationen die du haben möchtest und trennst die Informationen mit irgendeinem Trennzeichen(etwa einem Leerzeichen oder einem Komma).
Dann liest du in deinem Programm die Datei aus und lädst die Informationen in eine Klasse, welche du dann ganz standardmäßig ausgeben kannst.

Also kleines Beispiel:

Textdatei:

Schwert 19 200
Armbrust 10 100
usw

Zuerst steht der Name dort, danach der Schaden und dann die Kosten.

Die Klassen die du dafür benötigst könnten z.B. so aussehen:

class Waffe
{
public:
Waffe(std::string C_name, int C_dmg,int C_kosten)
std::string name;
int dmg,kosten;
}
class Waffenangebot
{
public:
void getListe(void)
{
for(int i = 0; i < Waffenliste.size();i++)
{
std::cout << "Name: " << Waffenliste[i].name << "(Dmg " << Waffenliste[i].dmg << ", Kosten " << Waffenliste[i].kosten << std::endl");
}
void addWaffe(Waffe blabla);
privat:
std::vector<Waffe> Waffenliste;
}

Dann im Programm immer eine Zeile aus der Textdatei auslesen und in ein Objekt des Typs Waffe einspeichern und das in die Klasse Waffenangebot einfügen.
Fertig.

Schau dir dazu die Klasse ifstream an, sowie die Klasse vector.
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 11:01:26 19.04.2012   Titel:              Zitieren

Oder habe ich jetzt dein Problem missverstanden? Die Auswahl ist dann eigentlich kein Problem mehr, kannst bei der Ausgabe ja noch eine Nummer davorschreiben, so dass der Nutzer weiß welche Nummer welcher Waffen entspricht.
Syntax_error
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.03.2012
Beiträge: 153
Beitrag Syntax_error Mitglied 11:11:14 19.04.2012   Titel:              Zitieren

Wenn ich deine Frage richtig verstanden habe, dann willst du über 100 Waffen, aber die Waffen nicht aufschreiben.
Das funktioniert so nicht.
Aber wie mein Vorposter schon schrieb könntest du die Waffenliste in eine Datei auslagern und sie über einen fstream aus dieser datei holen.

gruß
syntax

_________________
Die Fehler bei anderen zu suchen ist leicht,
doch sich selbst zu hinterfragen,
gleicht einigen einer Prüfung.
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 11:25:46 19.04.2012   Titel:   Auswahl            Zitieren

Zuerst mal Danke ich werde mir das alles heute und Morgen genau durch lesen und es ausprobieren :D

@Syntax_error
Doch die Waffen möchte ich aufschreiben, aber ich möchte nicht so viel Code haben, sprich irgend wo wird alles angezeigt und mit Switch die Auswahl getroffen, (das ist so gut jedoch..) dann habe ich ja einen Rückgabewert (int c)
welcher dann jede einzelne Waffe mit:
Code:
IF(c=zahl der 1.waffe, zahl der 2.waffe..., zahl der 100.waffe)
{
      waffen werte auf variabeln schreiben;
}

überprüft. Dieser Code der praktisch nur aus IF besteht möchte ich irgendwie kleiner machen ist dies überhaupt möglich?

@Namenloser324
Wenn ich deine Variante nehme habe ich ja dann nur den Code der Waffen aus dem Programm rausgenommen und in einem Textfile jedoch muss dann dies auswahl wieder (nach meiner bis jetzt verwendeten Variante) mit IF erfolgen.
Sehe ich das so richtig?

Gruss

nimda4
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 11:31:37 19.04.2012   Titel:              Zitieren

Nee, das geht mit ein paar Zeilen und deckt alle Fälle ab.

Klasse entsprechend anpassen:

if(Waffenliste.Waffen[EINGABE].kosten <= Geld)
{
Geld = Geld-[...].kosten;
cout << "Waffe " << "Waffenliste.Waffen[EINGABE].name << " gekauft" << endl;
}
else
cout << "Zu wenig Geld" << endl;
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 12:49:53 19.04.2012   Titel:   Frage^^            Zitieren

Danke Namenloser324

Jetzt habe ich nru das Problem das mich das ganze ziemlich verwirrt ^^-.-

Was eine Klasse ist udn ein Objekt und wie ich sie erstelle weiss ich, jedoch verstehe ich das mit der Liste und dem einlesen nicht so ganz.
Ich habe jetzt eine Liste(waffenliste.txt) die wie du gesagt ahst wie folgt aus sieht:

Schwert 19 200
Armbrust 10 100
Dolch 14 150

Ich werde mir jetzt ifstream, vector und fstream ansehen und mich noch mal melden sollte das Problem immer noch bestehen.

Vielen Dank für eure Hilfe, Ihr habt mir schon so gut geholfen in nur so kurzer Zeit :D

Gruss & Merci

nimda4
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 13:17:42 19.04.2012   Titel:   fstream            Zitieren

So gerade eben habe ich mri fstream angeschaut und weiss nun wie ich ein text file einlesen kann, jedoch wie kann ich die Texte beim Lerzeichen trennen udn eineln auf die Klasse speichern :O?

Hab leider nix gescheites mit der sufu gefunden (villeicht bin ich einfach zu blöd -.-)
Hab erst gerade mit dem Programmieren angefangen und verzweifle langsamm^^

Gruss

nimda4
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 13:23:00 19.04.2012   Titel:   fstream            Zitieren

Okei hab jetzt gefunden wie ich es trennen kann

getline(myfile,line,' ');

doch wie kann ich die einzelnen einträge nun speichern?
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 14:22:51 19.04.2012   Titel:              Zitieren

Tja, denk drüber nach, du lädst jetzt ja zeilenweise in einen string.
Strins haben standardmäßig bereits funktionen zum verarbeiten bzw bearbeiten des strings, schau mal hier:

http://www.cplusplus.com/reference/string/string/

Was du brrauchen könntest ist z.B. substr, damit kannste aus einem string teile ausschneiden. Ferner wirst du http://www.cplusplus.com/reference/string/string/find/ das hier brauchen, oder eine ähnliche FUnktion. Damit kannst du nach Leerzeichen suchen und mittels substr alles bis zum ersten Leerzeichen ausschneiden. Dann löscht du am besten eben diesen substring und kannst somit die prozedur einfach weiterführen d.h. wiederholen.
Zum löschen von Teilen des Strings spielst du am besten mit http://www.cplusplus.com/reference/string/string/erase/ rum
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 14:24:22 19.04.2012   Titel:              Zitieren

Achso, am besten du liest eine ganze Zeile ein und weist getline an bitte bis zum Zeichen "\n" einzulesen(das zeichen wird immer dann generiert wenn man enter drückt in einer Textdatei, ist sinngemäß identisch mit std::endl).
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 14:44:29 19.04.2012   Titel:              Zitieren

Eine Sache habe ich noch vergessen:

Wenn du mit den Zahlen(Schaden, Dmg) weiterrechnen möchtest musst du die strings erstmal in Zahlen umwandeln, das geht am leichtesten mit string streams, schau einfach bei google mal nach, ist aber ganz einfach, siehe z.B. hier
http://www.velocityreview ....... 55-string-to-integer.html
arghonaut
Unregistrierter




Beitrag arghonaut Unregistrierter 14:50:14 19.04.2012   Titel:              Zitieren

Und warum wieder getline + string zerpflücken, wenn es ein einfaches cin >> var täte?
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 14:50:49 19.04.2012   Titel:   string            Zitieren

@Namenloser324

Zuerst mal Danke für die Info, aber hab ich bereits gemacht ;)

2. Ich finde gut das du mir nicht gleich die Lösung sagst, sonst würde ich erlich gesagt das ganze gar nicht merh anschauen ^^

Hab mir jetzt vector, fstream/ifstream angesehen jedoch komme ich nicht ganz weiter.

Ich hab jetzt einen string eingelesen aus der Textdatei und der sieht ja dann ungefähr so aus:

Code:
schwert
18
300
 
dolch
14
200


Jetzt muss ich die Daten doch (so wie ich das verstanden habe) zu einem Objekt der Klasse "Waffe" hinzufügen.

Normalerweise mache ich das ja mit z.b:

Code:
waffe schwert;
schwert.dmg=18;
schwert.name="Schwert";
schwert.Preis=300;


Wenn das soweit richtig ist(ist es das?^^), wie kann ich dann machen das mir diese Werte automatisch rein geschrieben werden?

Wenn du nicht gleich die Lösung geben willst dann bitte wenigstens einen Tipp, bin einwenig am verzweifeln :( ^^
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 14:55:48 19.04.2012   Titel:   waffenliste?            Zitieren

Und was ist eigentlich die Waffenliste (die klasse) genau?
Also was für Objekte gehören da rein?
Oder brauche ich die MEthoden für die Objekte der Klasse Waffe?

Das verwirrt mich ein wenig.

Gruss

nimda4
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 14:58:15 19.04.2012   Titel:   warum nicht cin?            Zitieren

arghonaut schrieb:
Und warum wieder getline + string zerpflücken, wenn es ein einfaches cin >> var täte?


bei cin musst du ja selbst die Enter tase besätigen (so weit mir bekannt)
aber ich lese die Werte ja aus einer liste ein, geht das etwa auch mit cin aus eienr Liste?

Gruss Nimda4
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 15:05:38 19.04.2012   Titel:              Zitieren

arghonaut schrieb:
Und warum wieder getline + string zerpflücken, wenn es ein einfaches cin >> var täte?


Keine Ahnung, benutze ich nie. Dann halt damit, mir egal. Soll er halt rumprobieren.
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 15:13:10 19.04.2012   Titel:   Re: string            Zitieren

nimda4 schrieb:

Jetzt muss ich die Daten doch (so wie ich das verstanden habe) zu einem Objekt der Klasse "Waffe" hinzufügen.

Normalerweise mache ich das ja mit z.b:

Code:
waffe schwert;
schwert.dmg=18;
schwert.name="Schwert";
schwert.Preis=300;


Wenn das soweit richtig ist(ist es das?^^), wie kann ich dann machen das mir diese Werte automatisch rein geschrieben werden?

Wenn du nicht gleich die Lösung geben willst dann bitte wenigstens einen Tipp, bin einwenig am verzweifeln :( ^^


Das ist zwar richtig, aber umständlich.

Du schreibst dir z.B. einen Konstruktor in welchem du die strings bzw. die Werte als Parameter übergibst und der Konstruktor bastelt dir daraus automatisch das entsprechende Objekt bzw. lädt das Objekt mit den Daten.
Hab das ganze bereits programmiert, ist zwar hässlich da keine Lust groß nachzudenken, aber funktioniert.


WARNUNG: nicht als beispiel für ordentliches programmieren nehmen, ist sehr geschludert und unschön programmiert. Habe z.B. praktisch keine Kontrollen die den Input auf Fehler prüfen oder ähnliches.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
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()
{
    Waffenliste liste;
    ifstream file("waffen.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;
 
    return 0;
}


Mit der cin variante die vorgeschlagen worden ist geht das aber schöner, aber ich mag cin nicht, kA wieso.
arghonaut
Unregistrierter




Beitrag arghonaut Unregistrierter 15:33:43 19.04.2012   Titel:   Re: warum nicht cin?            Zitieren

nimda4 schrieb:
arghonaut schrieb:
Und warum wieder getline + string zerpflücken, wenn es ein einfaches cin >> var täte?


bei cin musst du ja selbst die Enter tase besätigen (so weit mir bekannt)
aber ich lese die Werte ja aus einer liste ein, geht das etwa auch mit cin aus eienr Liste?

Sorry, klar, war zu schnell abgeschickt. Die Intention sollte aber klar sein, denn den operator>> gibt es für alle streams, somit auch für den ifstream.
Grob skizziert:
C++:
ifstream waffen_file("blubb.txt");
while(Zeilen vorhanden) {
    int schaden, preis;
    string name;
    waffen_file >> name >> schaden >> preis;
}
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 15:35:37 19.04.2012   Titel:              Zitieren

Sorry, aber wäre es nicht sinnvoller lieber mal nach einem Buch zu greifen und die Grundlagen zu lernen anstatt dich irgendwie mit einzelnen Code-Schnipseln "durchzuschlagen" ? Villeicht lässt mich da mein Sinn für Pädagogik im Stich, aber falls der Threadersteller daran interessiert ist, wirklich C++ zu lernen wäre das wohl das Sinnvollste.

Ich meine :
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <csetjmp>
#include <stddef.h>
#include <iostream>
#include <conio.h>
#include <dos.h>
#include <conio.h>
#include <Windows.h>
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 15:40:53 19.04.2012   Titel:   Re: string            Zitieren

Namenloser324 schrieb:
nimda4 schrieb:

Jetzt muss ich die Daten doch (so wie ich das verstanden habe) zu einem Objekt der Klasse "Waffe" hinzufügen.

Normalerweise mache ich das ja mit z.b:

Code:
waffe schwert;
schwert.dmg=18;
schwert.name="Schwert";
schwert.Preis=300;


Wenn das soweit richtig ist(ist es das?^^), wie kann ich dann machen das mir diese Werte automatisch rein geschrieben werden?

Wenn du nicht gleich die Lösung geben willst dann bitte wenigstens einen Tipp, bin einwenig am verzweifeln :( ^^


Das ist zwar richtig, aber umständlich.

Du schreibst dir z.B. einen Konstruktor in welchem du die strings bzw. die Werte als Parameter übergibst und der Konstruktor bastelt dir daraus automatisch das entsprechende Objekt bzw. lädt das Objekt mit den Daten.
Hab das ganze bereits programmiert, ist zwar hässlich da keine Lust groß nachzudenken, aber funktioniert.


WARNUNG: nicht als beispiel für ordentliches programmieren nehmen, ist sehr geschludert und unschön programmiert. Habe z.B. praktisch keine Kontrollen die den Input auf Fehler prüfen oder ähnliches.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
 
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()
{
    Waffenliste liste;
    ifstream file("waffen.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;
 
    return 0;
}


Mit der cin variante die vorgeschlagen worden ist geht das aber schöner, aber ich mag cin nicht, kA wieso.


o.O schludrig? sowas nennst du schludrig?
OMG jetzt fühl ich mich dumm -.-^^

Das ist hamemr von dir ich hab mir jetzt das ganze angesehen und versucht nach zuvollziehen und habe daher noch ein paar kleine Fragen:

1. vector<waffe> Liste; und vector<string> zeile; was machen die genau?

2. liste.add(Waffe(zeile[0],zeile[1],zeile[2])); Verstehe ich so: fügt Schwert, 18, 300 zur liste hinzu als Objekt Waffe. Ist das richtig?

3. for(unsigned int i = 0 ; i<liste.Liste.size();i++); Bildet die Liste oder?


Ich hab das Programm gestartet, es geht auf verschwindet dann wieder (trotz system("pause");) und es erscheint ein Pop Up mit dem Text:
"Debug Assertion Failed!

Programm..\rpg\rpg\Debug\rpg.exe
Filec:\program files(x86)\microsoft visual studio
10.0\vc\include\vector
Line932

Expresion vector subscription out of range

For information on how your programm can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)"

Wie da steht hat das ja demnach etwas mit dem vector zutun?

Vielen Vielen Dank für deine Hilfe bis jetzt du bist mein Held

Gruss

nimda4
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 15:41:39 19.04.2012   Titel:              Zitieren

cvcv schrieb:
Sorry, aber wäre es nicht sinnvoller lieber mal nach einem Buch zu greifen und die Grundlagen zu lernen anstatt dich irgendwie mit einzelnen Code-Schnipseln "durchzuschlagen" ? Villeicht lässt mich da mein Sinn für Pädagogik im Stich, aber falls der Threadersteller daran interessiert ist, wirklich C++ zu lernen wäre das wohl das Sinnvollste.

Ich meine :
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <csetjmp>
#include <stddef.h>
#include <iostream>
#include <conio.h>
#include <dos.h>
#include <conio.h>
#include <Windows.h>


Da hast du sicherlich recht.
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 15:42:45 19.04.2012   Titel:   C++ lernen            Zitieren

cvcv schrieb:
Sorry, aber wäre es nicht sinnvoller lieber mal nach einem Buch zu greifen und die Grundlagen zu lernen anstatt dich irgendwie mit einzelnen Code-Schnipseln "durchzuschlagen" ? Villeicht lässt mich da mein Sinn für Pädagogik im Stich, aber falls der Threadersteller daran interessiert ist, wirklich C++ zu lernen wäre das wohl das Sinnvollste.

Ich meine :
C++:
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#include <string>
#include <time.h>
#include <csetjmp>
#include <stddef.h>
#include <iostream>
#include <conio.h>
#include <dos.h>
#include <conio.h>
#include <Windows.h>


die anderen liybs hab ich drinn wegen meinem restlichen Code ;)
Und ja ich bin am lernen, jedoch hab ich mein Buch bei meiner Freundin vergessen und kann es erst heute Abend holen :(

Gruss

nimda4
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 15:45:46 19.04.2012   Titel:   Re: C++ lernen            Zitieren

[quote="nimda4]
die anderen liybs hab ich drinn wegen meinem restlichen Code ;)
Und ja ich bin am lernen, jedoch hab ich mein Buch bei meiner Freundin vergessen und kann es erst heute Abend holen :(

Gruss

nimda4[/quote]

Den Code will ich sehen ....


Wie heißt denn Dein Buch? (Aus Interesse)
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 15:46:03 19.04.2012   Titel:              Zitieren

wie heißt denn dein buch? Und das du die header alle benötigst für den restlichen code ist zu bezweifeln ;)
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 16:00:28 19.04.2012   Titel:   Re: C++ lernen            Zitieren

cvcv schrieb:
[quote="nimda4]
die anderen liybs hab ich drinn wegen meinem restlichen Code ;)
Und ja ich bin am lernen, jedoch hab ich mein Buch bei meiner Freundin vergessen und kann es erst heute Abend holen :(

Gruss

nimda4


Den Code will ich sehen ....


Wie heißt denn Dein Buch? (Aus Interesse)[/quote]

Ich habe das: http://www.amazon.de/von- ....... qid=1334843823&sr=1-4

kann ich dir den Code per PN oder so was schicken?

es ist ein bisschien viel und sehr amateur haft geschrieben *schäm*
(hab alles selbst geschrieben)

Gruss

nimda4
kingcools
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2008
Beiträge: 89
Beitrag kingcools Mitglied 16:03:37 19.04.2012   Titel:              Zitieren

Hi, ich bin Namenloser.
Jürgen Wolf ist in diesem Forum verschriehen, daher er wohl sehr schlechte Bücher herausbringt.
Kannst du mir deinen Code auch per PN schicken?
nimda4
Unregistrierter




Beitrag nimda4 Unregistrierter 16:05:09 19.04.2012   Titel:   huch?            Zitieren

kingcools schrieb:
Hi, ich bin Namenloser.
Jürgen Wolf ist in diesem Forum verschriehen, daher er wohl sehr schlechte Bücher herausbringt.
Kannst du mir deinen Code auch per PN schicken?


Huch das wusste ich ncith :S

Ich melde mich schnell mit einem account an.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:10:22 19.04.2012   Titel:   Account            Zitieren

So ich hab jetzt einen Account sende dir gleich den Code.

Gruss

nimda4

edit du hast eien Email von mir :)


Zuletzt bearbeitet von nimda4 am 16:13:00 19.04.2012, insgesamt 1-mal bearbeitet
DocShoe
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.04.2008
Beiträge: 1814
Beitrag DocShoe Mitglied 16:16:13 19.04.2012   Titel:              Zitieren

Viel Schlimmer hätte es nicht kommen können... der Autor ist berüchtigt für seine Inkompetenz, was C++ angeht. Du solltest das Buch bei deiner Freundin lassen, vielleicht findet sie noch eine sinnvolle Verwendung dafür. Lernen solltest du daraus besser nicht. Kannst ja spaßeshalber mal hier im Forum suchen, es gibt immer mal wieder Leute, die aus diesem Buch "gelernt" haben und katastrophalen Code präsentieren, der nur vor Fehlern strotzt.
Wenn du wirklich C++ lernen willst solltest du dir ein gutes C++ Buch zulegen, hier im Forum sind einige gelistet.

_________________
Die fünf häufigsten Anzeichen für Faulheit:
1.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:21:31 19.04.2012   Titel:              Zitieren

DocShoe schrieb:
Viel Schlimmer hätte es nicht kommen können... der Autor ist berüchtigt für seine Inkompetenz, was C++ angeht. Du solltest das Buch bei deiner Freundin lassen, vielleicht findet sie noch eine sinnvolle Verwendung dafür. Lernen solltest du daraus besser nicht. Kannst ja spaßeshalber mal hier im Forum suchen, es gibt immer mal wieder Leute, die aus diesem Buch "gelernt" haben und katastrophalen Code präsentieren, der nur vor Fehlern strotzt.
Wenn du wirklich C++ lernen willst solltest du dir ein gutes C++ Buch zulegen, hier im Forum sind einige gelistet.


Wow das ist ja brutal wie hier alle sagen das der so schlecht ist :S
Da kauf ich mir mal ein sinnvolles Buch und es ist nru Schrott -.-
Hab es mir gerade erst am Montag gekauft und jetzt darf ich es schon weg werfen :(^^

Ich werde mir nun ein neues Bestelle wie wäre es mit:

"Visual C++ 2010 Entwicklerbuch: Grundlagen, Techniken, Profi-Know-how"?

Gruss und Danke für die Information xD

nimda4
kingcools
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2008
Beiträge: 89
Beitrag kingcools Mitglied 16:25:17 19.04.2012   Titel:   Re: string            Zitieren

[quote="nimda4"][quote="Namenloser324"]
nimda4 schrieb:


2. liste.add(Waffe(zeile[0],zeile[1],zeile[2])); Verstehe ich so: fügt Schwert, 18, 300 zur liste hinzu als Objekt Waffe. Ist das richtig?

3. for(unsigned int i = 0 ; i<liste.Liste.size();i++); Bildet die Liste oder?


Ich hab das Programm gestartet, es geht auf verschwindet dann wieder (trotz system("pause");) und es erscheint ein Pop Up mit dem Text:
"Debug Assertion Failed!

Programm..\rpg\rpg\Debug\rpg.exe
Filec:\program files(x86)\microsoft visual studio
10.0\vc\include\vector
Line932

Expresion vector subscription out of range

For information on how your programm can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)"

Wie da steht hat das ja demnach etwas mit dem vector zutun?

Vielen Vielen Dank für deine Hilfe bis jetzt du bist mein Held

Gruss

nimda4


1) Also erstmal: lass dich nicht von meiner Namensgebung irritieren, bin sehr schlecht im Finden von passenden Namen für Variablen.
Was die machen steht eigentlich direkt dabei:
Liste ist eine Instanz bzw. ein Objekt vom Typ vector<Waffe>, also im Endeffekt nichts weiter als ein Speicher für Objekte des Typs Waffe.
Speichert also quasi "Waffen" ;)
In vector<string> Zeile hab ich einfach die einzelnen Teile einer Zeile aus der Textdatei gespeichert, also wenn da steht schwert 10 300, dann ist Zeile[0] == "schwert", Zeile[1] == "10"....

2) japp, ruft den Konstruktor von Waffe auf.

3) Nee, das gibt sie in der Konsol aus

hast du denn eine Textdatei am richtigen ort mit dem Namen? Irgendwas scheint da zu groß zu werden bei dir
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5713
Beitrag asc Mitglied 16:28:39 19.04.2012   Titel:              Zitieren

nimda4 schrieb:
Ich werde mir nun ein neues Bestelle wie wäre es mit:

"Visual C++ 2010 Entwicklerbuch: Grundlagen, Techniken, Profi-Know-how"?


Lass die Finger davon und schau in die FAQ. Obiges Buch lehrt nicht C++ sondern C++/CLI was wiederum eine eigenständige Sprache ist, deren Bedeutung eher gering ist.

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.

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:30:53 19.04.2012   Titel:   Re: string            Zitieren

[quote="kingcools"][quote="nimda4"]
Namenloser324 schrieb:
nimda4 schrieb:


2. liste.add(Waffe(zeile[0],zeile[1],zeile[2])); Verstehe ich so: fügt Schwert, 18, 300 zur liste hinzu als Objekt Waffe. Ist das richtig?

3. for(unsigned int i = 0 ; i<liste.Liste.size();i++); Bildet die Liste oder?


Ich hab das Programm gestartet, es geht auf verschwindet dann wieder (trotz system("pause");) und es erscheint ein Pop Up mit dem Text:
"Debug Assertion Failed!

Programm..\rpg\rpg\Debug\rpg.exe
Filec:\program files(x86)\microsoft visual studio
10.0\vc\include\vector
Line932

Expresion vector subscription out of range

For information on how your programm can cause an assertion failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)"

Wie da steht hat das ja demnach etwas mit dem vector zutun?

Vielen Vielen Dank für deine Hilfe bis jetzt du bist mein Held

Gruss

nimda4


1) Also erstmal: lass dich nicht von meiner Namensgebung irritieren, bin sehr schlecht im Finden von passenden Namen für Variablen.
Was die machen steht eigentlich direkt dabei:
Liste ist eine Instanz bzw. ein Objekt vom Typ vector<Waffe>, also im Endeffekt nichts weiter als ein Speicher für Objekte des Typs Waffe.
Speichert also quasi "Waffen" ;)
In vector<string> Zeile hab ich einfach die einzelnen Teile einer Zeile aus der Textdatei gespeichert, also wenn da steht schwert 10 300, dann ist Zeile[0] == "schwert", Zeile[1] == "10"....

2) japp, ruft den Konstruktor von Waffe auf.

3) Nee, das gibt sie in der Konsol aus

hast du denn eine Textdatei am richtigen ort mit dem Namen? Irgendwas scheint da zu groß zu werden bei dir


Danke für die Antowrten das ist ja hammer :D

Ja das file ist am richtigen Ort im Debuger zeigt es mir an das es die Datei eingelesen hat und ich sehe auch Schwert 18 300 und dann macht es den durch udn geht zum nexten.

Geht das Programm so bei dir und welchen Compailer verwendest du?

Gruss

nimda4
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 16:31:41 19.04.2012   Titel:              Zitieren

Google bitte nach Bücherempfehlungen, hier gabs im Forum schon einige Threads über das Thema ( google es trotzdem, die Forensuche ... naja sagen wir mal google kanns besser ;) ).
Mit dem Buch von J.W hast du halt ein ungünstiges erwischt, allerdings ist das auch den Rezensionen zu entehmen. Es gibt viele 5-Sterne, aber einige 1-Sterne deren Kritik sich alle auf fachliches Wissen stützen, ganz im Gegensatz zu den 5-Sterne Kommentatoren, die sich von flüßiger Sprache beeinflussen liesen.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:31:51 19.04.2012   Titel:              Zitieren

asc schrieb:
nimda4 schrieb:
Ich werde mir nun ein neues Bestelle wie wäre es mit:

"Visual C++ 2010 Entwicklerbuch: Grundlagen, Techniken, Profi-Know-how"?


Lass die Finger davon und schau in die FAQ. Obiges Buch lehrt nicht C++ sondern C++/CLI was wiederum eine eigenständige Sprache ist, deren Bedeutung eher gering ist.

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.


Danke für das Angebot schaue mich mal um und komme dann auf dich zurück.

Gruss

nimda4
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:33:15 19.04.2012   Titel:              Zitieren

cvcv schrieb:
Google bitte nach Bücherempfehlungen, hier gabs im Forum schon einige Threads über das Thema ( google es trotzdem, die Forensuche ... naja sagen wir mal google kanns besser ;) ).
Mit dem Buch von J.W hast du halt ein ungünstiges erwischt, allerdings ist das auch den Rezensionen zu entehmen. Es gibt viele 5-Sterne, aber einige 1-Sterne deren Kritik sich alle auf fachliches Wissen stützen, ganz im Gegensatz zu den 5-Sterne Kommentatoren, die sich von flüßiger Sprache beeinflussen liesen.


Sah das buch eben direkt im Laden und der Verkäufer meinte es sei sehr gut (dem sag ich meine Meinung xD) daher habe ich im Internet natürlich nicht nachgelesen (grosser Fehler wie es jetzt scheint ^^).

Danke und Gruss

nimda4
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 16:35:57 19.04.2012   Titel:              Zitieren

kingcools schrieb:
Hi, ich bin Namenloser.
Jürgen Wolf ist in diesem Forum verschriehen, daher er wohl sehr schlechte Bücher herausbringt.
Kannst du mir deinen Code auch per PN schicken?


Wenn du irgendwas zu meinem Code hast den ich dir per Email geschickt habe, kannst du es entweder hier tun oder auch per Email.
Wenn du es per Email machst könntest du mir dann hier im Forum in diesem Topic schnell Bescheid geben, (Meien Email erhält seit einigen Tag sehr viel Spam muss mal nachschauen wiso -.-) damit ich sie suchen kann?

Gruss und nochmals Danke

nimda4
kingcools
Mitglied

Benutzerprofil
Anmeldungsdatum: 14.03.2008
Beiträge: 89
Beitrag kingcools Mitglied 16:39:03 19.04.2012   Titel:              Zitieren

Ich benutze code blocks da funktioniert es ohne probleme.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 11:32:16 23.04.2012   Titel:   Jetziger Stand:            Zitieren

So nach dem ich mich nun mit kingcools unterhalten habe, habe ich nun neu angefangen.
kingcools hat mir einige wichtige Verbesserungen vorgeschlagen welche ich nun am umsetzen bin.
Ich habe bis jetzt 2 Klassen erstell und so sieht das aus:

classes.h
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#pragma once
 
#include "stdafx.h"
 
using namespace std;
 
class Monster
{
  private:
    std::string name;
    int leben;
    int Angriff;
    int Vert;
    int Schaden;
 
  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";
        }
 
    ~Monster() // Destruktor
    {
    }
};
 
class dice
{
    private:
        int zahl;
        int Ergebniss;
   
    public:
        dice()
        :
        zahl(0)
        {
        }
 
        dice(
        int zahl)
        :zahl(zahl)
        {
        }
 
        void roll()
        {
            int zahln=zahl-1;
            Sleep(730); //Sleep für Verzögerung
            srand((unsigned)time(NULL));    //Zufallsfunktion anhand aktueler Zeit
            Ergebniss=(rand()%zahln)+1; //Zufallsfunktion Einschränkung auf 1-20
            cout <<"\nSie haben " <<Ergebniss <<" gewuerfelt\n"; //Ausgabe Zufalszahl
            Sleep(100); //Sleep für Verzögerung
        }
};


g.cpp
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// objektorientiertes_rpg.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <vector>
#include <iostream>
#include "classes.h"
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    Monster Oger("Oger", 100,10,12,30); //Leben, Angriff, Vert, Schaden
    Monster Pferd("Pferd", 200,20,22,20);
 
    Oger.test(); //Testfunktion
    Pferd.test();//Testfunktion
 
    dice W20(20);//Testfunktion
    W20.roll();//Testfunktion
   
    system("pause");
}



Ist das bis jetzt richtig?

Ich möchte nun eine Kampf-funktion schreiben, muss ich dafür eine neue Klasse machen oder eine Methode der Klasse Monster hinzufügen?

Und wie kann ich dann z.b den Würfel bzw eine Objekt der Klasse Monster und ein Objekt der Klasse dice verwenden.

sprich.

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
[b]Oger[/b](obj der kalsse monster) [i]würfelt W20[/i](obj der Klasse dice);
 
if([i]würfel W20[/i]<=Anriff [b]Oger[/b])
{
     [b]Mensch[/b](2tes Obj der klasse Monster) [i]würfelt W20[/i];
     if([i]würfel W20[/i]>=[b]Verteidigung [/b]des obj Mensch)
     {
         [b]leben Mensch [/b]- [b]schaden Oger[/b]    
     }
}
.
.
.


Ist das irgendwie überhaupt möglich?
Hab schon gestern den ganzen Tag herum getestet.

Gruss&Danke

Nimda4
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 11:50:57 23.04.2012   Titel:              Zitieren

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
}
}
}
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 12:23:58 23.04.2012   Titel:   Antwort            Zitieren

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.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 12:27:29 23.04.2012   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 13:04:04 23.04.2012   Titel:              Zitieren

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?:

Code:
void kampffunktion(Mensch,Monster1)
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 14:49:16 23.04.2012   Titel:              Zitieren

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

Also:
Wenn du deine Funktion wie folgt definierst:

C++:
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).
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 14:50:39 23.04.2012   Titel:              Zitieren

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

C++:
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.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 08:16:45 24.04.2012   Titel:              Zitieren

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

C++:
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 :D

Gruss

Nimda4
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 10:06:08 25.04.2012   Titel:   Frage            Zitieren

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 :D

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:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
[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
Code:
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
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
Beitrag Belli Mitglied 10:24:12 25.04.2012   Titel:   Re: Frage            Zitieren

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.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 10:29:23 25.04.2012   Titel:   Re: Frage            Zitieren

[/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?

C++:
1
2
3
4
5
6
7
8
9
10
11
[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


Zuletzt bearbeitet von nimda4 am 10:45:46 25.04.2012, insgesamt 1-mal bearbeitet
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
Beitrag Belli Mitglied 11:07:59 25.04.2012   Titel:              Zitieren

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

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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.
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 12:14:30 25.04.2012   Titel:              Zitieren

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.
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 13:28:55 25.04.2012   Titel:              Zitieren

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

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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 :D

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:
Code:
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 :D
Macht so viel mehr Spass und langsamm verstehe ich einig ezusammenhänge. Aber natürlich werde ich noch das Buch durcharbeiten.

Gruss Nidma4
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5713
Beitrag asc Mitglied 13:50:29 25.04.2012   Titel:              Zitieren

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.

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
asc
Mitglied

Benutzerprofil
Anmeldungsdatum: 13.01.2007
Beiträge: 5713
Beitrag asc Mitglied 13:52:02 25.04.2012   Titel:              Zitieren

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)

_________________
in theory there's no difference between theory and practice. in practice there is. (yogi berra)

In der Theorie gibt es kein Unterschied zwischen Theorie und Praxis. In der Praxis sehr wohl.
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
Beitrag Belli Mitglied 13:55:06 25.04.2012   Titel:              Zitieren

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

C++:
1
2
3
4
5
6
7
8
9
10
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;
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 14:15:12 25.04.2012   Titel:              Zitieren

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

C++:
1
2
3
4
5
6
7
8
9
10
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
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 14:16:32 25.04.2012   Titel:              Zitieren

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 :D

Gruss

Nimda4


Zuletzt bearbeitet von nimda4 am 14:17:03 25.04.2012, insgesamt 1-mal bearbeitet
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 12:44:01 26.04.2012   Titel:              Zitieren

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

Ich habe ja folgende Klasse:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[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
Namenloser324
Unregistrierter




Beitrag Namenloser324 Unregistrierter 12:50:05 26.04.2012   Titel:              Zitieren

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
}
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 13:57:56 26.04.2012   Titel:              Zitieren

Namenloser324 schrieb:
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
}


also ungefähr so?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[code]
class Ich
{
 public:
 status werte;
 
 friend class Monster;
 
{
}
void kampf(std::vector<Monster> Gegnergruppe)
{
    // Kampvorgang
}
};
[/code]

C++:
[code]
class Monster
{
  status werte;
};
[/code]


Ist das so richtig?
Oder hast du gerade so ein Beispiel welches du posten könntest?

Gruss

Nimda4
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 16:44:05 26.04.2012   Titel:              Zitieren

Wieso muss es denn per value sein ?
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 09:45:50 27.04.2012   Titel:              Zitieren

cvcv schrieb:
Wieso muss es denn per value sein ?


Muss es nicht, mir ist jede möglichkeit recht so fern sie Ihren Zweck erfüllt :)

Gruss

Nimda4
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 12:53:55 27.04.2012   Titel:              Zitieren

Für mich ist einfach das Problem wie ich eine Kampffunktion machen kann, die folgende Sachen kann:

Meine Statuswerte verwendem, die des Gegners.

die methode roll von der kalsse dice verwenden und die ausgegebenen Werte mit den Statuswerten vergleichen.

beispiel:

Ausgabe: meinName, ihr dürft angreiffen.
dice roll() WürfelWürfeln.
wenn WürfelWürfel <=meinAngriff, dann Treffer
sonst ausgabe Troll darf angreiffen...


Gruss

nimda4
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 15:02:24 27.04.2012   Titel:              Zitieren

Naja, dazu war doch der Vorschlag mit dem vektor ... ?

C++:
1
2
3
4
5
6
7
8
9
10
11
 ...
 
std::vector<Monster> mobs;
mobs.push_back(someMobInstance1); // Einfach den Vektor mit den existierenden Instanzen deiner Monster-Klasse befüllen
mobs.push_back(someMObInstance2);
fight(mobs); // Den befüllten Vektor an deine Kampf-Funktion übergeben
 ...
void fight ( std::vector<Monster>& mobs ) {
     // Jetzt kannst du hier wunderbar auf die Werte der einzelnen Monster-Instanzen zugreifen und dein komisches Roll-Gedöns da machen ;)
   
}
nimda4
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
Beitrag nimda4 Mitglied 15:51:28 27.04.2012   Titel:              Zitieren

cvcv schrieb:
Naja, dazu war doch der Vorschlag mit dem vektor ... ?

C++:
1
2
3
4
5
6
7
8
9
10
11
 ...
 
std::vector<Monster> mobs;
mobs.push_back(someMobInstance1); // Einfach den Vektor mit den existierenden Instanzen deiner Monster-Klasse befüllen
mobs.push_back(someMObInstance2);
fight(mobs); // Den befüllten Vektor an deine Kampf-Funktion übergeben
 ...
void fight ( std::vector<Monster>& mobs ) {
     // Jetzt kannst du hier wunderbar auf die Werte der einzelnen Monster-Instanzen zugreifen und dein komisches Roll-Gedöns da machen ;)
   
}


o.O wow.

Danke viel mals bin am rumtesten, hab nur noch 2 kleine Probleme:

es sagt mir bei fight(mobs); "error C3861: 'fight': identifier not found."

und was wenn ich ein Objekt einer anderen Klasse mit mehr parametern verwenden möchte? (habs ausprobiert so gehts nicht :( )

Gruss

Nimda4


Zuletzt bearbeitet von nimda4 am 15:57:37 27.04.2012, insgesamt 2-mal bearbeitet
cvcv
Unregistrierter




Beitrag cvcv Unregistrierter 16:38:13 27.04.2012   Titel:              Zitieren

Werd mal konkret, bitte. Wenn du die fight-funktion auch für eine andere Klasse haben willst, dann gibt ihr entweder einen 2. Parameter mit einem std::vector<AndereKlasse>& oder du überlädst die Funktion. -> Google.

Zu Deinem Fehler : Forward-Declaration, schreib den die Funktionssignatur vor deine main() :
C++:
void fight( std::vector<Monster>& );
c++.de :: C++ (auch C++0x und C++11) ::  C++ Einkaufsliste aber wie?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.