chore: removed code comments, used references where possible
This commit is contained in:
parent
a4cf0bf18f
commit
b416bb3d87
11 changed files with 46 additions and 150 deletions
31
Game.cpp
31
Game.cpp
|
@ -1,9 +1,4 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/17/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Game.h"
|
#include "Game.h"
|
||||||
#include "MazeParser.h"
|
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "Maze.h"
|
#include "Maze.h"
|
||||||
#include "Exceptions/ExitGame.h"
|
#include "Exceptions/ExitGame.h"
|
||||||
|
@ -16,25 +11,19 @@ using game_exceptions::UnkownAction;
|
||||||
using game_exceptions::MovementNotPossible;
|
using game_exceptions::MovementNotPossible;
|
||||||
using game_exceptions::ExitGame;
|
using game_exceptions::ExitGame;
|
||||||
|
|
||||||
namespace game // Namespace = Scope with name and no features
|
namespace game
|
||||||
{
|
{
|
||||||
Game::Game(Maze& maze): maze(maze), player(0, 0)
|
Game::Game(Maze& maze): maze(maze), player(0, 0)
|
||||||
{
|
{
|
||||||
// Lese die Startpositon des Spielers aus dem eingelesenen Labyrinth aus
|
|
||||||
PositionVector player_start_position = this->maze.get_player_start_position();
|
PositionVector player_start_position = this->maze.get_player_start_position();
|
||||||
|
|
||||||
// Überschreibe den Spieler mit der gegebenen Startposition
|
|
||||||
this->player = Player(player_start_position);
|
this->player = Player(player_start_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
PositionVector Game::handle_user_input(const char input)
|
PositionVector Game::handle_user_input(const char& input)
|
||||||
{
|
{
|
||||||
// Erstelle einen Vector mit einer Bewegung von 0 und 0
|
|
||||||
PositionVector movement_vector = PositionVector(0, 0);
|
PositionVector movement_vector = PositionVector(0, 0);
|
||||||
|
|
||||||
// Kontrolliere, was der Spieler machen möchte. Speichere die erforderte Bewegung im Bewegungsvektor.
|
|
||||||
// Schreibe nachrichten in die Konsole,
|
|
||||||
// wenn nach Hilfe gefragt wird oder eine unbekannte Eingabe eingegeben wurde
|
|
||||||
switch (input)
|
switch (input)
|
||||||
{
|
{
|
||||||
case 'w':
|
case 'w':
|
||||||
|
@ -52,7 +41,6 @@ namespace game // Namespace = Scope with name and no features
|
||||||
case 'q':
|
case 'q':
|
||||||
throw ExitGame("Schoenen Tag noch!");
|
throw ExitGame("Schoenen Tag noch!");
|
||||||
case 'h':
|
case 'h':
|
||||||
// Schreibe hilfsreiche Tipps in die Konsole
|
|
||||||
cout <<
|
cout <<
|
||||||
"Du wurdest von einem Zauberer in ein Labyrinth gesperrt, nachdem du seine Künste beleidigt hast.\n"
|
"Du wurdest von einem Zauberer in ein Labyrinth gesperrt, nachdem du seine Künste beleidigt hast.\n"
|
||||||
<< "Er laesst dich leben, wenn du es schaffst den Ausgang (Z) zu finden. Solltest du keinen Erfolg haben, laesst er dich verhungern.\n"
|
<< "Er laesst dich leben, wenn du es schaffst den Ausgang (Z) zu finden. Solltest du keinen Erfolg haben, laesst er dich verhungern.\n"
|
||||||
|
@ -60,7 +48,6 @@ namespace game // Namespace = Scope with name and no features
|
||||||
<< "Bewege dich mit 'w', 'a', 's' und 'd'.\n";
|
<< "Bewege dich mit 'w', 'a', 's' und 'd'.\n";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
// Die gewollte Aktion kenne ich nicht. Melde Fehler dem Nutzer
|
|
||||||
throw UnkownAction("Diese Eingabe kenne ich nicht. Gib 'h' ein, um eine Hilfe zu erhalten.");
|
throw UnkownAction("Diese Eingabe kenne ich nicht. Gib 'h' ein, um eine Hilfe zu erhalten.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,32 +56,25 @@ namespace game // Namespace = Scope with name and no features
|
||||||
|
|
||||||
void Game::run_game()
|
void Game::run_game()
|
||||||
{
|
{
|
||||||
// Erstelle eine Variable für den Input
|
|
||||||
char game_input;
|
char game_input;
|
||||||
|
|
||||||
// Durchlaufe die Hauptschleife des Spiels
|
// Hauptschleife
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Kontrolliere, ob der Spieler an einem Geist gestorben ist
|
|
||||||
if (this->maze.was_player_killed_by_ghost(player))
|
if (this->maze.was_player_killed_by_ghost(player))
|
||||||
{
|
{
|
||||||
cout << "Sie haben einen Geist getroffen! Game Over!\n";
|
cout << "Sie haben einen Geist getroffen! Game Over!\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zeige dem Spieler das Spielfeld
|
|
||||||
this->maze.render(player);
|
this->maze.render(player);
|
||||||
|
|
||||||
|
|
||||||
// Kontrolliere, ob der Spieler schon das Ziel erreicht hat
|
|
||||||
if (this->maze.is_player_at_goal(player))
|
if (this->maze.is_player_at_goal(player))
|
||||||
{
|
{
|
||||||
// Ziel erreicht! Herzlichen Glückwunsch!
|
|
||||||
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
|
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lese Eingabe des Spielers
|
|
||||||
cin >> game_input;
|
cin >> game_input;
|
||||||
|
|
||||||
PositionVector movement_vector = PositionVector(0, 0);
|
PositionVector movement_vector = PositionVector(0, 0);
|
||||||
|
@ -104,20 +84,15 @@ namespace game // Namespace = Scope with name and no features
|
||||||
movement_vector = handle_user_input(game_input);
|
movement_vector = handle_user_input(game_input);
|
||||||
} catch (UnkownAction& err)
|
} catch (UnkownAction& err)
|
||||||
{
|
{
|
||||||
// Diese Anweisung kenne ich nicht.
|
|
||||||
// Melde dies dem Spieler
|
|
||||||
cout << err.what() << "\n";
|
cout << err.what() << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kontrolliere gewollte Bewegung und setze sie um.
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
player.move(this->maze, movement_vector);
|
player.move(this->maze, movement_vector);
|
||||||
}
|
}
|
||||||
catch (MovementNotPossible& err)
|
catch (MovementNotPossible& err)
|
||||||
{
|
{
|
||||||
// Diese Bewegung ist nicht möglich!
|
|
||||||
// Gebe aus, warum.
|
|
||||||
cout << err.what() << "\n";
|
cout << err.what() << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
7
Game.h
7
Game.h
|
@ -1,6 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/17/24.
|
|
||||||
//
|
|
||||||
#include "Maze.h"
|
#include "Maze.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
|
||||||
|
@ -17,13 +14,13 @@ namespace game
|
||||||
Player player;
|
Player player;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Game(Maze& maze);
|
explicit Game(Maze& maze);
|
||||||
|
|
||||||
/// Bearbeite die Eingabe des Spielers
|
/// Bearbeite die Eingabe des Spielers
|
||||||
/// @param input Die Eingabe des Nutzers
|
/// @param input Die Eingabe des Nutzers
|
||||||
/// @return Der Bewegungsvektor, um den sich den Spieler bewegen möchte
|
/// @return Der Bewegungsvektor, um den sich den Spieler bewegen möchte
|
||||||
/// @throws UnkownAction Wenn die Eingabe des Spielers unbekannt ist
|
/// @throws UnkownAction Wenn die Eingabe des Spielers unbekannt ist
|
||||||
static PositionVector handle_user_input(char input);
|
static PositionVector handle_user_input(const char& input);
|
||||||
|
|
||||||
/// Starte das Spiel
|
/// Starte das Spiel
|
||||||
void run_game();
|
void run_game();
|
||||||
|
|
41
Maze.cpp
41
Maze.cpp
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/13/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Maze.h"
|
#include "Maze.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "Exceptions/MalformedMaze.h"
|
#include "Exceptions/MalformedMaze.h"
|
||||||
|
@ -18,62 +14,55 @@ namespace game
|
||||||
throw MalformedMaze("Player oob");
|
throw MalformedMaze("Player oob");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Maze::was_player_killed_by_ghost(Player player) const
|
bool Maze::was_player_killed_by_ghost(const Player& player) const
|
||||||
{
|
{
|
||||||
// Kontrolliere ob der Spieler an einem Geist gestorben ist
|
|
||||||
return this->field[player.get_pos().y][player.get_pos().x] == 'A';
|
return this->field[player.get_pos().y][player.get_pos().x] == 'A';
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Maze::is_player_at_goal(Player player) const
|
bool Maze::is_player_at_goal(const Player& player) const
|
||||||
{
|
{
|
||||||
// Kontrolliere ob der Spieler am Ziel ist
|
|
||||||
return this->field[player.get_pos().y][player.get_pos().x] == 'Z';
|
return this->field[player.get_pos().y][player.get_pos().x] == 'Z';
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Maze::is_pos_free(const PositionVector pos, const bool player_has_key) const
|
bool Maze::is_pos_free(const PositionVector& pos, const bool& player_has_key) const
|
||||||
{
|
{
|
||||||
if (pos.x < 0 || pos.y < 0 || pos.y > field.size() - 1 || pos.x > field[pos.y].size() - 1)
|
if (pos.x < 0 || pos.y < 0 || pos.y > field.size() - 1 || pos.x > field[pos.y].size() - 1)
|
||||||
return false; // Zielposition ist außerhalb des Spielfelds
|
return false;
|
||||||
if (field[pos.y][pos.x] == '#')
|
if (field[pos.y][pos.x] == '#')
|
||||||
return false; // Zielposition ist eine Wand
|
return false;
|
||||||
if (field[pos.y][pos.x] == 'T')
|
if (field[pos.y][pos.x] == 'T')
|
||||||
return player_has_key; // Zielposition ist eine Tür
|
return player_has_key;
|
||||||
return true; // Zielposition ist betretbar (ist keine Wand und auch nicht außerhalb des Spielfeldes)
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Maze::render(Player player) const
|
void Maze::render(const Player& player) const
|
||||||
{
|
{
|
||||||
for (int y = 0; y < field.size(); ++y)
|
for (int y = 0; y < field.size(); ++y)
|
||||||
{
|
{
|
||||||
// Für jede Reihe ...
|
|
||||||
for (int x = 0; x < field[y].size(); ++x)
|
for (int x = 0; x < field[y].size(); ++x)
|
||||||
{
|
{
|
||||||
// ... schreibe für jedes Element ...
|
|
||||||
if (y == player.get_pos().y && x == player.get_pos().x)
|
if (y == player.get_pos().y && x == player.get_pos().x)
|
||||||
cout << "S"; // ... 'S' wenn der aktuelle Eintrag die Position des Spielers ist
|
cout << "S";
|
||||||
else // sonst
|
else
|
||||||
cout << field[y][x]; // ... den tatsächlichen Eintrag
|
cout << field[y][x];
|
||||||
cout << " "; // Füge ein Leerzeichen zwischen den Einträgen hinzu
|
cout << " ";
|
||||||
}
|
}
|
||||||
cout << "\n"; // Beende die Reihe mit einem Zeilenumbruch
|
cout << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char Maze::get_field(PositionVector pos) const
|
char Maze::get_field(const PositionVector& pos) const
|
||||||
{
|
{
|
||||||
// Gebe das Element der gewollten Position zurück
|
|
||||||
return this->field[pos.y][pos.x];
|
return this->field[pos.y][pos.x];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Maze::update_field(PositionVector pos, char target)
|
void Maze::update_field(const PositionVector& pos, const char& target)
|
||||||
{
|
{
|
||||||
// Aktuallisiere ein gegebens Feld dem gegebenen Wert
|
|
||||||
this->field[pos.y][pos.x] = target;
|
this->field[pos.y][pos.x] = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
PositionVector Maze::get_player_start_position() const
|
PositionVector Maze::get_player_start_position() const
|
||||||
{
|
{
|
||||||
// Gebe die Startposition des Spielers zurück
|
|
||||||
return this->player_start_position;
|
return this->player_start_position;
|
||||||
}
|
}
|
||||||
} // game
|
} // game
|
||||||
|
|
18
Maze.h
18
Maze.h
|
@ -1,6 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/13/24.
|
|
||||||
//
|
|
||||||
#include "std_lib_inc.h"
|
#include "std_lib_inc.h"
|
||||||
#include "PositionVector.h"
|
#include "PositionVector.h"
|
||||||
|
|
||||||
|
@ -9,7 +6,8 @@
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
class Player; // Forward declaration
|
class Player;
|
||||||
|
|
||||||
/// Ein Labyrinth.
|
/// Ein Labyrinth.
|
||||||
/// Besitzt ein Feld
|
/// Besitzt ein Feld
|
||||||
class Maze
|
class Maze
|
||||||
|
@ -28,32 +26,32 @@ namespace game
|
||||||
/// Kontrolliere, ob der Spieler stirbt
|
/// Kontrolliere, ob der Spieler stirbt
|
||||||
/// @param player Der Spieler
|
/// @param player Der Spieler
|
||||||
/// @return Ob der Spieler tot ist
|
/// @return Ob der Spieler tot ist
|
||||||
bool was_player_killed_by_ghost(Player player) const;
|
bool was_player_killed_by_ghost(const Player& player) const;
|
||||||
|
|
||||||
/// Kontrolliere, ob der Spieler am Ziel ist
|
/// Kontrolliere, ob der Spieler am Ziel ist
|
||||||
/// @param pos Die Position des Spielers
|
/// @param pos Die Position des Spielers
|
||||||
/// @return Ob der Spieler am Ziel ist
|
/// @return Ob der Spieler am Ziel ist
|
||||||
bool is_player_at_goal(Player player) const;
|
bool is_player_at_goal(const Player& player) const;
|
||||||
|
|
||||||
/// Kontrolliere, ob eine bestimmte Position begehbar ist
|
/// Kontrolliere, ob eine bestimmte Position begehbar ist
|
||||||
/// @param pos Die Position, die überprüft werden soll
|
/// @param pos Die Position, die überprüft werden soll
|
||||||
/// @param player_has_key If the player has at least one key
|
/// @param player_has_key If the player has at least one key
|
||||||
/// @return Ob die Position begehbar ist
|
/// @return Ob die Position begehbar ist
|
||||||
bool is_pos_free(PositionVector pos, bool player_has_key) const;
|
bool is_pos_free(const PositionVector& pos, const bool& player_has_key) const;
|
||||||
|
|
||||||
/// Zeige das Spielfeld in der Konsole an
|
/// Zeige das Spielfeld in der Konsole an
|
||||||
/// @param pos Die Position des Spielers
|
/// @param pos Die Position des Spielers
|
||||||
void render(Player player) const;
|
void render(const Player& player) const;
|
||||||
|
|
||||||
/// Kriege den Wert einer Position
|
/// Kriege den Wert einer Position
|
||||||
/// @param pos Die gewollte Position
|
/// @param pos Die gewollte Position
|
||||||
/// @return Der Wert der Position
|
/// @return Der Wert der Position
|
||||||
char get_field(PositionVector pos) const;
|
char get_field(const PositionVector& pos) const;
|
||||||
|
|
||||||
/// Ersetze den Wert von einer Position
|
/// Ersetze den Wert von einer Position
|
||||||
/// @param target_pos Die Position die ersetzt werden soll
|
/// @param target_pos Die Position die ersetzt werden soll
|
||||||
/// @param target Der Wert, auf den die Position gesetzt werden soll
|
/// @param target Der Wert, auf den die Position gesetzt werden soll
|
||||||
void update_field(PositionVector pos, char target);
|
void update_field(const PositionVector& pos, const char& target);
|
||||||
|
|
||||||
/// Kriege die Startposition des Spielers
|
/// Kriege die Startposition des Spielers
|
||||||
/// @return Die Startposition des Spielers
|
/// @return Die Startposition des Spielers
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/16/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "MazeParser.h"
|
#include "MazeParser.h"
|
||||||
|
|
||||||
#include "Exceptions/ExitGame.h"
|
#include "Exceptions/ExitGame.h"
|
||||||
|
@ -12,88 +8,61 @@ using game_exceptions::ExitGame;
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
vector<int> MazeParser::request_numbers_from_user(const int amount_of_numbers)
|
vector<int> MazeParser::request_numbers_from_user(const int& amount_of_numbers)
|
||||||
{
|
{
|
||||||
// Erstelle eine Variable für die Eingabe der Zahl(en)
|
|
||||||
int input;
|
int input;
|
||||||
|
|
||||||
// Erstelle eine Liste für die einzulesenden Nummern
|
|
||||||
vector<int> list;
|
vector<int> list;
|
||||||
|
|
||||||
// Lese soviel ein, wie gefragt
|
|
||||||
for (int i = 0; i < amount_of_numbers; ++i)
|
for (int i = 0; i < amount_of_numbers; ++i)
|
||||||
{
|
{
|
||||||
// Lese Zahl ein
|
|
||||||
cin >> input;
|
cin >> input;
|
||||||
|
|
||||||
// Sollte etwas schiefgelaufen sein, dann wirf eine Exception
|
|
||||||
if (!cin)
|
if (!cin)
|
||||||
throw MalformedMaze("Cin failed while reading numbers!");
|
throw MalformedMaze("Cin failed while reading numbers!");
|
||||||
|
|
||||||
// Schreibe die gelesene Zahl auf die Liste
|
|
||||||
list.push_back(input);
|
list.push_back(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gebe die Liste zurück
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MazeParser::validate_maze_element(const char target)
|
bool MazeParser::validate_maze_element(const char& target)
|
||||||
{
|
{
|
||||||
// Gehe jedes erlaubte Element durch und
|
|
||||||
for (const char c : valid_maze_elements)
|
for (const char c : valid_maze_elements)
|
||||||
// Gucke, ob es das gegebene Element ist
|
|
||||||
if (c == target)
|
if (c == target)
|
||||||
return true; // Gebe wahr zurück, wenn das Element in der Liste ist
|
return true;
|
||||||
// Sollte es kein Element in der Liste geben, welches dem gegebenen Entspricht, dann ist das Element nicht erlaubt.
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Maze MazeParser::request_maze_from_user()
|
Maze MazeParser::request_maze_from_user()
|
||||||
{
|
{
|
||||||
// Lese aus, wie groß das Labyrinth sein soll
|
|
||||||
vector<int> maze_size = request_numbers_from_user(2);
|
vector<int> maze_size = request_numbers_from_user(2);
|
||||||
|
|
||||||
// Erstelle eine Variable für den Labyrinth-Input
|
|
||||||
char input;
|
char input;
|
||||||
|
|
||||||
// Erstelle ein leeres Feld
|
|
||||||
vector<vector<char>> field;
|
vector<vector<char>> field;
|
||||||
|
|
||||||
// Lese das eingegebene Labyrinth ein
|
|
||||||
for (int y = 0; y < maze_size[0]; ++y)
|
for (int y = 0; y < maze_size[0]; ++y)
|
||||||
{
|
{
|
||||||
// Für jede Reihe erstelle eine Variable...
|
|
||||||
vector<char> row;
|
vector<char> row;
|
||||||
for (int x = 0; x < maze_size[1]; ++x)
|
for (int x = 0; x < maze_size[1]; ++x)
|
||||||
{
|
{
|
||||||
// und lese jedes Element der Reihe ein
|
|
||||||
cin >> input;
|
cin >> input;
|
||||||
|
|
||||||
// Werfe eine Exception, wenn der Input nicht lesbar ist, d.h. Nutzer hat eine Falsch eingabe getätigt.
|
|
||||||
if (!cin)
|
if (!cin)
|
||||||
throw MalformedMaze("Cin failed while reading chars!");
|
throw MalformedMaze("Cin failed while reading chars!");
|
||||||
|
|
||||||
// Verlasse das Spiel
|
|
||||||
if (input == 'q')
|
if (input == 'q')
|
||||||
throw ExitGame("Schoenen Tag noch!");
|
throw ExitGame("Schoenen Tag noch!");
|
||||||
|
|
||||||
// Kontrolliere, ob das Element in einem Labyrinth vorkommen darf
|
|
||||||
if (!validate_maze_element(input))
|
if (!validate_maze_element(input))
|
||||||
throw MalformedMaze("The given input is not a valid element of a maze!");
|
throw MalformedMaze("The given input is not a valid element of a maze!");
|
||||||
|
|
||||||
// Schreibe den eingelesenen Wert in die aktuelle Reihe
|
|
||||||
row.push_back(input);
|
row.push_back(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Schreibe die fertige Reihe in das Feld
|
|
||||||
field.push_back(row);
|
field.push_back(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lese die Startposition des Spielers aus
|
|
||||||
vector<int> player_start_pos = request_numbers_from_user(2);
|
vector<int> player_start_pos = request_numbers_from_user(2);
|
||||||
|
|
||||||
// Gebe die Daten als Spielfeld zurück
|
|
||||||
return Maze(field, player_start_pos);
|
return Maze(field, player_start_pos);
|
||||||
} // Beispieleingabe: `4 3 #.# #.K #T# #Z# 0 1`
|
} // Beispieleingabe: `4 3 #.# #.K #T# #Z# 0 1`
|
||||||
} // game
|
} // game
|
||||||
|
|
11
MazeParser.h
11
MazeParser.h
|
@ -1,8 +1,4 @@
|
||||||
//
|
#include "std_lib_inc.h"
|
||||||
// Created by moonleay on 12/16/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "Maze.h"
|
|
||||||
|
|
||||||
#ifndef MAZEPARSER_H
|
#ifndef MAZEPARSER_H
|
||||||
#define MAZEPARSER_H
|
#define MAZEPARSER_H
|
||||||
|
@ -22,18 +18,19 @@ namespace game
|
||||||
/// Ist eine Konstante, darf also in global scope
|
/// Ist eine Konstante, darf also in global scope
|
||||||
static const vector<char> valid_maze_elements = {'Z', '.', '#', 'A', 'K', 'T'};
|
static const vector<char> valid_maze_elements = {'Z', '.', '#', 'A', 'K', 'T'};
|
||||||
|
|
||||||
|
class Maze;
|
||||||
class MazeParser
|
class MazeParser
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
/// Lese eine bestimmte Anzahl an Nummern aus der Konsole
|
/// Lese eine bestimmte Anzahl an Nummern aus der Konsole
|
||||||
/// @param amount_of_numbers Wie viele Nummern eingelesen werden sollen
|
/// @param amount_of_numbers Wie viele Nummern eingelesen werden sollen
|
||||||
/// @return Die eingelesenen Nummern
|
/// @return Die eingelesenen Nummern
|
||||||
static vector<int> request_numbers_from_user(int amount_of_numbers);
|
static vector<int> request_numbers_from_user(const int& amount_of_numbers);
|
||||||
|
|
||||||
/// Kontrolliere, ob ein Zeichen im Labyrinth vorkommen darf
|
/// Kontrolliere, ob ein Zeichen im Labyrinth vorkommen darf
|
||||||
/// @param target Das Zeichen, welches Kontrolliert werden soll
|
/// @param target Das Zeichen, welches Kontrolliert werden soll
|
||||||
/// @return Ob das gegebene Zeichen in einem Labyrinth vorkommen darf
|
/// @return Ob das gegebene Zeichen in einem Labyrinth vorkommen darf
|
||||||
static bool validate_maze_element(char target);
|
static bool validate_maze_element(const char& target);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Lese ein Labyrinth aus der Konsole
|
/// Lese ein Labyrinth aus der Konsole
|
||||||
|
|
21
Player.cpp
21
Player.cpp
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/12/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "std_lib_inc.h"
|
#include "std_lib_inc.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
#include "Maze.h"
|
#include "Maze.h"
|
||||||
|
@ -13,7 +9,6 @@ namespace game
|
||||||
{
|
{
|
||||||
Player::Player(const int target_x, const int target_y): pos(target_x, target_y), keys_in_inventory(0)
|
Player::Player(const int target_x, const int target_y): pos(target_x, target_y), keys_in_inventory(0)
|
||||||
{
|
{
|
||||||
// Wir brauchen keinen Inhalt in diesem Konstruktor, da wir nur die Variablen initialisieren müssen
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::Player(const PositionVector pos) : pos(pos), keys_in_inventory(0)
|
Player::Player(const PositionVector pos) : pos(pos), keys_in_inventory(0)
|
||||||
|
@ -22,39 +17,31 @@ namespace game
|
||||||
|
|
||||||
PositionVector Player::get_pos() const
|
PositionVector Player::get_pos() const
|
||||||
{
|
{
|
||||||
// Gebe die aktuelle Position des Spielers zurück
|
|
||||||
return this->pos;
|
return this->pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::update_position(const PositionVector target)
|
void Player::update_position(const PositionVector& target)
|
||||||
{
|
{
|
||||||
// Aktualisiere die aktuelle Position des Spielers
|
|
||||||
this->pos = target;
|
this->pos = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Maze Player::move(Maze& maze, const PositionVector move_vector)
|
Maze Player::move(Maze& maze, const PositionVector& move_vector)
|
||||||
{
|
{
|
||||||
// Berechne die Position, zu der der Spieler sich bewegen möchte
|
|
||||||
const PositionVector target_position = PositionVector(this->get_pos().x + move_vector.x,
|
const PositionVector target_position = PositionVector(this->get_pos().x + move_vector.x,
|
||||||
this->get_pos().y + move_vector.y);
|
this->get_pos().y + move_vector.y);
|
||||||
|
|
||||||
// Bewege den Spieler zu der gewollten Position, wenn diese frei ist
|
|
||||||
if (maze.is_pos_free(target_position, this->has_key_available()))
|
if (maze.is_pos_free(target_position, this->has_key_available()))
|
||||||
{
|
{
|
||||||
// Bewege Spieler zur neuen Position
|
|
||||||
this->update_position(target_position);
|
this->update_position(target_position);
|
||||||
|
|
||||||
// Kontrolliere das Feld nach speziellen Attributen
|
|
||||||
switch (maze.get_field(target_position))
|
switch (maze.get_field(target_position))
|
||||||
{
|
{
|
||||||
case 'K': // Spieler steht auf einem Schlüssel.
|
case 'K':
|
||||||
// Gebe dem Spieler einen Schlüssel und ersetze das Feld mit einem leeren
|
|
||||||
++this->keys_in_inventory;
|
++this->keys_in_inventory;
|
||||||
maze.update_field(target_position, '.');
|
maze.update_field(target_position, '.');
|
||||||
break;
|
break;
|
||||||
case 'T': // Spieler steht auf einer Tür
|
case 'T':
|
||||||
// Nehme dem Spieler einen Schlüssel weg und ersetze das Feld mit einem leeren
|
|
||||||
--this->keys_in_inventory;
|
--this->keys_in_inventory;
|
||||||
maze.update_field(target_position, '.');
|
maze.update_field(target_position, '.');
|
||||||
break;
|
break;
|
||||||
|
|
10
Player.h
10
Player.h
|
@ -1,6 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/12/24.
|
|
||||||
//
|
|
||||||
#include "PositionVector.h"
|
#include "PositionVector.h"
|
||||||
|
|
||||||
#ifndef PLAYER_H
|
#ifndef PLAYER_H
|
||||||
|
@ -8,7 +5,8 @@
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
class Maze; // use instead of include to speed up the compiler :)
|
class Maze;
|
||||||
|
|
||||||
/// Ein Spieler.
|
/// Ein Spieler.
|
||||||
/// Besitzt einen veränderbaren Positionsvektor
|
/// Besitzt einen veränderbaren Positionsvektor
|
||||||
class Player
|
class Player
|
||||||
|
@ -34,13 +32,13 @@ namespace game
|
||||||
|
|
||||||
/// Aktuallisiere die Position des Spielers ohne weitere Checks
|
/// Aktuallisiere die Position des Spielers ohne weitere Checks
|
||||||
/// @param target Das ziel
|
/// @param target Das ziel
|
||||||
void update_position(PositionVector target);
|
void update_position(const PositionVector& target);
|
||||||
|
|
||||||
/// Bewege den Splieler um den Bewegungsvektor, insofern die Zielposition begehbar ist
|
/// Bewege den Splieler um den Bewegungsvektor, insofern die Zielposition begehbar ist
|
||||||
/// @param maze Das Maze
|
/// @param maze Das Maze
|
||||||
/// @param move_vector Die gewollte Bewegung
|
/// @param move_vector Die gewollte Bewegung
|
||||||
/// @return Die neue Position des Spielers
|
/// @return Die neue Position des Spielers
|
||||||
Maze move(Maze& maze, PositionVector move_vector);
|
Maze move(Maze& maze, const PositionVector& move_vector);
|
||||||
|
|
||||||
/// Check, if a player has at least one key
|
/// Check, if a player has at least one key
|
||||||
/// @return If the player as an available key
|
/// @return If the player as an available key
|
||||||
|
|
|
@ -1,21 +1,15 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/12/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "PositionVector.h"
|
#include "PositionVector.h"
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
PositionVector::PositionVector(const int x, const int y)
|
PositionVector::PositionVector(const int x, const int y)
|
||||||
{
|
{
|
||||||
// Setze die Werte des PositionVectors
|
|
||||||
this->x = x;
|
this->x = x;
|
||||||
this->y = y;
|
this->y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PositionVector::update(const int x, const int y)
|
void PositionVector::update(const int& x, const int& y)
|
||||||
{
|
{
|
||||||
// Aktualisiere die Werte des PositionVectors
|
|
||||||
this->x = x;
|
this->x = x;
|
||||||
this->y = y;
|
this->y = y;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// Created by moonleay on 12/12/24.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef POSITION_H
|
#ifndef POSITION_H
|
||||||
#define POSITION_H
|
#define POSITION_H
|
||||||
|
|
||||||
|
@ -25,7 +21,7 @@ namespace game
|
||||||
/// Aktualisiere die Werte des Vectors
|
/// Aktualisiere die Werte des Vectors
|
||||||
/// @param x Die neue 'X'-Koordinate
|
/// @param x Die neue 'X'-Koordinate
|
||||||
/// @param y Die neue 'Y'-Koordinate
|
/// @param y Die neue 'Y'-Koordinate
|
||||||
void update(int x, int y);
|
void update(const int& x, const int& y);
|
||||||
};
|
};
|
||||||
} // game
|
} // game
|
||||||
|
|
||||||
|
|
6
main.cpp
6
main.cpp
|
@ -25,18 +25,14 @@ int main()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Lass den Nutzer ein Maze eingeben
|
|
||||||
Maze maze = MazeParser::request_maze_from_user();
|
Maze maze = MazeParser::request_maze_from_user();
|
||||||
|
|
||||||
// Erstelle eine Variable, in der wir den Spielstate speichern
|
|
||||||
Game game = Game(maze);
|
Game game = Game(maze);
|
||||||
|
|
||||||
// Starte das Spiel
|
|
||||||
game.run_game();
|
game.run_game();
|
||||||
}
|
}
|
||||||
catch (MalformedMaze& err)
|
catch (MalformedMaze& _)
|
||||||
{
|
{
|
||||||
// Das Labyrinth einlesen hat nicht geklappt. Gebe Fehlermeldung aus und beende das Programm.
|
|
||||||
cout << "Fehler beim Einlesen des Labyrinths.\n";
|
cout << "Fehler beim Einlesen des Labyrinths.\n";
|
||||||
} catch (ExitGame& _)
|
} catch (ExitGame& _)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue