// // 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 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