69 lines
2 KiB
C++
69 lines
2 KiB
C++
//
|
|
// Created by moonleay on 12/12/24.
|
|
//
|
|
|
|
#include "std_lib_inc.h"
|
|
#include "Player.h"
|
|
#include "Maze.h"
|
|
#include "Exceptions/MovementNotPossible.h"
|
|
|
|
using game_exceptions::MovementNotPossible;
|
|
|
|
namespace game
|
|
{
|
|
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
|
|
}
|
|
|
|
PositionVector Player::get_pos() const
|
|
{
|
|
// Gebe die aktuelle Position des Spielers zurück
|
|
return this->pos;
|
|
}
|
|
|
|
void Player::update_position(const PositionVector target)
|
|
{
|
|
// Aktualisiere die aktuelle Position des Spielers
|
|
this->pos = target;
|
|
}
|
|
|
|
|
|
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,
|
|
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()))
|
|
{
|
|
// Bewege Spieler zur neuen Position
|
|
this->update_position(target_position);
|
|
|
|
// Kontrolliere das Feld nach speziellen Attributen
|
|
switch (maze.get_field(target_position))
|
|
{
|
|
case 'K': // Spieler steht auf einem Schlüssel.
|
|
// Gebe dem Spieler einen Schlüssel und ersetze das Feld mit einem leeren
|
|
++this->keys_in_inventory;
|
|
maze.update_field(target_position, '.');
|
|
break;
|
|
case 'T': // Spieler steht auf einer Tür
|
|
// Nehme dem Spieler einen Schlüssel weg und ersetze das Feld mit einem leeren
|
|
--this->keys_in_inventory;
|
|
maze.update_field(target_position, '.');
|
|
break;
|
|
default: ;
|
|
}
|
|
}
|
|
else
|
|
throw MovementNotPossible("Bewegung nicht moeglich!");
|
|
return maze;
|
|
}
|
|
|
|
bool Player::has_key_available() const
|
|
{
|
|
return this->keys_in_inventory > 0;
|
|
}
|
|
} // game
|