epr24pr3_ojanssen2_dummed_d.../MazeParser.cpp

100 lines
3.1 KiB
C++
Raw Normal View History

//
// Created by moonleay on 12/16/24.
//
#include "MazeParser.h"
#include "Exceptions/ExitGame.h"
#include "Exceptions/MalformedMaze.h"
using game_exceptions::MalformedMaze;
using game_exceptions::ExitGame;
2024-12-16 23:21:24 +01:00
namespace game
{
vector<int> MazeParser::request_numbers_from_user(const int amount_of_numbers)
{
2024-12-16 23:44:01 +01:00
// Erstelle eine Variable für die Eingabe der Zahl(en)
int input;
2024-12-16 23:44:01 +01:00
// Erstelle eine Liste für die einzulesenden Nummern
vector<int> list;
2024-12-16 23:44:01 +01:00
// Lese soviel ein, wie gefragt
for (int i = 0; i < amount_of_numbers; ++i)
{
2024-12-16 23:44:01 +01:00
// Lese Zahl ein
cin >> input;
2024-12-16 23:44:01 +01:00
2024-12-16 23:49:26 +01:00
// Sollte etwas schiefgelaufen sein, dann wirf eine Exception
if (!cin)
throw MalformedMaze("Cin failed while reading numbers!");
2024-12-16 23:44:01 +01:00
// Schreibe die gelesene Zahl auf die Liste
list.push_back(input);
}
2024-12-16 23:44:01 +01:00
// Gebe die Liste zurück
return list;
}
bool MazeParser::validate_maze_element(const char target)
2024-12-16 23:44:01 +01:00
{
// Gehe jedes erlaubte Element durch und
for (const char c : valid_maze_elements)
// Gucke, ob es das gegebene Element ist
if (c == target)
return true; // Gebe wahr zurück, wenn das Element in der Liste ist
// Sollte es kein Element in der Liste geben, welches dem gegebenen Entspricht, dann ist das Element nicht erlaubt.
return false;
}
Maze MazeParser::request_maze_from_user()
{
2024-12-16 23:44:01 +01:00
// Lese aus, wie groß das Labyrinth sein soll
vector<int> maze_size = request_numbers_from_user(2);
2024-12-16 23:44:01 +01:00
// Erstelle eine Variable für den Labyrinth-Input
char input;
2024-12-16 23:44:01 +01:00
// Erstelle ein leeres Feld
vector<vector<char>> field;
2024-12-16 23:44:01 +01:00
// Lese das eingegebene Labyrinth ein
for (int y = 0; y < maze_size[0]; ++y)
{
2024-12-16 23:44:01 +01:00
// Für jede Reihe erstelle eine Variable...
vector<char> row;
2024-12-16 23:44:01 +01:00
for (int x = 0; x < maze_size[1]; ++x)
{
2024-12-16 23:44:01 +01:00
// und lese jedes Element der Reihe ein
cin >> input;
2024-12-16 23:44:01 +01:00
// Werfe eine Exception, wenn der Input nicht lesbar ist, d.h. Nutzer hat eine Falsch eingabe getätigt.
if (!cin)
throw MalformedMaze("Cin failed while reading chars!");
2024-12-16 23:44:01 +01:00
// Verlasse das Spiel
if (input == 'q')
throw ExitGame("Schoenen Tag noch!");
2024-12-16 23:44:01 +01:00
// Kontrolliere, ob das Element in einem Labyrinth vorkommen darf
if (!validate_maze_element(input))
throw MalformedMaze("The given input is not a valid element of a maze!");
2024-12-16 23:44:01 +01:00
// Schreibe den eingelesenen Wert in die aktuelle Reihe
row.push_back(input);
}
2024-12-16 23:44:01 +01:00
// Schreibe die fertige Reihe in das Feld
field.push_back(row);
}
2024-12-16 23:44:01 +01:00
// Lese die Startposition des Spielers aus
vector<int> player_start_pos = request_numbers_from_user(2);
2024-12-16 23:44:01 +01:00
// Gebe die Daten als Spielfeld zurück
return Maze(field, player_start_pos);
2024-12-16 23:44:01 +01:00
} // Beispieleingabe: `4 3 #.# #.K #T# #Z# 0 1`
} // game