feat!: added player spawn checks, started parsing maze as reference, player_start_position is now stored as a PositionVector, renamed is_vaild_maze_element to validate_maze_element
This commit is contained in:
parent
b59c6baed8
commit
a4cf0bf18f
9 changed files with 39 additions and 28 deletions
21
Game.cpp
21
Game.cpp
|
@ -18,19 +18,16 @@ using game_exceptions::ExitGame;
|
||||||
|
|
||||||
namespace game // Namespace = Scope with name and no features
|
namespace game // Namespace = Scope with name and no features
|
||||||
{
|
{
|
||||||
Game::Game(): maze({}, {}), player(0, 0)
|
Game::Game(Maze& maze): maze(maze), player(0, 0)
|
||||||
{
|
{
|
||||||
// Lese das Labyrinth ein
|
|
||||||
maze = MazeParser::request_maze_from_user();
|
|
||||||
|
|
||||||
// Lese die Startpositon des Spielers aus dem eingelesenen Labyrinth aus
|
// Lese die Startpositon des Spielers aus dem eingelesenen Labyrinth aus
|
||||||
vector<int> player_start_position = maze.get_player_start_position();
|
PositionVector player_start_position = this->maze.get_player_start_position();
|
||||||
|
|
||||||
// Überschreibe den Spieler mit der gegebenen Startposition
|
// Überschreibe den Spieler mit der gegebenen Startposition
|
||||||
this->player = Player(player_start_position[1], player_start_position[0]);
|
this->player = Player(player_start_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
PositionVector Game::handle_user_input(char input)
|
PositionVector Game::handle_user_input(const char input)
|
||||||
{
|
{
|
||||||
// Erstelle einen Vector mit einer Bewegung von 0 und 0
|
// Erstelle einen Vector mit einer Bewegung von 0 und 0
|
||||||
PositionVector movement_vector = PositionVector(0, 0);
|
PositionVector movement_vector = PositionVector(0, 0);
|
||||||
|
@ -79,18 +76,18 @@ namespace game // Namespace = Scope with name and no features
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Kontrolliere, ob der Spieler an einem Geist gestorben ist
|
// Kontrolliere, ob der Spieler an einem Geist gestorben ist
|
||||||
if (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
|
// Zeige dem Spieler das Spielfeld
|
||||||
maze.render(player);
|
this->maze.render(player);
|
||||||
|
|
||||||
|
|
||||||
// Kontrolliere, ob der Spieler schon das Ziel erreicht hat
|
// Kontrolliere, ob der Spieler schon das Ziel erreicht hat
|
||||||
if (maze.is_player_at_goal(player))
|
if (this->maze.is_player_at_goal(player))
|
||||||
{
|
{
|
||||||
// Ziel erreicht! Herzlichen Glückwunsch!
|
// Ziel erreicht! Herzlichen Glückwunsch!
|
||||||
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
|
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
|
||||||
|
@ -107,13 +104,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.
|
// Kontrolliere gewollte Bewegung und setze sie um.
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
maze = player.move(maze, movement_vector);
|
player.move(this->maze, movement_vector);
|
||||||
}
|
}
|
||||||
catch (MovementNotPossible& err)
|
catch (MovementNotPossible& err)
|
||||||
{
|
{
|
||||||
|
|
2
Game.h
2
Game.h
|
@ -17,7 +17,7 @@ namespace game
|
||||||
Player player;
|
Player player;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Game();
|
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
|
||||||
|
|
10
Maze.cpp
10
Maze.cpp
|
@ -4,14 +4,18 @@
|
||||||
|
|
||||||
#include "Maze.h"
|
#include "Maze.h"
|
||||||
#include "Player.h"
|
#include "Player.h"
|
||||||
|
#include "Exceptions/MalformedMaze.h"
|
||||||
|
|
||||||
|
using game_exceptions::MalformedMaze;
|
||||||
|
|
||||||
namespace game
|
namespace game
|
||||||
{
|
{
|
||||||
Maze::Maze(const vector<vector<char>> play_field, const vector<int> player_start_position):
|
Maze::Maze(const vector<vector<char>> play_field, const vector<int> player_start_position):
|
||||||
field(play_field),
|
field(play_field),
|
||||||
player_start_position(player_start_position)
|
player_start_position(PositionVector{player_start_position[1], player_start_position[0]})
|
||||||
{
|
{
|
||||||
// Wir brauchen keinen Inhalt in diesem Konstruktor, da wir nur die Variablen initialisieren müssen
|
if (!this->is_pos_free(this->player_start_position, false))
|
||||||
|
throw MalformedMaze("Player oob");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Maze::was_player_killed_by_ghost(Player player) const
|
bool Maze::was_player_killed_by_ghost(Player player) const
|
||||||
|
@ -67,7 +71,7 @@ namespace game
|
||||||
this->field[pos.y][pos.x] = target;
|
this->field[pos.y][pos.x] = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<int> Maze::get_player_start_position()
|
PositionVector Maze::get_player_start_position() const
|
||||||
{
|
{
|
||||||
// Gebe die Startposition des Spielers zurück
|
// Gebe die Startposition des Spielers zurück
|
||||||
return this->player_start_position;
|
return this->player_start_position;
|
||||||
|
|
4
Maze.h
4
Maze.h
|
@ -19,7 +19,7 @@ namespace game
|
||||||
/// Das Spielfeld
|
/// Das Spielfeld
|
||||||
vector<vector<char>> field;
|
vector<vector<char>> field;
|
||||||
/// Die Startposition des Spielers
|
/// Die Startposition des Spielers
|
||||||
vector<int> player_start_position;
|
PositionVector player_start_position;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Das Spielfeld
|
/// Das Spielfeld
|
||||||
|
@ -57,7 +57,7 @@ namespace game
|
||||||
|
|
||||||
/// Kriege die Startposition des Spielers
|
/// Kriege die Startposition des Spielers
|
||||||
/// @return Die Startposition des Spielers
|
/// @return Die Startposition des Spielers
|
||||||
vector<int> get_player_start_position();
|
PositionVector get_player_start_position() const;
|
||||||
};
|
};
|
||||||
} // game
|
} // game
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace game
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MazeParser::is_valid_maze_element(const char target)
|
bool MazeParser::validate_maze_element(const char target)
|
||||||
{
|
{
|
||||||
// Gehe jedes erlaubte Element durch und
|
// Gehe jedes erlaubte Element durch und
|
||||||
for (const char c : valid_maze_elements)
|
for (const char c : valid_maze_elements)
|
||||||
|
@ -49,8 +49,6 @@ namespace game
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Maze MazeParser::request_maze_from_user()
|
Maze MazeParser::request_maze_from_user()
|
||||||
{
|
{
|
||||||
// Lese aus, wie groß das Labyrinth sein soll
|
// Lese aus, wie groß das Labyrinth sein soll
|
||||||
|
@ -81,7 +79,7 @@ namespace game
|
||||||
throw ExitGame("Schoenen Tag noch!");
|
throw ExitGame("Schoenen Tag noch!");
|
||||||
|
|
||||||
// Kontrolliere, ob das Element in einem Labyrinth vorkommen darf
|
// Kontrolliere, ob das Element in einem Labyrinth vorkommen darf
|
||||||
if (!is_valid_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
|
// Schreibe den eingelesenen Wert in die aktuelle Reihe
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace game
|
||||||
/// 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 is_valid_maze_element(char target);
|
static bool validate_maze_element(char target);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// Lese ein Labyrinth aus der Konsole
|
/// Lese ein Labyrinth aus der Konsole
|
||||||
|
|
|
@ -16,6 +16,10 @@ namespace game
|
||||||
// Wir brauchen keinen Inhalt in diesem Konstruktor, da wir nur die Variablen initialisieren müssen
|
// 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)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
PositionVector Player::get_pos() const
|
PositionVector Player::get_pos() const
|
||||||
{
|
{
|
||||||
// Gebe die aktuelle Position des Spielers zurück
|
// Gebe die aktuelle Position des Spielers zurück
|
||||||
|
@ -29,7 +33,7 @@ namespace game
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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
|
// 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,
|
||||||
|
|
6
Player.h
6
Player.h
|
@ -24,6 +24,10 @@ namespace game
|
||||||
/// @param target_y Die Startposition des Spielers (Y-Koordinate)
|
/// @param target_y Die Startposition des Spielers (Y-Koordinate)
|
||||||
Player(int target_x, int target_y);
|
Player(int target_x, int target_y);
|
||||||
|
|
||||||
|
/// Ein Spieler
|
||||||
|
/// @param pos Die Startposition des Spielers
|
||||||
|
explicit Player(PositionVector pos);
|
||||||
|
|
||||||
/// Kriege die Position des Spielers
|
/// Kriege die Position des Spielers
|
||||||
/// @return Die Position des Spielers
|
/// @return Die Position des Spielers
|
||||||
PositionVector get_pos() const;
|
PositionVector get_pos() const;
|
||||||
|
@ -36,7 +40,7 @@ namespace game
|
||||||
/// @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, 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
|
||||||
|
|
10
main.cpp
10
main.cpp
|
@ -25,17 +25,19 @@ int main()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Erstelle eine Variable, in der wir das eingelesene Labyrinth speichern
|
// Lass den Nutzer ein Maze eingeben
|
||||||
Game game = Game();
|
Maze maze = MazeParser::request_maze_from_user();
|
||||||
|
|
||||||
|
// Erstelle eine Variable, in der wir den Spielstate speichern
|
||||||
|
Game game = Game(maze);
|
||||||
|
|
||||||
// Starte das Spiel
|
// Starte das Spiel
|
||||||
game.run_game();
|
game.run_game();
|
||||||
}
|
}
|
||||||
catch (MalformedMaze& _)
|
catch (MalformedMaze& err)
|
||||||
{
|
{
|
||||||
// Das Labyrinth einlesen hat nicht geklappt. Gebe Fehlermeldung aus und beende das Programm.
|
// 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";
|
||||||
return 0;
|
|
||||||
} catch (ExitGame& _)
|
} catch (ExitGame& _)
|
||||||
{
|
{
|
||||||
cout << "Schoenen Tag noch!" << "\n";
|
cout << "Schoenen Tag noch!" << "\n";
|
||||||
|
|
Loading…
Reference in a new issue