Projekt 3: "Angry Birds im Terminal"

2. Klassenstruktur entwickeln
Im ersten Teil des Programms, der in diesem Kapitel entsteht, werden wir die vier Klassen entwickeln, auf denen die für das Spiel relevanten Objekte basieren werden. Außerdem werden wir eine rudimentäre Spielwelt erzeugen und diese mit Vögeln und Schweinen bevölkern.
Eine ausführliche Beschreibung dieses ersten Teils findest du im Lernheft zum Kurs.
Klasse GameObject#include <iostream>
#include <string>
#include <vector>
using namespace std;
// Datenstruktur für Koordinaten
struct Tuple2D
{
double x, y;
};
// Liste relevanter Objektarten
enum ObjType
{
BIRD,
PIG,
GROUND,
AIR
};
// Basisklasse für Spielobjekte
class GameObject
{
public:
// Konstruktor mit Pflicht-Parametern
GameObject(double pos_x, double pos_y, ObjType type, char sym)
{
m_position.x = pos_x;
m_position.y = pos_y;
m_type = type;
m_symbol = sym;
}
// Member-Variablen
ObjType m_type;
char m_symbol{' '};
Tuple2D m_position{0.0, 0.0}; // x, y
Tuple2D m_velocity{0.0, 0.0}; // v_x, v_y
bool m_has_been_used{false};
};
// Kindklasse für Vogel-Objekte
class Bird : public GameObject
{
public:
// Konstruktor mit Aufruf des Basis-Konstruktors
Bird(double pos_x, double pos_y)
: GameObject(pos_x, pos_y, BIRD, 'o')
{
cout << "Vogel an x=" << m_position.x
<< ", y=" << m_position.y << endl;
}
// Member-Variablen
string m_attack_cry{"Angriff!"};
};
// Kindklasse für Schweine-Objekte
class Pig : public GameObject
{
public:
// Konstruktor mit Aufruf des Basis-Konstruktors
Pig(double pos_x, double pos_y, int score = 500)
: GameObject(pos_x, pos_y, PIG, '@')
{
m_score = score;
cout << "Schwein an x=" << m_position.x
<< ", y=" << m_position.y << " ("
<< m_score << " Punkte)n";
}
// Member-Variablen
int m_score{500};
string m_hit_cry{"Oh nein!"};
};
// Klasse für das Spielfeld-Objekt
class GameArea
{
public:
// Konstruktor (noch ohne) Aufbau des Spielfelds
GameArea(int num_rows, int num_cols)
{
// Spielfeld-Größe festlegen
m_num_rows = num_rows;
m_num_cols = num_cols;
cout << "Spielfeld mit " << num_rows
<< " Zeilen und " << num_cols << " Spalten\n";
}
// Hinzufügen von Spielobjekten in die jeweiligen Listen
void AddGameObject(GameObject *object)
{
// Objekt in passende Liste hinzufügen
if (object->m_type == BIRD)
m_game_birds.push_back((Bird *)object);
else if (object->m_type == PIG)
m_game_pigs.push_back((Pig *)object);
cout << "Objekt-Typ " << object->m_type << " hinzugefügt ("
<< m_game_birds.size() << " Vögel, "
<< m_game_pigs.size() << " Schweine)\n";
}
// Member-Variablen
vector<Bird *> m_game_birds; // Liste aller Vögel im Spiel
vector<Pig *> m_game_pigs; // Liste aller Schweine im Spiel
int m_num_cols; // Feldgröße in x (Zelle = 1m)
int m_num_rows; // Feldröße in y
};
/*******************/
int main()
{
// Spielobjekte erzeugen
Bird b1(0.0, 0.0), b2(2.0, 0.0), b3(4.0, 0.0);
Pig p1(30.0, 0.0), p2(50.0, 0.0, 1000);
// Spielobjekte erzeugen
int rows{15}, cols{100};
GameArea area(rows, cols);
// Spielwelt bevölkern
area.AddGameObject(&p1);
area.AddGameObject(&p2);
area.AddGameObject(&b1);
area.AddGameObject(&b2);
area.AddGameObject(&b3);
return 0;
}