Aufgabe 16
- Aufgabenstellung
- Lösung
a) Erstellen Sie eine Klasse Zauberer. Ein Zauberer hat einen Namen, Lebenspunkte, mehere Zauber und die Anzahl der Zauber. Erstellen Sie auch eine Klasse für die Zauber mit ihrem Namen und ihrer Stärke. Implementieren Sie für beide Klassen notwendige Konstruktoren, um Instanzen erstellen und löschen zu können und eine Methode um, diese im Terminal ausgeben zu können.
Hinweis: Die Syntax für die Ausgabe könnte so aussehen:
friend ostream &operator<<(ostream &out, const Wizard &wizard)
{
out << "Ich bin ein Zauberer!"
return;
}
Testen Sie Ihre Implementation mithilfe folgender Main-Funktion:
int main()
{
Spell *spells = new Spell[3];
spells[0] = Spell("Fireball", 50);
spells[1] = Spell("Lightning Bolt", 60);
spells[2] = Spell("Ice Shard", 40);
Wizard wizard("Elemental Mage", 100, spells, 3);
cout << wizard << endl;
}
b) Implementieren Sie eine Methode void attack(Wizard &target, int spell_index), mit der andere Zauberer mit einem bestimmten Zauber angegriffen werden können.
Implementieren Sie auch eine Kampffunktion, in der sich beide Zauberer, bis Sie keine LebensPunkte mehr haben, im Wechsel angreifen. Lassen Sie die Zauberer dabei jede Runde einen anderen ihrer Zauber benutzen.
Testen Sie Ihre Implementation mithilfe folgender Main-Funktion:
int main()
{
Spell *spells = new Spell[3];
spells[0] = Spell("Fireball", 50);
spells[1] = Spell("Lightning Bolt", 60);
spells[2] = Spell("Ice Shard", 40);
Wizard wizard("Elemental Mage", 100, spells, 3);
cout << wizard << endl;
Spell *enemySpells = new Spell[2];
enemySpells[0] = Spell("Shadow Strike", 30);
enemySpells[1] = Spell("Dark Blast", 45);
Wizard enemyWizard("Dark Sorcerer", 80, enemySpells, 2);
cout << enemyWizard << endl;
fight(wizard, enemyWizard);
}
#include <iostream>
using std::cout, std::endl, std::ostream;
#include <string>
using std::string;
// a)
class Spell
{
private:
string name;
int power;
public:
Spell() : name("Unknown"), power(0) {}
Spell(string name, int power) : name(name), power(power) {}
~Spell() {}
string get_name() { return name; }
int get_power() { return power; }
friend ostream &operator<<(ostream &out, const Spell &spell)
{
out << spell.name << " - Power: " << spell.power;
return out;
}
};
class Wizard
{
private:
string name;
int health;
Spell *spells;
int spell_count;
public:
Wizard(string name, int health, Spell *spells, int spell_count)
: name(name), health(health), spells(spells), spell_count(spell_count) {}
~Wizard() { delete[] spells; }
friend ostream &operator<<(ostream &out, const Wizard &wizard)
{
out << wizard.name << " - HP: " << wizard.health << ", Spells: ";
for (int i = 0; i < wizard.spell_count; i++)
{
out << "\n\t" << wizard.spells[i];
}
return out;
}
bool is_alive() { return health > 0; }
int get_spell_count() { return spell_count; }
// b)
void attack(Wizard &target, int spell_index)
{
if (spell_index < 0 || spell_index >= spell_count)
{
cout << "Invalid spell index!" << endl;
return;
}
cout << name << " attacks " << target.name << " with " << spells[spell_index].get_name()
<< " causing " << spells[spell_index].get_power() << " damage!" << endl;
target.health -= spells[spell_index].get_power();
if (target.health < 0)
target.health = 0;
}
};
void fight(Wizard &wizard1, Wizard &wizard2)
{
int i = 0;
int j = 0;
while (wizard1.is_alive() && wizard2.is_alive())
{
wizard1.attack(wizard2, i);
cout << wizard1 << endl;
cout << wizard2 << endl;
if (!wizard2.is_alive())
{
cout << "Wizard 2 has been defeated!" << endl;
return;
}
wizard2.attack(wizard1, j);
cout << wizard1 << endl;
cout << wizard2 << endl;
if (!wizard1.is_alive())
{
cout << "Wizard 1 has been defeated!" << endl;
return;
}
i = (i + 1) % wizard1.get_spell_count();
j = (j + 1) % wizard2.get_spell_count();
}
}
int main()
{
Spell *spells = new Spell[3];
spells[0] = Spell("Fireball", 50);
spells[1] = Spell("Lightning Bolt", 60);
spells[2] = Spell("Ice Shard", 40);
Wizard wizard("Elemental Mage", 100, spells, 3);
cout << wizard << endl;
Spell *enemySpells = new Spell[2];
enemySpells[0] = Spell("Shadow Strike", 30);
enemySpells[1] = Spell("Dark Blast", 45);
Wizard enemyWizard("Dark Sorcerer", 80, enemySpells, 2);
cout << enemyWizard << endl;
fight(wizard, enemyWizard);
}