epr24pr2-ojanssen2/main.cpp

144 lines
4.7 KiB
C++
Raw Normal View History

2024-11-20 11:31:05 +01:00
#include "std_lib_inc.h"
2024-12-07 18:33:06 +01:00
// Ein Programm, welches dir erlaubt ein Labyrinth zu erkunden mit 'w', 'a', 's', und 'd'.
2024-11-20 11:31:05 +01:00
2024-12-07 18:33:06 +01:00
// kMaze[y][x]
const vector<vector<char>> kMaze = {
2024-11-20 11:31:05 +01:00
{'#', '.', '.', '.', '.'},
{'#', '.', '#', '.', '.'},
{'.', 'Z', '#', '.', '.'},
{'.', '#', '#', '#', '.'},
2024-12-02 14:53:24 +01:00
{'.', '.', '.', '.', '.'}
2024-12-07 18:33:06 +01:00
// ^ Spieler startet hier (4,0)
2024-11-20 11:31:05 +01:00
};
2024-12-07 18:33:06 +01:00
/* Legende
* S - Spieler
* Z - Ziel
* . - Leerer Raum (begehbar)
* # - Wand
2024-12-02 14:53:24 +01:00
*/
2024-12-07 18:33:06 +01:00
const vector<int> kPlayerStartPosition = {4, 0};
/// Bewege den Splieler um den Bewegungsvector, falls die Ziel position begehbar ist
/// @param player_pos Die aktuelle Position des Spielers
/// @param move_vector Die gewollte Bewegung
/// @return Die neue Position des Spielers
vector<int> move_player(vector<int> player_pos, vector<int> move_vector);
2024-12-02 14:53:24 +01:00
2024-12-07 18:33:06 +01:00
/// Kontrolliere, ob eine bestimmte Position begehbar ist
/// @param target Die Position, die kontrolliert werden soll
/// @return Ob die Position begehbar ist
bool is_pos_free(vector<int> target);
2024-12-02 14:53:24 +01:00
2024-12-07 18:33:06 +01:00
/// Zeige das Spielfeld in der Konsole an
/// @param player_pos Die aktuelle Position des Spielers
void render_play_field(vector<int> player_pos);
2024-11-20 11:31:05 +01:00
2024-12-02 14:53:24 +01:00
int main()
{
2024-12-07 18:33:06 +01:00
// Erstelle die Spielerposition als Vector, formattiert als (y, x)
vector<int> player_pos = kPlayerStartPosition;
2024-12-02 15:02:19 +01:00
2024-12-07 18:33:06 +01:00
// Erstelle eine Variable für den Input
2024-12-02 14:53:24 +01:00
char input;
2024-11-25 15:40:01 +01:00
2024-12-07 18:33:06 +01:00
// Durchlaufe die Hauptschleife des Spiels
2024-12-02 14:53:24 +01:00
while (true)
{
2024-12-07 18:33:06 +01:00
// Zeige dem Spieler das Spielfeld
render_play_field(player_pos);
2024-12-02 15:02:19 +01:00
2024-12-07 18:33:06 +01:00
// Kontrolliere, ob der Spieler schon das Ziel erreicht hat
if (kMaze[player_pos[0]][player_pos[1]] == 'Z')
2024-12-02 14:53:24 +01:00
{
2024-12-07 18:33:06 +01:00
// Ziel erreicht! Herzlichen Glückwunsch!
cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n";
break;
2024-12-02 14:53:24 +01:00
}
2024-12-07 18:33:06 +01:00
// Lese Eingabe des Spielers
cin >> input;
2024-11-25 15:40:01 +01:00
2024-12-07 18:33:06 +01:00
// Erstelle einen Vector mit einer Bewegung von 0 und 0
vector<int> target_movement_vector = {0, 0};
2024-12-07 18:33:06 +01:00
// 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':
target_movement_vector = {-1, 0};
break;
case 'a':
target_movement_vector = {0, -1};
break;
case 's':
target_movement_vector = {1, 0};
break;
case 'd':
target_movement_vector = {0, 1};
break;
case 'h':
2024-12-07 18:33:06 +01:00
// Schreibe hilfsreiche Tipps in die Konsole
cout << "Gebe 'w', 'a', 's', oder 'd' ein zum bewegen. Gebe 'h' ein um diesen Text anzuzeigen.\n";
break;
default:
2024-12-07 18:33:06 +01:00
// Die gewollte Aktion kenne ich nicht. Schreibe eine Fehlernachricht in die Konsole
cout << "Diese Eingabe kenne ich nicht. Gib 'h' ein, um eine Hilfe zu erhalten.\n";
2024-12-02 14:53:24 +01:00
break;
}
2024-12-07 18:33:06 +01:00
// Kontrolliere gewollte Bewegung und setze sie um.
player_pos = move_player(player_pos, target_movement_vector);
2024-11-25 15:40:01 +01:00
}
2024-12-07 18:33:06 +01:00
// Beende das Programm
2024-12-02 14:53:24 +01:00
return 0;
2024-11-25 15:40:01 +01:00
}
vector<int> move_player(vector<int> player_pos, vector<int> move_vector)
{
2024-12-07 18:33:06 +01:00
// Berrechne die Position, zu die der Spieler sich bewegen möchte
const vector<int> target_position = { player_pos[0] + move_vector[0], player_pos[1] + move_vector[1] };
2024-12-07 18:33:06 +01:00
// Bewege den Spieler zu der gewollten Position, wenn diese frei ist
if (is_pos_free(target_position))
{
player_pos[0] += move_vector[0];
player_pos[1] += move_vector[1];
}
else
2024-12-02 14:53:24 +01:00
cout << "Bewegung nicht moeglich!\n";
2024-12-07 18:33:06 +01:00
// Gebe die Spielerposition zurück
return player_pos;
2024-12-02 14:53:24 +01:00
}
2024-11-25 15:40:01 +01:00
bool is_pos_free(vector<int> target)
2024-12-02 14:53:24 +01:00
{
if (target[1] < 0 || target[0] < 0 || target[1] > kMaze.size() - 1 || target[0] > kMaze[target[1]].size() - 1)
2024-12-07 18:33:06 +01:00
return false; // Zielposition ist außerhalb des Spielfelds
if (kMaze[target[0]][target[1]] == '#')
2024-12-07 18:33:06 +01:00
return false; // Zielposition ist eine Wand
return true; // Zielposition ist betretbar (ist keine Wand und auch nicht außerhalb des Spielfeldes)
2024-12-02 14:53:24 +01:00
}
2024-11-25 15:40:01 +01:00
void render_play_field(const vector<int> player_pos)
2024-12-02 14:53:24 +01:00
{
for (int i = 0; i < kMaze.size(); ++i)
2024-12-07 18:33:06 +01:00
{ // Für jede Reihe ...
for (int j = 0; j < kMaze[i].size(); ++j)
2024-12-07 18:33:06 +01:00
{ // ... schreibe für jedes Element ...
if (i == player_pos[0] && j == player_pos[1])
2024-12-07 18:33:06 +01:00
cout << "S"; // ... 'S' wenn der aktuelle Eintrag die Position des Spielers ist
else // sonst
cout << kMaze[i][j]; // ... den tatsächlichen Eintrag
cout << " "; // Füge ein Leerzeichen zwischen den Einträgen hinzu
2024-11-25 15:40:01 +01:00
}
2024-12-07 18:33:06 +01:00
cout << "\n"; // Beende die Reihe mit einem Zeilenumbruch
2024-11-25 15:40:01 +01:00
}
}