epr24pr3_ojanssen2_dummed_d.../Maze.cpp

80 lines
2.7 KiB
C++
Raw Normal View History

//
// Created by moonleay on 12/13/24.
//
#include "Maze.h"
#include "Player.h"
#include "Exceptions/MalformedMaze.h"
using game_exceptions::MalformedMaze;
namespace game
{
Maze::Maze(const vector<vector<char>> play_field, const vector<int> player_start_position):
field(play_field),
player_start_position(PositionVector{player_start_position[1], player_start_position[0]})
{
if (!this->is_pos_free(this->player_start_position, false))
throw MalformedMaze("Player oob");
}
bool Maze::was_player_killed_by_ghost(Player player) const
{
2024-12-16 23:44:01 +01:00
// Kontrolliere ob der Spieler an einem Geist gestorben ist
return this->field[player.get_pos().y][player.get_pos().x] == 'A';
}
bool Maze::is_player_at_goal(Player player) const
{
2024-12-16 23:44:01 +01:00
// Kontrolliere ob der Spieler am Ziel ist
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
{
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
if (field[pos.y][pos.x] == '#')
return false; // Zielposition ist eine Wand
if (field[pos.y][pos.x] == 'T')
return player_has_key; // Zielposition ist eine Tür
return true; // Zielposition ist betretbar (ist keine Wand und auch nicht außerhalb des Spielfeldes)
}
void Maze::render(Player player) const
{
for (int y = 0; y < field.size(); ++y)
{
// Für jede Reihe ...
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)
cout << "S"; // ... 'S' wenn der aktuelle Eintrag die Position des Spielers ist
else // sonst
cout << field[y][x]; // ... den tatsächlichen Eintrag
cout << " "; // Füge ein Leerzeichen zwischen den Einträgen hinzu
}
cout << "\n"; // Beende die Reihe mit einem Zeilenumbruch
}
}
char Maze::get_field(PositionVector pos) const
{
2024-12-16 23:44:01 +01:00
// Gebe das Element der gewollten Position zurück
return this->field[pos.y][pos.x];
}
void Maze::update_field(PositionVector pos, char target)
{
2024-12-16 23:44:01 +01:00
// Aktuallisiere ein gegebens Feld dem gegebenen Wert
this->field[pos.y][pos.x] = target;
}
PositionVector Maze::get_player_start_position() const
{
2024-12-16 23:44:01 +01:00
// Gebe die Startposition des Spielers zurück
return this->player_start_position;
}
} // game