Изграждане на лабиринт и писане на програма за намиране на изхода - Макроси и VBA програми - Excel - Каталог

лабиринт

Ето симулатор на лабиринт, базиран на Excel. Можете да създадете лабиринти с всякаква сложност и да усъвършенствате своите алгоритми за търсене на изход върху тях. Направих го за забавление. Получи се доста смешно.

Стените се чертаят лесно с помощта на единици. Условното форматиране ще свърши останалото.

Вие сами определяте началната точка чрез активната клетка.

Бутонът "Старт" стартира вашия алгоритъм за търсене на изход

Тези клетки, които сте посетили по време на търсенето, са маркирани в зелено.

Бутонът "Почисти" подготвя лабиринта за ново пускане.

Ако текущата позиция на играча и изходът от лабиринта са на една и съща линия, между тях няма препятствия и играчът проучва тази посока за възможността да направи ход там, тогава в този случай намирането на изхода от лабиринта е фиксирано. По принцип константата ExitCondition =100 е дефинирана в кода. Ако стандартната подпрограма Can_I_Move(Direction) определи, че има повече от 100 клетки в посоката между текущата позиция на играча и най-близкото препятствие (всяка константа на листа или неговата граница), тогава фактът на напускане на лабиринта се фиксира и алгоритъмът спира.

Играч, който иска да напише алгоритъм за търсене в лабиринт, има на разположение следните инструменти:

Процедура MyFindExit, която можете да използвате като контейнер за вашия алгоритъм.

Константи на посоката: dRight = 1, dDown = 2, dLeft = 3 и dUp = 4

Функция Can_I_Move(Direction) , която връща нула, ако има стена в Direction, или броя на ходовете, които можете да направите до най-близката стена, но не повече от ограничението за видимост (Constant VisibilityLimit = 4)

Функцията Was_I_Here(Direction), която връща -1, ако виене сте ходили преди това в съседна клетка в указаната посока, 1 - ако вече сте били там (колко пъти сте били там, няма как да разберете), 0 - ако има препятствие в тази посока.

Допуска се създаване на 2-4 цели променливи и 1-2 логически променливи за нуждите на алгоритъма.

Желателно е да преброите броя на ходовете в алгоритъма. Алгоритъмът спира да работи, ако са направени повече ходове, отколкото в константата IterationsLimit, и изходът все още не е намерен.

Можете да прекъснете алгоритъма с Ctrl + Break

Паузата между ходовете се контролира от константата WaitAfterMove, която по подразбиране е 50 милисекунди.

Какво бихте искали?

Бих искал да разгледам вашите универсални алгоритми за намиране на изход от лабиринти. Всеки лабиринт, който има изход. Написах собствен алгоритъм, но се оказа доста тромав. Оставих го във файла, но препоръчвам да опитате да напишете свой собствен алгоритъм. Знам, че ще се справиш много по-добре! Освен това е доста забавно да наблюдавате процеса на намиране на изход. Очакваме вашите страхотни идеи!