Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 357
В этой версии появилась функция которая позволяет находить кратчайший путь в лабиринте.
findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY)
Первый параметр указатель на двухмерный массив int в котором записан лабиринт в виде:
0 - свободный проход
1 - стена
2 - старт
3 - финиш
Второй параметр указатель на двухмерный массив int в который запишется кратчайший путь в виде нумерации от 0 (старт), до финишной позиции включительно:
0 1 2 3 4 5 и тд.
-1 - все остальное поле лабиринта
Третий - размер лабиринта по X
Четвертый - размер лабиринта по Y
Выделяемая память под первый и второй параметр может быть больше размера лабиринта.
Возвращает функция количество шагов.
-1 если размер лабиринта более чем выделено памяти в массивах.
0 - если пути нет.
========================
Массивы лабиринта и результата заполняются в соответствие:
Первый индекс X
Второй Y.
Нулевой индекс находится в левом верхнем углу лабиринта
Нажмите для увеличения
Пример:
Есть данный лабиринта. Они у нас записаны в фал в таком виде:
int k=findpath(#labirint[0][0], #pyt[0][0], sizeX, sizeY);
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
if (pyt[x][y]>-1)
{
Xx[pyt[x][y]]=kx[x][y];
Yy[pyt[x][y]]=ky[x][y];
}
}
}
if (k>0)
{
for (int n=0; n<k; n++)
{
mouse(LEFT, Xx[n]+2, Yy[n]+2);
}
if (fopen ("c:\ЛАБИРИНТ.txt", "w")!=0)
{
for (y=0; y<sizeY; y++)
{
for (x=0; x<sizeX; x++)
{
fwrite(labirint[x][y]);
fwrite(" ");
}
fwrite(ENDL);
}
fclose();
}
}
messagebox(k);
Skycrew
Отправлено: 23 Мая, 2017 - 22:37:18
Мастер
Покинул форум
Сообщений всего: 123
Дата рег-ции: Июль 2014
Репутация: 0
Прикольно!
Это мне напоминает что-то по типу построения кратчайших путей в графах. Там же примерно такая же логика алгоритма вроде? Ты через алгоритм Дейкстры делал?
Вообще было бы очень круто расширить функционал для поиска коротких путей в любых произвольных графах, например:
Вершина А имеет связь с Б и длинна связи: 3
Вершина В имеет связь с Б длинна 1
И так далее, задача найти короткий путь от А к В например.
Данные бы задавались 2-мерным массивом, где по Х все вершины и по Y все вершины -1 связи нет, больше нуля указывается вес связи (типа "длинна" 0 там где вершина сопоставлена сам с собой. Вывод в виде общей длинны пути и массива последовательности шагов по вершинам.
Покинул форум
Сообщений всего: 20
Дата рег-ции: Окт. 2016 Откуда: msk
Репутация: 0
нет слов, спасибо за ап... ))) Правда с длл решил вопрос по твоему совету) но щас будет удобней ))) И что же с блоками 128 блоков(
Kibor
Отправлено: 24 Мая, 2017 - 16:29:58
Эксперт
Покинул форум
Сообщений всего: 8203
Дата рег-ции: Март 2013 Откуда: Одесса
Репутация: 357
Простой волновой алгоритм, если учесть что сканирование экрана делать по клеткам, то вполне подходит для движения по разным траекториям.
AlexM
Отправлено: 20 Июня, 2020 - 13:53:44
Прохожий
Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2019
Репутация: 0
нужно запилить параметр включения артогонально-диагонального алгоритма.
Мнем б щас очень пригодился.
konctantin777
Отправлено: 11 Декабря, 2020 - 19:47:57
Эксперт
Покинул форум
Сообщений всего: 1168
Дата рег-ции: Окт. 2017 Откуда: Архангельск
Репутация: 6
Здравствуйте.
А можно пройти лабиринт и вернуться в ту же точку ? Т.е. в игре есть карта и надо где стартуешь, туда и возвращаться пройдя всю.
Dantes3000
Отправлено: 11 Декабря, 2020 - 23:36:31
Эксперт
Покинул форум
Сообщений всего: 1489
Дата рег-ции: Июнь 2016
Репутация: 58
konctantin777 , можно
konctantin777
Отправлено: 12 Декабря, 2020 - 09:52:38
Эксперт
Покинул форум
Сообщений всего: 1168
Дата рег-ции: Окт. 2017 Откуда: Архангельск
Репутация: 6
Dantes3000 пишет:
konctantin777 , можно
Понятно, что можно просто ставить несколько точек, чтобы двигался от одно к другой )
А с помощью этой функции, чтобы просто "дал лабиринт" и нарисовало весь возможный путь ?
Paskuda
Отправлено: 28 Июня, 2022 - 07:13:19
Участник
Покинул форум
Сообщений всего: 61
Дата рег-ции: Янв. 2021
Репутация: 0
Поделитесь скриптиком который бы передвигался по этому кратяайшему пути например с помощю кнопок WASD?
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.