В настоящее время с помощью следующего алгоритма я пытаюсь создать лабиринт:
// m_maze is a m_dim*m_dim matrix filled which '#' which means a wall and ' ' means a free cell
// const int dxdy[4][2] = { {0, -1}, {-1, 0}, {0, 1}, {1, 0} }; // {UP, LEFT, DOWN, RIGHT}
void Maze::generate() {
std::queue<std::pair<int, int>>neighbours;
neighbours.emplace(0, 0);
m_maze[0][0] = ' '; // marking a free cell
while (!neighbours.empty()) {
std::pair<int, int> currentCell = neighbours.front();
for (int d = 0; d < 4; d++) {
const int newX = currentCell.first + 2*dxdy[d][0];
const int newY = currentCell.second + 2*dxdy[d][1];
if (newX >= 0 && newY >= 0 && newX <= m_dim && newY <= m_dim && m_maze[newX][newY] && m_maze[newX][newY] == '#') {
m_maze[currentCell.first + dxdy[d][0]][currentCell.second + dxdy[d][1]] = ' ';
m_maze[newX][newY] = ' ';
neighbours.emplace(newX, newY);
}
}
neighbours.pop();
}
}
Проблема в том, что вывод выглядит так:
#
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
##########################
Я думал, что эта проблема возникает из-за инструкций внутри оператора if (), но я не уверен. Я давал эти инструкции следующим образом: я удаляю стену, а затем отмечаю следующую ячейку как свободную. Какие-нибудь советы?





Причина, по которой ваш алгоритм дает такие регулярные результаты, заключается в том, что в нем нет случайности. Продумайте работу алгоритма шаг за шагом.
В начальной точке (0,0): лабиринт становится
@__#####
_#######
_#######
########
########
########
где «@» — текущая позиция, а «свободное пространство» отображается с помощью «_»
Следующий,
___#####
_#######
@__#####
_#######
_#######
########
Затем
___#####
_#######
___#####
_#######
@__#####
########
А на следующем шаге нижняя позиция «@» уже равна «_», можно делать только шаг вправо. Так что становится
__@__###
_#######
___#####
_#######
___#####
########
Поскольку все последующие шаги одинаковы, результат будет следующим.
_______#
_#######
_______#
_#######
_______#
########
Направления в этом примере и вашем результате различаются, но это зависит от того, как используется индекс массива.
Вы одновременно копаете во всех возможных направлениях от текущей позиции.
Изменение этого параметра на «копать только в одном направлении и выбирать это направление случайным образом» приведет к результату, напоминающему лабиринт.
1) почему ты удваиваешь дельты? 2) не должно быть
newX <= m_dim && newY <= m_dimна самом делеnewX < m_dim && newY < m_dim?