Einfache Klasse & Instanzen



  • Ich versuche gerade, mir ein wenig C++ beizubringen.
    Ich habe zwar schon objektorientiert programmiert, aber so richtig will mir das "hohe" C nicht in den Kopf... also zu meinem Problem:

    Zur Übung wollte ich etwas rollenspielartiges coden.
    Aufgabe: eine Klasse "enemy" erstellen, die einige Attibute des Gegners bereithält (health etc.).

    Eine Funktion innerhalb der Klasse soll dem Gegner health abziehen und sterben lassen, wenn health <=0 ist:

    class Enemy {
    
    private:
    	int health;
    	int power;
    	int speed;
    	bool isDead;
    
    public:
    
    	void setupEnemy(int hp, int pow, int spe) {
    		health = hp;
    		power = pow;
    		speed = spe;
    		isDead = false;
    		cout << "Enemy created HP:" << health << " / Power:" << power
    				<< " / Speed:" << speed << endl;
    	}
    
    	void getroffen(int rndHit) {
    
    		if (isDead == false) {
    			health -= rndHit;
    			cout << "Argh! getroffen! HP übrig:" << health << endl;
    			if (health <= 0) {
    				enemyCount -= 1;
    				isDead = true;
                                    cout << "ARGH! (tot)" << endl;
    			}
    		} else {
    			cout << "Gegner liegt bereits am Boden!" << endl;
    		}
    	}
    };
    

    Soweit, so simpel.
    Wenn das Programm gestartet wird, sollen 5 Gegner instanziert werden und danach soll der Kampf beginnen:

    int main() {
    	enemyCount = 5;
    
    	for (int i = 1; i <= enemyCount; i++) {
    		Enemy enemy[i];
    		int theHealth = i * 100;
    		int thePower = i * 10;
    		int theSpeed = i / 2;
    		enemy[i].setupEnemy(theHealth, thePower, theSpeed);
    	}
    
    	beginFight();
    	return 0;
    }
    

    Scheint auch so zu funktionieren wie ich es mir gedacht habe.
    Der Fehler kommt in der Funktion beginFight().

    Dort wird angezeigt, wieviele Gegner stehen und abgefragt, welchen man angreifen möchte und wie viel Schaden man anrichten möchte
    (später sollten da natürlich Waffen-Attribute den Schaden definieren, ist aber erstmal egal):

    void beginFight() {
    	int theChoice;
    	int theHit;
    	cout << "Es stehen " << enemyCount << " Gegner vor dir!" << endl;
    	cout << "Welchen Gegner willst du angreifen?" << endl;
    	cin >> theChoice;
    	cout << "Wievel Schaden willst du anrichten?" << endl;
    	cin >> theHit;
    
            enemy[theChoice].getroffen(theHit); // [b]error: 'enemy' was not declared in this scope[/b]
    
            beginFight();
    }
    

    'enemy' was not declared in this scope? meh. 😕
    Was habe ich denn dann in dem for-loop gemacht?
    offensichlich etwas falsches...

    Ich würde jetzt gerne jeden Gegner einzeln meucheln können.
    Mag mir jemand auf die Sprünge helfen?



  • for (int i = 1; i <= enemyCount; i++) { 
            Enemy enemy[i];
    

    Das ist nicht, was du willst. Du versuchst, ein Array mit i Einträgen vom Typ Enemy zu erstellen, was so gar nicht erlaubt ist (weil i nicht compilezeit-konstant ist). Wenn der Code kompiliert, liegt es an einem Compiler, der den C++-Standard nicht beachtet.

    Und dein anderes Problem wird ja in der Fehlermeldung erläutert. Deklariere eine Variable enemy (wahrscheinlich willst du ein Array), die bei ihrer Verwendung sichtbar ist. Eventuell willst du auch Parameter an Funktionen übergeben.



  • Der Zeiger (oder das Array) " enemy " existiert nur innerhalb der Schleife. Und jeden Durchgang mit einer anderen Grösse. " enemies " (bessere Bezeichnung) sollte am Programmanfang definiert werden. Wo definierst du eigentlich enemyCount ? Und dann sollte beginFight auch (einen) Parameter haben.



  • Also hier 2 Dinge, die mir so auf den ersten Blick aufgefallen sind:
    1.) setupEnemy gehört eher in den Konsruktor, dafür sind die schließlich da.
    2.) bool isDead ist eine redundate Information, die du zusätzlich managen musst. Ich würde hier lieber eine Methode bool isDead() anbieten, die zurückgibt, ob health == 0 😉



  • Versuche auch, von dem Container "Map" bzw. "Multimap" aus der C++ STL Gebrauch zu machen - Arrays sind zwar schnell, aber sehr fehleranfällig. Zudem erlauben Arrays kein nachträgliches Anlegen von Indizes - Maps schon.



  • satanfreze schrieb:

    "Map" bzw. "Multimap"

    Völlig falsche Wahl. std::vector heisst die Lösung. Und die ist nicht langsamer als ein Array.



  • okay leute, danke. aber das klingt jetzt leider noch nach star trek für mich.
    abgesehen von eurem persönlich bevorzugten programmier-style, wo mach ich als noob jetzt weiter? Wie erstelle ich ein Array mit Enemy-Objekten, das von überall ansprechbar ist?



  • EOutOfResources schrieb:

    satanfreze schrieb:

    "Map" bzw. "Multimap"

    Völlig falsche Wahl. std::vector heisst die Lösung. Und die ist nicht langsamer als ein Array.

    Au Backe, ich war komplett auf dem falschen Dampfer - ich meinte natürlich den Containertyp Vector! Bin wohl gerade zu sehr in meinem Quelltext vertieft gewesen. Danke für die Korrektur.


  • Mod

    der finne schrieb:

    abgesehen von eurem persönlich bevorzugten programmier-style, wo mach ich als noob jetzt weiter?

    Indem du lernst, was dir empfohlen wurde. Die Standardcontainer sind zu wichtig und zu nützlich, als dass man sie erst einmal ignorieren dürfte. Die Grundlagen kannst du in ein paar Stunden lernen und dann ist dein Programm automatisch gleich ein ganzes Stück besser und vor allem robuster.



  • 314159265358979 schrieb:

    1.) setupEnemy gehört eher in den Konsruktor

    danke. konstruktoren. schau ich mir grad an...

    Ich würde hier lieber eine Methode bool isDead() anbieten, die zurückgibt, ob health == 0 😉

    verstehe. ja. das werde ich so machen.

    EOutOfResources schrieb:

    " enemies " (bessere Bezeichnung) sollte am Programmanfang definiert werden.

    ja. oder enemyArray oder sowas 😉
    Kann mir jemand ein Beispiel dafür zeigen?

    Wo definierst du eigentlich enemyCount ? Und dann sollte beginFight auch (einen) Parameter haben.

    enemyCount wird unterm #include <iostream> deklariert. hab ich nur weggelassen.



  • der finne schrieb:

    Kann mir jemand ein Beispiel dafür zeigen?

    std::vector<Enemy> Enemies;
    

Anmelden zum Antworten