#include "std_lib_inc.h" // A program which allows you to wander across a maze using 'w','a','s' and 'd'. const vector> kMaze = { // kMaze[y][x] {'#', '.', '.', '.', '.'}, {'#', '.', '#', '.', '.'}, {'.', 'Z', '#', '.', '.'}, {'.', '#', '#', '#', '.'}, {'.', '.', '.', '.', '.'} // ^ player starts here (4,0) }; const vector kPlayerStartPosition = {4,0}; /* legend * S - player * Z - goal * . - empty space * # - wall */ /// Use inputs to move the player. Don't move the player, if move is illegal /// @param player_pos The current player position /// @param move_vector The requested move vector /// @return The new position of the player vector move_player(vector player_pos, vector move_vector); /// Check if a certain space can be moved to /// @param target The position to check /// @return If the position can be moved to bool is_pos_free(vector target); /// Check if a certain space can be moved to /// @param player_pos The current player position void render_play_field(vector player_pos); int main() { // Create player position formatted as (y, x) vector player_pos = kPlayerStartPosition; // Create input variable char input; // Run the game loop while (true) { // Render the play field render_play_field(player_pos); // Check if the goal has been reached yet if (kMaze[player_pos[0]][player_pos[1]] == 'Z') { // Goal reached! Let's celebrate! cout << "Ziel erreicht! Herzlichen Glueckwunsch!\n"; break; } // Get input cin >> input; // Create an empty vector to store the requested movement in vector target_movement_vector = {0, 0}; // Check what the player wants to do. Store the requested movement in the vector // print messages to screen if help was requested or an unknown input was entered 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': // Print help text to console cout << "Gebe 'w', 'a', 's', oder 'd' ein zum bewegen. Gebe 'h' ein um diesen Text anzuzeigen.\n"; break; default: // Target action not recognized. Print 'error' message to screen cout << "Diese Eingabe kenne ich nicht. Gib 'h' ein, um eine Hilfe zu erhalten.\n"; break; } // Check & apply the requested movement player_pos = move_player(player_pos, target_movement_vector); } // End the program return 0; } vector move_player(vector player_pos, vector move_vector) { // Calculate the position the player wants to move to const vector target_position = { player_pos[0] + move_vector[0], player_pos[1] + move_vector[1] }; // Move player to requested position in case position is free if (is_pos_free(target_position)) { player_pos[0] += move_vector[0]; player_pos[1] += move_vector[1]; } else cout << "Bewegung nicht moeglich!\n"; // Return the player position return player_pos; } bool is_pos_free(vector target) { if (target[1] < 0 || target[0] < 0 || target[1] > kMaze.size() - 1 || target[0] > kMaze[target[1]].size() - 1) return false; // Target pos out of bounds of area if (kMaze[target[0]][target[1]] == '#') return false; // Target pos is a wall return true; // Target pos is movable to (is not wall and not out of bounds) } void render_play_field(const vector player_pos) { for (int i = 0; i < kMaze.size(); ++i) { // For every row... for (int j = 0; j < kMaze[i].size(); ++j) { // ... render ... if (i == player_pos[0] && j == player_pos[1]) cout << "S"; // ... 'S' if it is the entry where the player is currently else cout << kMaze[i][j]; // ... the actual entry of the field cout << " "; // Add space between entries } cout << "\n"; // Finish the row by ending the actively drawn line } }