L
Habe mir das Spiel mal kurz angesehen.
Zuerst habe ich es mal ausprobiert, bevor ich den Sourcecode angeschaut habe :). Was mir aufgefallen ist: Vielleicht solltest du den Text nochmals durchlesen, da sind noch ein paar kleinere Fehler drin. Die Formulierung könnte manchmal auch noch schöner sein (+ einige Umlaute, die nicht richtig dargestellt werden). Ausserdem verwendest du manchmal Sie, manchmal Du und manchmal die dritte Person.
Das sind aber alles Kleinigkeiten, die nichts mit der Programmierung zu tun haben.
Zum Code: Du hast viele Klassen, bei denen du für jedes Element eine get und eine set Funktion hast und die ganze "Logik" ausserhalb der Klasse stattfindet. Es wäre oft besser, Methoden zu verwenden und nicht alle Variablen von aussen änderbar zu machen.
Ein Beispiel:
// Aus dem Kampfsystem, nach einem gewonnenen Kampf
// getExp() und setEXP() überprüfen nichts sondern lesen und schreiben
// die Variable direkt
int y = spieler->getEXP() + x * 2;
spieler->setEXP( y );
spieler->checkLevel();
return true;
Hier ein Vorschlag, wie man das in der Klasse lösen könnte
class Hero
{
private:
int exp;
int level;
void checkLevel();
public:
// kein setExp und kein setLevel mehr
int getExp(){return exp;}
void increaseExp(int amount)
{
// Evt. auch noch if (amount <= 0) return;
exp+=amount;
checkLevel();
}
};
Das hat den Vorteil, dass du weisst, dass level immer den richtigen Wert hat, passend zu der Erfahrung. Das ist der Vorteil davon, dass die Variablen privat sind. Du musst dir keine Gedanken über den Levelaufstieg mehr machen (ausser ein paar Gedanken, wie du die checkLevel() Funktion optimieren könntest ).
Du verwendest die Klassen im Moment eher wie structs einfach mit get/set statt direkt auf die Variablen zuzugreifen. Die Möglichkeiten und Vorteile von Klassen nützt du nicht wirklich.
Anderes Beispiel: Es wäre nützlich, wenn die Held Klasse sich selbst in eine Datei schreiben könnte. Du hast so etwas Ähnliches probiert mit einer friend funktion. Aber wäre es nicht angenehmner, wenn du spieler->writeToFile(filename) schreiben könntest? So ähnlich wie hier:
spieler->writeInventar( fout, spieler->itsInventar );
//...
void Held::writeInventar( ofstream& fout, Inventar itsInventar )
{
itsInventar.writeOutInventar( fout, itsInventar );
}
Aber wieso übergibst du hier ein Inventar? Du willst vermutlich eh immer nur das eigene Inventar schreiben, also mach das doch auch ;).
Ich habe gesehen, dass du den Vorschlag mit printAndWait übernommen hast. Jetzt hast du eine Datei mit der Story, die fast nur aus printAndWait Zeilen besteht. Von da aus ist es kein grosser Schritt mehr, den Text aus einer Datei zu lesen :).