epr24pr3_ojanssen2/MazeParser.cpp

91 lines
2.9 KiB
C++

//
// Created by moonleay on 12/16/24.
//
#include "MazeParser.h"
namespace game
{
vector<int> MazeParser::request_numbers_from_user(const int amount_of_numbers)
{
// Erstelle eine Variable für die Eingabe der Zahl(en)
int input;
// Erstelle eine Liste für die einzulesenden Nummern
vector<int> list;
// Lese soviel ein, wie gefragt
for (int i = 0; i < amount_of_numbers; ++i)
{
// Lese Zahl ein
cin >> input;
// Sollte etwas schief gelaufen sein, dann wirf eine Exception
if (!cin)
throw runtime_error("Cin failed while reading numbers!");
// Schreibe die gelesene Zahl auf die Liste
list.push_back(input);
}
// Gebe die Liste zurück
return list;
}
bool MazeParser::is_valid_maze_element(const char target)
{
// 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()
{
// Lese aus, wie groß das Labyrinth sein soll
vector<int> maze_size = request_numbers_from_user(2);
// Erstelle eine Variable für den Labyrinth-Input
char input;
// Erstelle ein leeres Feld
vector<vector<char>> field;
// Lese das eingegebene Labyrinth ein
for (int y = 0; y < maze_size[0]; ++y)
{
// Für jede Reihe erstelle eine Variable...
vector<char> row;
for (int x = 0; x < maze_size[1]; ++x)
{
// und lese jedes Element der Reihe ein
cin >> input;
// Werfe eine Exception, wenn der Input nicht lesbar ist, d.h. Nutzer hat eine Falsch eingabe getätigt.
if (!cin)
throw runtime_error("Cin failed while reading chars!");
// Kontrolliere, ob das Element in einem Labyrinth vorkommen darf
if (!is_valid_maze_element(input))
throw runtime_error("The given input is not a valid element of a maze!");
// Schreibe den eingelesenen Wert in die aktuelle Reihe
row.push_back(input);
}
// Schreibe die fertige Reihe in das Feld
field.push_back(row);
}
// Lese die Startposition des Spielers aus
vector<int> player_start_pos = request_numbers_from_user(2);
// Gebe die Daten als Spielfeld zurück
return Maze(field, player_start_pos);
} // Beispieleingabe: `4 3 #.# #.K #T# #Z# 0 1`
} // game