用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_width
和 cell_height
.
- 然后您的迷宫将被定义为大小为
maze_height * cell_height + 1
和 maze_width * cell_width + 1
的字符矩阵。右边框和底边框需要额外的一个。
- 为了填充边框,可以定义两个辅助函数,
fill_horizontal_border_cell
和fill_vertical_border_cell
。这些函数只是将字符串horizontal_border_fill
和vertical_border_fill
的内容分别复制到迷宫矩阵中。
- 最后,您需要单独填充左下角的边框。
- 所有这些代码都应正确封装到 类 中(例如
MazeView
用于可打印迷宫,MazeBorderView
用于可打印迷宫边框,等等)。
#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:
//
// +---+---+---+---+---+---+
// | |
// + +
// | |
// + +
// | |
// + +
// | |
// + +
// | |
// +---+---+---+---+---+---+
我想用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_width
和cell_height
. - 然后您的迷宫将被定义为大小为
maze_height * cell_height + 1
和maze_width * cell_width + 1
的字符矩阵。右边框和底边框需要额外的一个。 - 为了填充边框,可以定义两个辅助函数,
fill_horizontal_border_cell
和fill_vertical_border_cell
。这些函数只是将字符串horizontal_border_fill
和vertical_border_fill
的内容分别复制到迷宫矩阵中。 - 最后,您需要单独填充左下角的边框。
- 所有这些代码都应正确封装到 类 中(例如
MazeView
用于可打印迷宫,MazeBorderView
用于可打印迷宫边框,等等)。
#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:
//
// +---+---+---+---+---+---+
// | |
// + +
// | |
// + +
// | |
// + +
// | |
// + +
// | |
// +---+---+---+---+---+---+