epr24pr3_ojanssen2_dummed_d.../Game.cpp

123 lines
3.9 KiB
C++

//
// Created by moonleay on 12/17/24.
//
#include "Game.h"
#include "MazeParser.h"
#include "Player.h"
#include "Maze.h"
#include "Exceptions/MovementNotPossible.h"
#include "Exceptions/UnkownAction.h"
using game::Player;
using game::Maze;
using game_exceptions::UnkownAction;
using game_exceptions::MovementNotPossible;
namespace game // Namespace = Scope with name and no features
{
Game::Game(): maze({}, {}), player(0, 0)
{
// Lese das Labyrinth ein
maze = MazeParser::request_maze_from_user();
// Lese die Startpositon des Spielers aus dem eingelesenen Labyrinth aus
vector<int> player_start_position = maze.get_player_start_position();
// Überschreibe den Spieler mit der gegebenen Startposition
this->player = Player(player_start_position[1], player_start_position[0]);
}
PositionVector Game::handle_user_input(char input)
{
// Erstelle einen Vector mit einer Bewegung von 0 und 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)
{
case 'w':
movement_vector.update(0, -1);
break;
case 'a':
movement_vector.update(-1, 0);
break;
case 's':
movement_vector.update(0, 1);
break;
case 'd':
movement_vector.update(1, 0);
break;
case 'h':
// Schreibe hilfsreiche Tipps in die Konsole
cout <<
"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"
<< "Auf deinem Abenteuer wirst du dabei boesen Geistern (A) begegnen und mit Schluesseln (K) Tueren (T) aufschliessen.\n"
<< "Bewege dich mit 'w', 'a', 's' und 'd'.\n";
break;
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.");
}
return movement_vector;
}
void Game::run_game()
{
// Erstelle eine Variable für den Input
char game_input;
// Durchlaufe die Hauptschleife des Spiels
while (true)
{
// Kontrolliere, ob der Spieler an einem Geist gestorben ist
if (maze.was_player_killed_by_ghost(player))
{
cout << "Sie haben einen Geist getroffen! Game Over!\n";
break;
}
// Zeige dem Spieler das Spielfeld
maze.render(player);
// Kontrolliere, ob der Spieler schon das Ziel erreicht hat
if (maze.is_player_at_goal(player))
{
// Ziel erreicht! Herzlichen Glückwunsch!
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
break;
}
// Lese Eingabe des Spielers
cin >> game_input;
PositionVector movement_vector = PositionVector(0, 0);
try
{
movement_vector = handle_user_input(game_input);
} catch (UnkownAction& err)
{
cout << err.what() << "\n";
}
// Kontrolliere gewollte Bewegung und setze sie um.
try
{
maze = player.move(maze, movement_vector);
}
catch (MovementNotPossible& err)
{
// Diese Bewegung ist nicht möglich!
// Gebe aus, warum.
cout << err.what() << "\n";
}
}
}
} // game