Как я могу создать ячейки или сетки в C ++ для рандомизированного лабиринта? - PullRequest
4 голосов
/ 28 декабря 2008

Я пытаюсь создать рандомизированный лабиринт в C ++, но не могу начать, потому что не знаю, как создавать сетки или ячейки Как я мог создать это? И я также хочу создать его, используя символы ASCII. как я могу сохранить его в массиве? (может ли кто-нибудь дать пример кода и некоторые пояснения, чтобы я мог его лучше понять)

Еще один вопрос: какие структуры данных мне нужно изучить и использовать? Я планирую использовать алгоритм Эллера или алгоритм Крускала.

Спасибо, ребята, что помогли мне! Я начинающий программист, и я хочу узнать об этом, потому что это часть моего проекта, большое спасибо!

Ответы [ 3 ]

7 голосов
/ 28 декабря 2008

Вы ищете Алгоритмы создания лабиринта ( больше )? У вас проблемы с алгоритмами или графикой?

Типичные алгоритмы работают, рассматривая каждую «клетку» в лабиринте как вершину графа, начинаются со всех «стен» и удаляют набор стен, который соответствует остовному дереву. (Таким образом, чтобы рандомизировать его, многие из них начинают со случайных весов и находят минимальное остовное дерево.) По крайней мере, для небольших лабиринтов вам не нужна особая структура данных для представления ячеек; Вы можете просто думать о каждой ячейке как о паре (x,y) (ее координаты). И вам не нужна какая-либо структура данных (матрица смежности / список смежности) для хранения ребер графа, потому что соседи (x,y) просто (x,y±1) и (x±1,y) (игнорируя те, которые выходят за границы) .

В любом случае, если у вас есть связующее дерево, вы точно знаете, какие из стен «существуют», а какие нет, поэтому у вас есть полное описание лабиринта. Если вы собираетесь рисовать лабиринт, вы знаете, какие рисовать.

Чтобы рисовать символами ASCII, вы просто проходите через каждый ряд один за другим: рисуете «верхние стены» (поставьте «--», если стена между (x,y) и (x,y+1) существует), затем нарисуйте фактическая строка (поставить «|», если стена между (x,y) и (x+1,y) существует). Наконец нарисуйте нижнюю границу.

2 голосов
/ 29 декабря 2008

Возможно, вы хотите сохранить свой лабиринт в двухмерном массиве символов. Вы можете объявить массив с или без инициализации его в C ++.

char a[30][10];  // declares a char array of 30 rows and 10 columns.

// declare an array with 3 rows and 3 columns, and provide initial values
char ticTacToeBoard[3][3] = {{'x', 'x', 'o'},
                             {'o', 'o', 'x'},
                             {'x', 'o', ' '}
                            };

Вы можете изменить начальные значения на '|' и '-' для стен в вашем лабиринте и использовать пробел, ' ', для проходов. Любой метод инициализации работает, но вы всегда используете элементы одинаково. Вот как вы очищаете доску в инициализированном массиве выше.

// clear the board
for (int row=0; row<3; row++) {
    for (int col=0; col<3; col++) {
        ticTacToeBoard[row][col] = ' ';
    }
}

Если вы хотите прочитать значение элемента (полезно, когда вы пытаетесь перемещаться по лабиринту), вы используете ту же запись нижнего индекса, что и при установке его значения.

char y = a[2][2]; // reads the character in row 2, column 2
0 голосов
/ 28 декабря 2008

Вертикальная стена: | Horiz. Стена: _

Если вы используете шрифты фиксированной ширины:

 _____
| |  _
|_  | |
 __ | |
|_____|

Я точно не знаю, что делать, но вот с чего бы начать.

Определите, где в вашей сетке будут начальная и конечная точки. Затем создайте единый путь с любыми загогулами, которые вы хотите. По сути, это должно быть случайное движение, проверяющее каждый раз, что путь до конца еще есть. Затем удалите определенное количество стен с этого пути и создайте другие пути из этих отверстий. Продолжайте до тех пор, пока не закончится свободное место. Тогда, возможно, убедитесь, что более короткие пути не были созданы. Если есть, заблокируйте их.

...