用C ++制作迷宫的右墙

Make right wall of a maze in c++

我想用C++做一个迷宫,但是我一直运行进了右外墙的问题。我想知道你们是否知道我可以制作外墙的方法。我一直在尝试使用 \n 从上到下工作,但是当使用 \n 时,下一个符号只会转到左墙。提前致谢!

#include <iostream>
#include <vector>
#include <stack>

/* class Maze {
    public:
        void makeMaze();
        void Print() const;
    private:
        std::vector <std::vector <char>> Maze;
}; */

int main(int argc, char* argv[]) {
    const int WIDTH = 4;
    const int HEIGHT = 4;
    /* std::string seedValue = " ";
    HEIGHT = atoi(argv[1]);
    WIDTH = atoi(argv[2]);
    if (argc > 3) {
        seedValue = argv[3];
    }  */
    // row, column
    std::vector <std::vector <std::string>> Maze (WIDTH + 1, std::vector<std::string> (HEIGHT + 1));
    // Roof
    for (int column = 0; column < WIDTH; column++) {   
        Maze[0][column] = "+---";
    }
    // Left Wall
    for (int row = 1; row < HEIGHT + 1; row++) {
        Maze[row][0] = "|\n+";
    }
    // Floor
    for (int i = 1; i < WIDTH + 1; i++) {
        Maze[HEIGHT][i] = "---+";
    }
    // Right Wall

    // FIXME
    
    // Print Maze
    for (int i = 0; i < Maze.size(); i++) {
        for (int j = 0; j < Maze.at(0).size(); j++) {
            std::cout << Maze[i][j];
        }
        std::cout << std::endl;
    }
}

您可以保留当前的大部分实现。唯一的问题是 \n。没有任何这些,它们是不需要的,只会给你带来麻烦。您的 std::cout << std::endl; 在每一行之后换行,这就是您所需要的。所以,不要在左边或右边的墙

中包含 \n

要同时“创建”右墙,您可以复制对左墙所做的操作,但要进行一些小的调整:

// Right wall
for (int row = 1; row < HEIGHT + 1; row++) {
    Maze[row][WIDTH] = "|";
}

另外,加号有什么用? (+) 您不必将字符串合并在一起即可使其正常工作。您的 std::cout << Maze[i][j]; 只是将每个字符串添加到前一个字符串的末尾,直到您发送 endl 来换行。

所以,我想说去掉优点,(除非是为了造型)。

左边的墙应该是这样的:

// Left Wall
for (int row = 1; row < HEIGHT + 1; row++) {
    Maze[row][0] = "|";
}

您可能希望将可打印迷宫视为字符矩阵而不是字符串矩阵:

  • 您可以考虑迷宫边界的每个单元格具有水平填充 +--- 和垂直填充 +|,以及 cell_widthcell_height.
  • 然后您的迷宫将被定义为大小为 maze_height * cell_height + 1maze_width * cell_width + 1 的字符矩阵。右边框和底边框需要额外的一个。
  • 为了填充边框,可以定义两个辅助函数,fill_horizontal_border_cellfill_vertical_border_cell。这些函数只是将字符串horizontal_border_fillvertical_border_fill的内容分别复制到迷宫矩阵中。
  • 最后,您需要单独填充左下角的边框。
  • 所有这些代码都应正确封装到 类 中(例如 MazeView 用于可打印迷宫,MazeBorderView 用于可打印迷宫边框,等等)。

[Demo]

#include <iostream>  // cout
#include <string>
#include <vector>

int main(int argc, char* argv[]) {
    // Border
    const std::string horizontal_border_fill{"+---"};
    const std::string vertical_border_fill{"+|"};
    auto cell_width{horizontal_border_fill.size()};
    auto cell_height{vertical_border_fill.size()};

    // Maze
    const size_t maze_width = 6;
    const size_t maze_height = 5;
    std::vector<std::vector<char>> maze(maze_height * cell_height + 1,
        std::vector<char>(maze_width * cell_width + 1, ' '));  // + 1 for the right and bottom borders

    // Fill border
    auto fill_horizontal_border_cell = [&maze, &horizontal_border_fill, &cell_width, &cell_height](size_t row, size_t col) {
        row *= cell_height;
        col *= cell_width;
        for (auto& c : horizontal_border_fill) { maze[row][col++] = c; }
    };
    auto fill_border_vertical_cell = [&maze, &vertical_border_fill, &cell_width, &cell_height](size_t row, size_t col) {
        row *= cell_height;
        col *= cell_width;
        for (auto& c : vertical_border_fill) { maze[row++][col] = c; }
    };
    for (size_t col{0}; col < maze_width; ++col) {  // horizontal borders
        fill_horizontal_border_cell(0, col);  // top
        fill_horizontal_border_cell(maze_height, col);  // bottom
    }
    for (size_t row{0}; row < maze_height; ++row) {  // vertical borders
        fill_border_vertical_cell(row, 0);  // top
        fill_border_vertical_cell(row, maze_width);  // bottom
    }
    maze[maze_height * cell_height][maze_width * cell_width] = horizontal_border_fill[0];  // bottom left border corner
    
    // Print maze
    for (size_t row{0}; row < maze.size(); ++row) {
        for (size_t col{0}; col < maze[0].size(); ++col) {
            std::cout << maze[row][col];
        }
        std::cout << "\n";
    }
}

// Outputs:
//
//   +---+---+---+---+---+---+
//   |                       |
//   +                       +
//   |                       |
//   +                       +
//   |                       |
//   +                       +
//   |                       |
//   +                       +
//   |                       |
//   +---+---+---+---+---+---+