Malarkey 1 Autor Melden Geschrieben 11. März 2012 (bearbeitet) Danke schonmal! return 0 war leider nicht der Fehler. Habe jetzt herausgefunden, dass der Fehler nur passiert, wenn ich am Anfang sage, "Ja, letzten Spielstand laden", also J oder j eingebe. Vermutlich läuft beim schreiben und laden etwas falsch. Das sieht mir eh noch sehr unprofessionell aus. Mach ich irgendwo einen Fehler da? Denn, wenn ich am Anfang nichts lade, geht alles einwandfrei... Vielleicht ein Fehler beim laden der Klasseninstanzen? Hier mal die load() und save(), alleine, falls man sie im Chaos da nicht findet Hatte eben entdeckt, dass ich den Ladestream nicht geschlossen hab. War aber auch nicht der entscheidende Fehler... bool save() { fstream f; f.open("thevillage/spielstand.dat", ios::out | ios::binary); if(f) { f << wood << endl; f << iron << endl; f << stone << endl; f << food << endl; f << gold << endl; f <<experience << endl; f <<prestige << endl; f <<xWood << endl; f <<xStone << endl; f <<xIron << endl; f <<xGold << endl; f <<xFood << endl; f <<inhabitants << endl; f <<::bWoodmine << endl; f <<::bIronmine << endl; f <<::bStonemine << endl; f <<::bFarm << endl; f <<::bMarketplace << endl; f <<::bKaserne << endl; f <<::fighter << endl; f <<::horsefighter << endl; f <<::swordfighter << endl; f <<::bowfighter << endl; f <<::dialogCounter << endl; f.write((char *)&marketplace, sizeof(marketplace)); f.write((char *)&ironmine, sizeof(ironmine)); f.write((char *)&woodmine, sizeof(woodmine)); f.write((char *)&stonemine, sizeof(stonemine)); f.write((char *)&farm, sizeof(farm)); f.write((char *)&kaserne, sizeof(kaserne)); f.close(); return true; } else return false; } bool load() { fstream f; string s; f.open("thevillage/spielstand.dat", ios::in | ios::binary); if(f) { stringstream ss1; getline(f,s); ss1 << s; ss1 >> wood; stringstream ss2; getline(f,s); ss2 << s; ss2 >> iron; stringstream ss3; getline(f,s); ss3 << s; ss3 >> stone; stringstream ss4; getline(f,s); ss4 << s; ss4 >> food; stringstream ss5; getline(f,s); ss5 << s; ss5 >> gold; stringstream ss6; getline(f,s); ss6 << s; ss6 >> experience; stringstream ss7; getline(f,s); ss7 << s; ss7 >> prestige; stringstream ss8; getline(f,s); ss8 << s; ss8 >> xWood; stringstream ss9; getline(f,s); ss9 << s; ss9 >> xStone; stringstream ss10; getline(f,s); ss10 << s; ss10 >> xIron; stringstream ss11; getline(f,s); ss11 << s; ss11 >> xGold; stringstream ss12; getline(f,s); ss12 << s; ss12 >> xFood; stringstream ss13; getline(f,s); ss13 << s; ss13 >> inhabitants; stringstream ss14; getline(f,s); ss14 << s; ss14 >> bWoodmine; stringstream ss15; getline(f,s); ss15 << s; ss15 >> bIronmine; stringstream ss16; getline(f,s); ss16 << s; ss16 >> bStonemine; stringstream ss17; getline(f,s); ss17 << s; ss17 >> bFarm; stringstream ss18; getline(f,s); ss18 << s; ss18 >> bMarketplace; stringstream ss19; getline(f,s); ss19 << s; ss19 >> bKaserne; stringstream ss20; getline(f,s); ss20 << s; ss20 >> fighter; stringstream ss21; getline(f,s); ss21 << s; ss21 >> horsefighter; stringstream ss22; getline(f,s); ss22 << s; ss22 >> swordfighter; stringstream ss23; getline(f,s); ss23 << s; ss23 >> bowfighter; stringstream ss24; getline(f,s); ss24 << s; ss24 >> ::dialogCounter; f.read((char *)&marketplace, sizeof(marketplace)); f.read((char *)&ironmine, sizeof(ironmine)); f.read((char *)&woodmine, sizeof(woodmine)); f.read((char *)&stonemine, sizeof(stonemine)); f.read((char *)&farm, sizeof(farm)); f.read((char *)&kaserne, sizeof(kaserne)); return true; } else return false; } Bearbeitet 11. März 2012 von Malarkey
Bulletproof0000 0 Melden Geschrieben 11. März 2012 (bearbeitet) Bei load() öffnest du die Datei für den Speicherstand ja, aber schließt sie nicht. Bei save() öffnest du sie nochmal (müsst doch offen sein?) und schließt sie danach auch korrekt. Vielleicht liegt da ja der Fehler (kenn mich mit C++ nicht so aus, ähnliches tritt aber auch bei Java auf) E: late und dann nichtmal die richtige Antwort... Schande über mich Bearbeitet 11. März 2012 von Bulletproof0000
Malarkey 1 Autor Melden Geschrieben 11. März 2012 Danke für die Antwort! Hatte ich eben auch gesehen, leider war es nicht der Fehler. Kurioserweise ging dass mit dem laden und speichern bis vor unbestimmte Zeit. Danach hab ich mich an ein paar weitere Funktionen gemacht, vllt. ein wenig dran rumgeschruabt an der Load, aus Zeitgründen aber nicht mehr so häufig gespeichert... Und auf einmal gings nicht mehr...
Bulletproof0000 0 Melden Geschrieben 11. März 2012 Hm... Wie sieht das mitm Exception Handling bei C++ aus? Kommst du an mehr Informationen wenn du die Exception (try catch um den Code in der main) abfängst?
Malarkey 1 Autor Melden Geschrieben 11. März 2012 Ah, genau.. Das mache ich jetzt mal. Ah, just in diesem Moment: Habe mal bei der Load-Funktion die Klasseninstanzen rausgenommen und voila: Es geht. Sicherlich liegt der Fehler dann in dem Code-Schnipsel hier: /*f2.read((char *)&marketplace, sizeof(marketplace)); f2.read((char *)&ironmine, sizeof(ironmine)); f2.read((char *)&woodmine, sizeof(woodmine)); f2.read((char *)&stonemine, sizeof(stonemine)); f2.read((char *)&farm, sizeof(farm)); f2.read((char *)&kaserne, sizeof(kaserne));*/ Wird dem File überhaupt gesagt, wo er stonemine und so lesen soll? Oder liest der immer vom Anfang? Weil ein getline ist das ja eigentlich nicht oder? Die Klasse der Instanzen ist in der build.h und heißt: #include <iostream> #include <string> using namespace std; class buildings { private: float c_wood, c_iron, c_stone, c_food, c_gold; float m_wood, m_iron, m_stone, m_gold, m_food, m_prestige, m_experience; string aName; float level; public: void build(float *wood, float *iron, float *stone, float *gold, float *food, float *m_prestige, float *experience, float *m_wood, float *m_iron, float *m_stone, float *m_gold, float *m_food); buildings(); void setKosten(); void getKosten(); bool check(float wood, float iron, float stone, float gold, float food); float getLevel(); float setLevel(float _level_); void InitValues(float c_wood, float c_iron, float c_stone, float c_food, float c_gold, float m_wood, float m_iron, float m_stone, float m_gold, float m_food, float m_prestige, string aName); };
Bulletproof0000 0 Melden Geschrieben 11. März 2012 Wenn ich das richtig sehe ist das die Dokumentation dazu, oder? http://www.cplusplus.com/reference/iostream/istream/read/ Der liest dann normal vom Anfang (immer so viele chars, wie du ihm angibst (sizeof(XY)). Speichern tust du ja Zeilenweise. Vielleicht liegt hier das Problem begraben.
Malarkey 1 Autor Melden Geschrieben 11. März 2012 Ja, das meine ich auch... Nur leider fehlt mir das Wissen, wie ich diesen Fehler umgehen könnte, abgesehen für jedes Objekt ein einzelnes File anzulegen, was ja ein wenig Overkill wäre, oder?!
Bulletproof0000 0 Melden Geschrieben 11. März 2012 (bearbeitet) Wie das mit Zeilenweise lesen bei C++ aussieht weiß ich leider auch nicht. Vielleicht erstmal lesen bis dann ein Zeilenumbruch kommt. Alles davor ist dann halt dein gesuchtes Objekt. Und mit der nächsten Zeile dann wieder so. Oder das ganze in strukturieren (bestimmte Zeichen, die kennzeichnen das jetzt ein neues Objekt kommt, am besten mit Angabe der Länge). Eventuell wäre es auch möglich mit bytes zu arbeiten. Erst ein int mit der Länge des Objekts, dann wird genau diese Länge eingelesen (dabei handelt sich um das Objekt). Wenn dann nochmal ein int kommt, wieder die gleiche Prozedur, kommt nix mehr ist er fertig mit einlesen. Vielleicht gehts aber auch mit chars komfortabler, da fehlen mir die C++ Kenntnisse :/ Vielleicht bringen dir die Ideen ja was Bearbeitet 11. März 2012 von Bulletproof0000
Malarkey 1 Autor Melden Geschrieben 11. März 2012 (bearbeitet) Hm ok... Aber die Lademethode kann ja eh noch nicht das Gelbe vom Ei sein. zb möchte ich jetzt ein bool array von der größe 30 speichern und laden. Dazu müsste ich mit meiner jetzigen Methode 30 stringstream objekte anlegen. Geht das nicht auch mit einer for-Schleife und nur einem Stringstream? Meine Versuche sind bisher kläglich gescheitert... Bisherige Load und Save Funktion: bool save() { fstream f; f.open("thevillage/spielstand.dat", ios::out | ios::binary); if(f) { f << wood << endl; f << iron << endl; f << stone << endl; f << food << endl; f << gold << endl; f <<experience << endl; f <<prestige << endl; f <<xWood << endl; f <<xStone << endl; f <<xIron << endl; f <<xGold << endl; f <<xFood << endl; f <<inhabitants << endl; f <<::bWoodmine << endl; f <<::bIronmine << endl; f <<::bStonemine << endl; f <<::bFarm << endl; f <<::bMarketplace << endl; f <<::bKaserne << endl; f <<::fighter << endl; f <<::horsefighter << endl; f <<::swordfighter << endl; f <<::bowfighter << endl; f <<::dialogCounter << endl; f.write((char *)&marketplace, sizeof(marketplace)); f.write((char *)&ironmine, sizeof(ironmine)); f.write((char *)&woodmine, sizeof(woodmine)); f.write((char *)&stonemine, sizeof(stonemine)); f.write((char *)&farm, sizeof(farm)); f.write((char *)&kaserne, sizeof(kaserne)); f.close(); return true; } else return false; } bool load() { fstream f; string s; f.open("thevillage/spielstand.dat", ios::in | ios::binary); if(f) { stringstream ss1; getline(f,s); ss1 << s; ss1 >> wood; stringstream ss2; getline(f,s); ss2 << s; ss2 >> iron; stringstream ss3; getline(f,s); ss3 << s; ss3 >> stone; stringstream ss4; getline(f,s); ss4 << s; ss4 >> food; stringstream ss5; getline(f,s); ss5 << s; ss5 >> gold; stringstream ss6; getline(f,s); ss6 << s; ss6 >> experience; stringstream ss7; getline(f,s); ss7 << s; ss7 >> prestige; stringstream ss8; getline(f,s); ss8 << s; ss8 >> xWood; stringstream ss9; getline(f,s); ss9 << s; ss9 >> xStone; stringstream ss10; getline(f,s); ss10 << s; ss10 >> xIron; stringstream ss11; getline(f,s); ss11 << s; ss11 >> xGold; stringstream ss12; getline(f,s); ss12 << s; ss12 >> xFood; stringstream ss13; getline(f,s); ss13 << s; ss13 >> inhabitants; stringstream ss14; getline(f,s); ss14 << s; ss14 >> bWoodmine; stringstream ss15; getline(f,s); ss15 << s; ss15 >> bIronmine; stringstream ss16; getline(f,s); ss16 << s; ss16 >> bStonemine; stringstream ss17; getline(f,s); ss17 << s; ss17 >> bFarm; stringstream ss18; getline(f,s); ss18 << s; ss18 >> bMarketplace; stringstream ss19; getline(f,s); ss19 << s; ss19 >> bKaserne; stringstream ss20; getline(f,s); ss20 << s; ss20 >> fighter; stringstream ss21; getline(f,s); ss21 << s; ss21 >> horsefighter; stringstream ss22; getline(f,s); ss22 << s; ss22 >> swordfighter; stringstream ss23; getline(f,s); ss23 << s; ss23 >> bowfighter; stringstream ss24; getline(f,s); ss24 << s; ss24 >> ::dialogCounter; f.read((char *)&marketplace, sizeof(marketplace)); f.read((char *)&ironmine, sizeof(ironmine)); f.read((char *)&woodmine, sizeof(woodmine)); f.read((char *)&stonemine, sizeof(stonemine)); f.read((char *)&farm, sizeof(farm)); f.read((char *)&kaserne, sizeof(kaserne)); return true; } else return false; } Bearbeitet 11. März 2012 von Malarkey
Jeronimo 0 Melden Geschrieben 11. März 2012 (bearbeitet) Vielen Dank erstmal. Python schont wohl nicht so das Wahre zu sein? Ic dachte das wäre so ne super duper moderne Cross Plattform Sprache. Ich hatte vor einer Weile mal mit Lua begonnen, u.a., weil man damit für TS3 und HLSW Erweiterungen scripten kann. An sich eine syntaktisch sehr schöne Sprache, cross-platform, recht umfangreiche Sammlung von Binds für alles mögliche (z.B. GUI) vorhanden und dennoch kompakt und sauschnell, für ne Scriptsprache. Ich hab's dennoch irgendwann aufgegeben und das einfach nur aus dem Grund, weil's keine ausreichende Dokumentation dafür gibt. Alle positiven Aspekte der Sprache sind quasi nichtig, wenn du nirgendswo ne gescheite detailierte Anleitung und Beschreibung dazu findest. Die Doku bestand im Wesentlichen aus einer .chm- Hilfedatei für den Kern der Sprache, was bei dem Umfang der Sprache schlicht nicht ausreicht. Und hier bin ich dann zu Python übergelaufen, das zur "Philosophie" von Lua eigentlich recht ähnlich ist, aber den wesentlichen Unterschied dazu hat, dass man hier massenweise Online-Dokus/Tutorials und auch Diskussions-Threads in z.B. stackoverflow findet, wo im Grunde keine Frage offen bleibt, egal wie tief man in die Materie vordringen möchte. Zumindest, sofern es um die Funktionalitäten der Sprache selber geht. Das ist finde ich ein absolutes Pro-Argument für Python und auch jede andere Sprache, die darüber verfügt, was man auf keinen Fall vernachlässigen sollte. Abgesehen davon, dass es einfach "hübsch" ist - also für mich persönlich schon "das Wahre". Natürlich ist es aber auch nur eine Scriptsprache, sodass man sich genau überlegen sollte, für was man es braucht und ob man es dafür sinnvoll einsetzen kann. Ob performancerelevantes wie Spiele à la DirectX und OpenGL überhaupt damit möglich ist, weiß ich nicht, da wäre Python aber sicher nicht meiner erste Wahl. Für alles andere (Console, GUI, Web, DB, ...) würde ich es zur Zeit - unter Vorbehalt - jeder anderen Sprache vorziehen! Hier noch ne nette Demonstration dessen, was die Sprache kann: http://thedailywtf.com/Articles/The-Regex-Code-Review.aspx Der gleiche Code, nur stabiler und effektiver, in Python: def doc_contains_at_least_one_term( terms, body ): return any((term in body for term in terms)) (aus einem Kommentar entnommen, hätte ich selber auch nicht so kurz hinbekommen) Bearbeitet 11. März 2012 von Jeronimo
Dayjay 796 Melden Geschrieben 11. März 2012 Für alles andere (Console, GUI, Web, DB, ...) würde ich es zur Zeit - unter Vorbehalt - jeder anderen Sprache vorziehen! Danke. Mehr will ich ja auch nicht machen. Weißt du zufällig ob Tools wie Py2Exe,Py2App und Freeze ausgereift sind? Also Tools für Stand Alone Binaries. C++ und die Qt hab ich mir die Tage kurz angeschaut. Qt gefällt mir wirklich sehr gut. Das ist ja nicht nur ein Gui sondern gleich ein ganzes Framework (das wusste ich vorher nicht )
Bulletproof0000 0 Melden Geschrieben 11. März 2012 Geht das nicht auch mit einer for-Schleife und nur einem Stringstream? Bei der Frage muss ich leider passen. In Java kann man Streams so lange nutzen wie man möchte (und natürlich auch was reinkommt ), also würde mich das doch sehr wundern wenns bei C++ nicht ginge. Natürlich nur, wenn man bei der gleichen Quelle (Datei, Socket, etc.) bleibt, was aber hier ja der Fall ist. Weißt du zufällig ob Tools wie Py2Exe,Py2App und Freeze ausgereift sind? Py2Exe funktioniert glaub ganz gut. Dieses Projekt verwendet, so weit ich weiß, Py2Exe. Jedenfalls ist es in Python geschrieben und wird als exe ausgeliefert. Eventuell mal beim Entwickler anfragen, falls Jeronimo keine Informationen dazu hat.
Jeronimo 0 Melden Geschrieben 11. März 2012 (bearbeitet) [...] falls Jeronimo keine Informationen dazu hat. Nein, leider noch keine Erfahrungen damit gemacht. Wäre für closed-source- Projekte aber sicher interessant. Was ich weiß ist, dass z.B. World of Tanks in Bytecode übersetzte Python-Scripts für diverse Sachen nutzt (.pyc-Dateien im Spieleordner). Ist vielleicht ne Möglichkeit, die ersten neugierigen DAUs vom "Rumschnüffeln" abzuhalten. Im Grunde dürfte es sich damit ähnlich verhalten wie bei .NET und Java, wo die Programme ja auch nur in Bytecode (CIM etc.) für die VM übersetzt werden und entsprechend reverse-engineerd werden können - einfacher jedenfalls, als von compiletem Code wie bei C/C++ ausgehend. edit: Hier steht das auch noch mal so in etwa. Und hier gibt's sogar direkt auf der Python-Seite einen Dissambler. ^^ edit2: Von hier: http://stackoverflow.com/questions/1318311...-cons-of-py2exe Pros: - Your app becomes standalone, can run on a PC without Python Cons: - False sense of security, your app is still interpreted, it's just that the script is no longer visible but the byte code is and AFAIK it can be easily converted back to the source. - Large application size, the simplest script packaged with py2exe becomes several megabytes in size. - Potential problems, in certain cases(mostly if you use encodings) you need to retest your application as an exe and make sure everything works as expected, you may need to check in the code to find out if you are running inside py2exe and do something special. - May not work if your application depends on certain third-party python modules. Das dürfte deine Fragen diesbzgl. eigentlich beantworten. Wäre für "top-secret" closed-source also nicht empfehlenswert. Bearbeitet 11. März 2012 von Jeronimo
Malarkey 1 Autor Melden Geschrieben 11. März 2012 (bearbeitet) Wenns mal jemand auf Kompabilität prüfen könnte: http://www.file-upload.net/download-418073...illage.exe.html Bearbeitet 11. März 2012 von Malarkey
Malarkey 1 Autor Melden Geschrieben 12. März 2012 Hi.... Hier void ::eventFunction() { taxes(start); ::nympth.calculateAll(wood, stone,food,iron,gold); ::isabell.calculateAll(wood, stone,food,iron,gold); ::malark.calculateAll(wood, stone,food,iron,gold); ::tresla.calculateAll(wood, stone,food,iron,gold); ::skott.calculateAll(wood, stone,food,iron,gold); ::gregor.calculateAll(wood, stone,food,iron,gold); ::tammo.calculateAll(wood, stone,food,iron,gold); ::ariana.calculateAll(wood, stone,food,iron,gold); ::finmor.calculateAll(wood, stone,food,iron,gold); } durchlauf ich jeden Durchgang alle anfallenden Funktionen. die Objekte sind Gegenspieler, die mit einem Handeln können, gegen einen kämpfen etc. So nun, beim Handelssystem passiert folgender Fehler: Die Wahrscheinlichkeit, dass ein Computerspieler einen Handel vorschlägt soll 1/20 betragen. Dies habe ich so eingebaut: trade = rand() % 20; if(trade == 1) Bis dahin klappt auch Alles. Ab und zu wird ein Angebot rausgeschmissen, aber nur von Nymph, dh. dem, der als erstes aufgerufen wurde. Und ab und an passiert es, dass nach ihm ALLE ein Angebot stellen. Jedoch nie als erstes. Dh, an Nymph 'geht kein Weg vorbei'. Da frage ich mich: Hab ich die Zufallsvariabel falsch definiert? Bleibt die konstant? Und warum wird nur Nymph aufgerufen? Der Aufrufscode sieht folgendermaße aus: Deklaration player ariana("Ariana"), gregor("Gregor"), malark("Malark"), skott("Skott"), finmor("Finmor"), tresla("Tresla"), isabell("Isabell"), nympth("Nympth"); Klasse Woran kann das liegen? #include <iostream> class player { private: char *name; int initNumber; int iStatusToPlayer; int iStatusToAi[12]; int prosperty; int forceStrength; int development; int timesTradedWithPlayer;// Variable der Entwicklung, // welche jedes Mal um enen Bestimmten Prozentwert geändert wird. Verhindert zu starke Sprünge in "Prosperty" float aiWood, aiStone, aiIron, aiGold, aiFood, aiHumor; int aiInhabitants; bool bStatusToPlayer; //Enemy or Friend? bool bStatusToPlayerAlly; // Verbündeter? bool bStatusToAi[9]; // True = Neutral / False = Feind bool bStatusToAiAlly[9]; // True = Verbündet / False = / public: player(char* _name) : name(_name) { this->iStatusToPlayer = 0; this->prosperty = 0; this->forceStrength = 0; this->aiWood = 100; this->aiStone = 100; this->aiIron = 100; this->aiFood = 100; this->aiGold = 100; this->aiHumor = -1.0f; this->aiInhabitants = 100; this->development = 0; this->timesTradedWithPlayer = 0; for(int i = 0; i<sizeof(this->bStatusToAi);i++) { this->bStatusToAi[i] = true; this->bStatusToAiAlly[i] = false; } this->bStatusToPlayer = true; this->bStatusToPlayerAlly = false; } void calculateDevelopment(); void calculateRessources(); void calculateStatusToAi(); void calculateStatusToPlayer(); void calculateForceStrengthAndHumor(); void calculateAll(float &lWood, float &lStone, float &lFood, float &lIron, float &lGold); void checkEvents(); // Kontrolliert ob irgendwelche Werte besonders niedrig sind. Wenn ja, löst es Folgen aus void tradeWithPlayer(float &lWood, float &lStone, float &lFood, float &lIron, float &lGold); }; Und die hier Cpp datei der Klasse (bzw der relevante teil) void player::calculateAll(float &lWood, float &lStone, float &lFood, float &lIron, float &lGold) { calculateDevelopment(); calculateForceStrengthAndHumor(); //this->calculateRessources(); //this->calculateStatusToAi(); //this->calculateStatusToPlayer(); checkEvents(); tradeWithPlayer(lWood, lStone, lFood, lIron, lGold); } void player::tradeWithPlayer(float &lWood, float &lStone, float &lFood, float &lIron, float &lGold) { string str1, str2; time(&t); srand((unsigned int)t); int trade; trade = rand() % 20; float *ptr1, *ptr2; if(trade == 1) { int item1; int item2; int itemMaxGive, itemMaxTake; int numbersGive, numbersTake; do { item1 = rand() % 5; item2 = rand() % 5; if(item1==0) item1++; if(item2==0) item2++; switch(item1) { case 1: { itemMaxTake = lWood; str1 = "Holz"; ptr1 = &lWood; break; } case 2: { itemMaxTake = lIron; str1 = "Eisen"; ptr1 = &lIron; break; } case 3: { itemMaxTake = lStone; str1 = "Stein"; ptr1 = &lStone; break; } case 4: { itemMaxTake = lGold; str1 = "Gold"; ptr1 = &lGold; break; } case 5: { itemMaxTake = lFood; str1 = "Nahrung"; ptr1 = &lFood; break; } } switch(item2) { case 1: { itemMaxGive = aiWood; str2 = "Holz"; ptr2 = &lWood; break; } case 2: { itemMaxGive = aiIron; str2 = "Eisen"; ptr2 = &lIron; break; } case 3: { itemMaxGive = aiStone; str2 = "Stein"; ptr2 = &lStone; break; } case 4: { itemMaxGive = aiGold; str2 = "Gold"; ptr2 = &lGold; break; } case 5: { itemMaxGive = aiFood; str2 = "Nahrung"; ptr2 = &lFood; break; } } }while(itemMaxGive == 0); numbersGive = rand() % itemMaxGive; numbersTake = rand() % itemMaxGive*1.5f; char choice; bool choiceOK = false; while(choiceOK == false) { cout << name << " macht ihnen ein Handelsangebot: " << endl; cout << numbersGive << " " << str1 << " gegen " << numbersTake << " " << str2 << endl; cout << "Moechten sie annehmen? [J]a oder [N]ein" << endl; cin >> choice; if(!cin.fail()) { if(choice == 'J' || choice == 'j' ) { if(*ptr1>=numbersTake) { *ptr1 -= numbersTake; *ptr2 += numbersGive; cout << "<" << name << "> Es freut mich, mit ihnen gehandelt zu haben!" << endl; cin.sync(); cin.get(); } else { cout << "Du hast nicht genug Rohstoffe fuer diesen Handel!" << endl; cin.sync(); cin.get(); } choiceOK = true; } if(choice == 'N' || choice == 'n') { cout << "<" << name << "> Jedem das Seine..." << endl; cin.sync(); cin.get(); choiceOK = true; } } } } trade = rand() % 20; }