Miklix

Генератор на лабиринти с алгоритъм на Eller

Публикувано: 16 февруари 2025 г. в 19:54:22 ч. UTC

Генератор на лабиринти, използващ алгоритъма на Eller за създаване на перфектен лабиринт. Този алгоритъм е интересен, тъй като изисква само запазване на текущия ред (а не целия лабиринт) в паметта, така че може да се използва за създаване на много, много големи лабиринти дори на много ограничени системи.

Тази страница е машинно преведена от английски език, за да бъде достъпна за възможно най-много хора. За съжаление машинният превод все още не е съвършена технология, така че могат да възникнат грешки. Ако предпочитате, можете да видите оригиналната версия на английски език тук:

Eller's Algorithm Maze Generator

Алгоритъмът на Eller е алгоритъм за генериране на лабиринти, който ефективно създава перфектни лабиринти (лабиринти без цикли и единичен път между всеки две точки), използвайки подход ред по ред. Той създава лабиринти, подобни на алгоритъма на Kruskal, но го прави, като генерира само един ред наведнъж, без да е необходимо да съхранявате целия лабиринт в паметта. Това го прави полезен за генериране на много големи лабиринти на много ограничени системи и за процедурно генериране на съдържание.

Перфектен лабиринт е лабиринт, в който има точно един път от всяка точка в лабиринта до всяка друга точка. Това означава, че не можете да се въртите в кръг, но често ще срещате задънени улици, което ще ви принуди да се обърнете и да се върнете обратно.

Генерираните тук карти на лабиринта включват версия по подразбиране без начални и крайни позиции, така че можете да ги определите сами: ще има решение от всяка точка в лабиринта до всяка друга точка. Ако искате да получите вдъхновение, можете да активирате предложена начална и крайна позиция - и дори да видите решението между двете.


Генериране на нов лабиринт








Относно алгоритъма на Eller

Алгоритъмът на Eller е въведен от David Eller.

Алгоритъмът се отличава с ефективния си подход ред по ред за генериране на лабиринти, което го прави идеален за безкрайни лабиринти или лабиринти, генерирани в реално време. Обикновено се цитира в литературата за генериране на процедурно съдържание и генериране на лабиринти, но не успях да намеря първични източници, описващи подробно оригиналната му публикация.

Как работи алгоритъмът на Eller за генериране на лабиринт

Алгоритъмът на Eller обработва един ред наведнъж, поддържайки и модифицирайки набори от свързани клетки. Той гарантира свързаност, като същевременно избягва примки, и ефективно разширява лабиринта надолу.

Теоретично може да се използва за генериране на безкрайни лабиринти, но за да се гарантира, че генерираният лабиринт действително е разрешим, е необходимо да превключите към логиката на „последния ред“ в даден момент, за да завършите лабиринта.

Стъпка 1: Инициализирайте първия ред

  • Присвоете на всяка клетка в реда уникален набор ID.

Стъпка 2: Свържете някои съседни клетки хоризонтално

  • Произволно обединяване на съседни клетки, като им зададете един и същ набор ID. Това гарантира, че има хоризонтални проходи.

Стъпка 3: Създайте вертикални връзки към следващия ред

  • За всеки набор, който се появява в реда, поне една клетка трябва да се свърже надолу (за да се осигури свързаност).
  • Произволно изберете една или повече клетки от всеки набор, за да се свържете със следващия ред.

Стъпка 4: Преминете към следващия ред

  • Пренесете напред вертикалните връзки, като присвоите същия набор ID на съответните клетки по-долу.
  • Присвояване на нови идентификатори на набори към всички неприсвоени клетки.

Стъпка 5: Повторете стъпки 2-4, докато не бъде достигнат последният ред

  • Продължете да обработвате ред по ред.

Стъпка 6: Обработете последния ред

  • Уверете се, че всички клетки в последния ред принадлежат към един и същи набор, като обедините всички останали отделни набори.

Споделете в BlueskyСподелете във FacebookСподелете в LinkedInСподелете в TumblrСподелете в XСподелете в LinkedInЗакачи в Пинтерест

Микел Банг Кристенсен

За автора

Микел Банг Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.