Problem bei Klassen und deren Methoden.
-
Hallo Leute!
Derzeit versuche ich ein kleines Textbasiertes RPG zu Programmieren, und hab da mal ne Frage wie ich folgendes Problem programmieren kann:
Ich habe eine Klasse "player" in "player.h". Deren Methoden sind in "player.cpp".
Die Klasse hat die Attribute "def" "atkpower" und "health". Jetzt möchte ich eine Methode erstellen die aus einer anderen Klasse einen Wert nimmt und diesen drei Attributen den Wert hinzu addiert. Die andere Klasse "klassen" in "klassen.h" hat die Attribute "def_up", "atk_up" und "health_up". Im "main.cpp" sind 4 Objekte von der klasse "klassen" deklariert. Je nachdem welche Klasse der Spieler jetzt am Anfang gewählt hat, sollen sich die drei Werte "def", "atkpower" und "health" unterschiedlich ändern (Abhängig von den drei Attributen der Klasse "Klassen").Ich hab schon einige Tage rumprobiert, aber keine Lösung dafür gefunden. Ich bin noch ein recht Blutiger Anfänger in Programmieren, da wir in der Berufsschule in dem Fach nur schleichend voran kommen -.-'
Ich bedanke mich schonmal für die Hilfe die ich hoffentlich bekommen werde

Mit freundlichen Grüßen,
**Danielowksi
**
-
Kansnt du ein gekürztes, kompilierbares Beispiel machen und es dann posten?
-
Ich vermute mal, du bringst in deinem Text Klassen und Objekte durcheinander.
-
Naja, was er meint ist wohl schon klar. Läuft im Endeffekt auf getter und setter hinaus. Unschön.
-
Ich hab dann mal etwas ausgeschnitten, ich hoffe das reicht so. Also:
main.cpp:
#include <cstdlib> #include <iostream> #include "player.h" #include "klassen.h" //Ich hab keine Ahnung was diese Zeile macht :D using namespace std; int main(int argc, char *argv[]) { //Spieler 1 initialisierung player spieler[2]; spieler[1].change_health(100); spieler[1].change_def(10); spieler[1].change_atkpower(20); //Klasse 1 initialisierung klassen klasse[2]; klasse[1].id = 1; klasse[1].atk_change = 5; klasse[1].def_change = 10; klasse[1].hp_change = 7; //ende system("PAUSE"); return EXIT_SUCCESS; }klassen.h:
class klassen { public: int id; //xx_change Attribute sollen als Prozentuale erhöhung von //den dafür vorgsehenen Attributen aus "player" dienen. int atk_change; int def_change; int hp_change; };player.h:
class player { public: //Zugriffs Methoden void change_health(int amount); void change_def(int amount); void change_atkpower(int amount); private: int health; int def; int atkpower; };player.cpp
#include "player.h" void player::change_health(int amount) { health = health + amount; } void player::change_def(int amount) { def = def + amount; } void player::change_atkpower(int amount) { atkpower = atkpower + amount; }Mit freundlichen Grüßen,
Danielowski
-
Kann mir da keiner helfen?
-
Wo liegt denn dein Problem?
-
using namespace std; macht nichts anderes, als dass du nicht vor die Standardfunktionen immer std:: schreiben musst. Außerdem fängt der Arrayindex bei 0 an! Bist du sicher, dass du die Grundlagen von C++ beherrscht?
-
Lies dir (neben einem ordentlichen Einsteigerbuch für C++) auch mal die beiden Links in meiner Signatur durch - und formuliere dann eine Frage. Die einzige wirkliche Frage, die man bisher von dir hier findet heißt "kann mir keiner helfen?" - die Antwort ist "Nein, weil keiner weiß, bei welchem Problem".
-
Cyres schrieb:
using namespace std; macht nichts anderes, als dass du nicht vor die Standardfunktionen immer std:: schreiben musst. Außerdem fängt der Arrayindex bei 0 an! Bist du sicher, dass du die Grundlagen von C++ beherrscht?
Es ist mir durchaus bewusst, das der Array Index bei 0 beginnt. Ich hab nur die "id" bei 1 begonnen, weil ich die 0 für eine Ausweich id freigehalten habe.
Ja, ich hab das Problem vielleicht etwas zu überladen dargestellt. Also:
Ich möchte eine Funktion programmieren, die für den player1 bei der wahl einer klasse, die stats den Werten entsprechend erhöht. Wenn jetzt "klasse[1].healthchange" = 0.2 ist und "player[1].health" = 100 ist soll dementsprechend der Wert 100 auf 120 gehoben werden.
Wenn man nur einen einzigen Spieler erzeugt ist das kein Problem, dann ist das ja relativ statisch. Aber wenn ich z.B. zwei Spieler erzeugen will, dann weiß ich nicht wie ich der Funktion sagen soll welchem Spieler die Änderung zugunsten kommen soll. Außerdem sollte es halt möglich sein die Klasse zu wechseln.
Ich hoffe dass das nicht wieder zu Schwammig formuliert ist.
Mit freundlichen Grüßen,
Danielowski
-
Danielowski schrieb:
Wenn man nur einen einzigen Spieler erzeugt ist das kein Problem, dann ist das ja relativ statisch. Aber wenn ich z.B. zwei Spieler erzeugen will, dann weiß ich nicht wie ich der Funktion sagen soll welchem Spieler die Änderung zugunsten kommen soll.
Schau dir das Konzept von Methoden nochmal genauer an. Wenn du auf spieler[1] eine Funktion aufrufst, hat das einen anderen Effekt als wenn du die selbe Funktion auf spieler[2] aufrufst.
-
Danielowski schrieb:
Ich möchte eine Funktion programmieren, die für den player1 bei der wahl einer klasse, die stats den Werten entsprechend erhöht. Wenn jetzt "klasse[1].healthchange" = 0.2 ist und "player[1].health" = 100 ist soll dementsprechend der Wert 100 auf 120 gehoben werden.
Dann solltest Du dazu eine Methode schreiben, in der man eine Klasse auswählen kann.
void select_klasse( class Klasse *pKlasse );
Du legst im Player einen privaten class Klasse *pKlasse an und belegst diesen beim Aufruf der Methode. Initialisieren kannst Du den Pointer mit NULL.
Danielowski schrieb:
Wenn man nur einen einzigen Spieler erzeugt ist das kein Problem, dann ist das ja relativ statisch. Aber wenn ich z.B. zwei Spieler erzeugen will, dann weiß ich nicht wie ich der Funktion sagen soll welchem Spieler die Änderung zugunsten kommen soll. Außerdem sollte es halt möglich sein die Klasse zu wechseln.
Wenn Du diesen o.a. Pointer hast und der nicht NULL ist, dann kannst Du in den Methoden, die Dir Health, etc. liefern, die Werte dazu addieren. Ich empfehle, nicht den ursprünglichen Wert zu ändern, sondern in einer Methode eben den Wert immer aktuell zu berechenen.
Übrigens: 1000 Wege führen nach Rom. Zu Deinem Problem gibt es auch eine Reihe an Lösungen und das ist nicht unbedingt die Beste aber die, von der ich glaube, dass man am wenigsten erläutern muss... aber auch da könnte ich falsch liegen...
Ciao
MM