Mit im Konstruktor einer anderen Klasse definierten Variablen arbeiten?



  • Hallo,

    ich habe hier ein kleines Anfänger-Problem, bei dem ich mit meinem Wissen, was ich habe, nicht weiter komme.
    Ich programmiere einen ziemlich primitiven Vorläufer eines RPG-Spiels, um ein wenig zu üben.

    Programmbeschreibung (kann natürlich auch einfach im Quelltext nachvollzogen werden):

    Ich bin dabei so vorgegangen, dass ich so tue, als wären den einzelnen Feldern, die man anklickt, um den Spieler zu bewegen, Zustände (Zahlen) zugeordnet. Ist eine von diesen die Zahl 2 zugeordnet ("ENEMY"), so soll der Spieler angreifen (wird durch eine Textnachricht simuliert). Jetzt muss natürlich ermittelt werden, wer gewinnt! Daher wollte ich mir eine Funktion "calcBalance" programmieren, welche die relevanten Werte vom Spieler und Gegner übergeben bekommt, bzw. auf sie zugreifen kann, und die Dmg-rate dann ausgibt.

    Problembeschreibung:

    Mein Problem ist, dass ich die Funktion "calcBalance" beispielsweise mit dem Objekt Spieler aufrufe, was dazu führt, dass sie nur auf die Werte des Spielers zugreifen kann, nicht aber auf die des bzw. eines speziellen Gegners.

    Es wäre nett, wenn ihr mir zeigt, wie ich das ändern kann. In C++ gab es bis jetzt für alles eine einfache Lösung 🙂

    Hier der relevante Code:

    #include <iostream>
    
    using namespace std;
    
    enum MAPTYPES
    {
    	NEUTRAL,
    	NPC,
    	ENEMY,
    	UNACCESSABLE,
    };
    
    class Cliving 
    {
    protected:
    	int m_attack;
    	int m_defence;
    	int m_life;
    
    public:
    	void move(int location);
    	void calcBalance();
    };
    
    class Cplayer : public Cliving
    {
    public:
    	Cplayer();
    };
    
    class Cenemy : public Cliving
    {
    public:
    	Cenemy();
    };
    
    Cplayer::Cplayer()
    {
    	m_attack = 90;
    	m_defence = 30;
    	m_life = 100;
    }
    
    Cenemy::Cenemy()
    {
    	m_attack = 30;
    	m_defence = 30;
    	m_life = 100;
    }
    
    void Cliving::move(int location)
    {
    	if(location == ENEMY) cout << "player attacks enemy";
    	calcBalance();       <-- Was muss ich an dieser Stelle übergeben, damit
    }                                mein Vorhaben gelingt? Oder ist die Lösung was
                                     ganz anderes?
    
    void Cliving::calcBalance()
    {
    
    }
    
    int main()
    {
    	Cplayer player;
    	Cenemy enemy;
    
    	player.move(ENEMY);
    }
    

    Vielen Danke für die Hilfe!

    Gruß,
    FunkyPeanut

    Edit1: Grund: einige Kommafehler


  • Mod

    Die Frage, die du beantworten musst, ist, wo du überhaupt den speziellen Gegner her bekommst. Du weißt ja anscheinend bloß, dass auf dem Feld ein Gegner ist, aber nicht welcher. Daher wäre es wohl ganz allgemein besser, deine Daten anders zu sortieren. Zum Beispiel könnte jedes Feld eine Liste von Spielfiguren haben, die auf ihm stehen.

    CFindest Cdu Cdas Ceigentlich Cgut Clesbar, Cwenn Cich Cso Cschreibe? CNein? CWieso Cprogrammierst Cdu Cdann Cselber Cso?



  • Cohne Cgesondert Cauf Cdeinen 80er STIL Ceinzugehen Cist Cdoch Cdie Coffensichtliche LÖSUNG, Cdass Cdu Ceinfach Cden GEGNER Cübergibst.
    Cdu Cwirst Cwohl Ceine KARTE Chaben/Cbrauchen, Cwo Cdu Caus Ceiner POSITION Cdie EINHEIT Cbekommen Ckannst. Cdann Ckannst Cdu Csowas Cschreiben:

    calcBalance(getUnitFromLocation(location));
    


  • Haha 😃 Wie geil seid ihr denn drauf.
    Ich werd' meine Klassen umbenennen keine sorge 😃
    C_Klasse oder sowas.... danke für den Hinweis 🙂

    Dann werd' ich mal ranmachen und den Gegner übergeben - wenngleich ich Tipps echt gut gebrauchen könnte. Habe irgendwie grad keine Ahnung wie ich das anstellen soll.

    Danke für die schnellen Antworten!

    Gruß,
    FunkyPeanut


  • Mod

    FunkyPeanut schrieb:

    Haha 😃 Wie geil seid ihr denn drauf.
    Ich werd' meine Klassen umbenennen keine sorge 😃
    C_Klasse oder sowas.... danke für den Hinweis 🙂

    C_Findest C_du C_das C_besser?

    Warum gibst du deinen Bezeichnern nicht ganz normale Namen? Wenn du Deutsch schreibst, dann schreibst du doch auch nicht überall davor, was für eine Wortart das Wort ist. Es ist eine überflüssige Information, die der normale Leser ohnehin direkt sehen kann, sofern sie ihn überhaupt interessiert.

    Dann werd' ich mal ranmachen und den Gegner übergeben - wenngleich ich Tipps echt gut gebrauchen könnte. Habe irgendwie grad keine Ahnung wie ich das anstellen soll.

    Du hast nun zwei verschiedene Vorschläge bekommen, wenn du mehr dazu wissen möchtest, dann musst du konkretere Fragen stellen, als einfach nur zu sagen, dass dir die bisherigen Antworten nicht reichen. Wir werden bestimmt nicht so lange verschiedene Vorschläge machen, bis dir zufällig einer passt.



  • FunkyPeanut schrieb:

    Haha 😃 Wie geil seid ihr denn drauf.
    Ich werd' meine Klassen umbenennen keine sorge 😃
    C_Klasse oder sowas.... danke für den Hinweis 🙂

    Und dann schreiben die hier in "C_hallo C_kannst C_du...", ist das dann besser?

    Nein, die beiden Kollegen wollen darauf hinaus, dass du deine Namen zwar sinnvoll verteilst, aber die Typen deiner Bezeichner gehört nicht in den Namen.
    Weil wie willst du das konsequent durchziehen? (Wenn du es nicht konsequent anwendest, ist es eh Schwachsinn)

    So nach dem Motto:

    int iAnzahl;
    int * piAnzahl;
    class CMyClass;
    CMyClass myC;
    CMyClass * pMyC;
    std::vecto<std::shared_ptr<CMyClass>> * m_pvsharedMyClist; // <-- O_o
    

    Sowas willst du nicht, glaub mir. Ich glaub Drakon oder ShadeOfMine hier aus dem Forum haben dazu malw as erklärt, was feines und das auch noch was weiter gesponnen.

    Gib deinen Klassen normale aussagekräftige Namen, ein C oder sowas hat da nix drin zu suchen.



  • Oh man... So kann's natürlich auch aussehen.
    Ist okay dann lass ich es einfach ganz weg.

    Danke dafür 👍



  • Okay ich hab's mit der Zugriff via Funktion versucht, aber komme nicht weiter, da mir das Wissen einfach fehlt.
    Ich habe mir eine Zugriffsfunktion unter der Klasse Enemy (keine C's mehr) deklariert und weiß nicht, wie ich mit dieser in der Lage sein soll, die Membervariablen auf eine andere Funktion zu übergeben geschweige denn überhaupt diese aus der eigenen Klasse (ohne alles einzeln in eine Variable packen zu müssen) raus zu schreiben.
    Ich weiß bisher nur, wie ich eine set-Funktion definiere - mit kompakten get-Funktionen hab ich's wohl noch(!) nicht so. Und ich vermute bereits, dass dies elementarste Grundlagen sind, aber ich lerne das ja auch erst seit einer Woche.

    Der Quellcode hat sich nicht wirklich geändert (wenn man von der Klassenbenennung absieht).

    Könnt ihr mir noch einmal Hilfestellung bieten? Vielen Dank!

    Gruß,
    FunkyPeanut


Anmelden zum Antworten