Войти
ПрограммированиеФорумИгровая логика и ИИ

Поиск пути на шахматной Iso карте (3 стр)

Страницы: 1 2 3
#30
21:19, 24 окт. 2020

xXZyzzXx
У тебя в цикле _x/_y ни когда не принимают значение +1 (а должны)


#31
(Правка: 21:38) 21:25, 24 окт. 2020

Jeners


Спасибо большое, я напился пива и перепутал значения, написал тогда for _y in range(-2, 1):, а нужно for _y in range(-1, 2). Теперь всё работает как нужно))

Результат

+ Показать

Код

+ Показать
#32
22:33, 24 окт. 2020

xXZyzzXx
> По такому массиву получится сделать карту перемещений?
По-моему, вы какой-то фигнёй занимаетесь.
У тебя же изначально в #0 уже есть сетка с координатами - почему не используешь её как есть?

И я не совсем понимаю, что должно в конечном итоге получиться в ячейках. Ты хочешь найти минимальный путь между двумя ячейками? В чём выражается стоимость пути? Количество ходов, которое нужно потратить на него?
Какую роль здесь играют радиусы? Юнит за один ход может перейти в любую ячейку в пределах радиуса?
Каким образом, всё-таки, считаются расстояния между ячейками? По прямой линии? По количеству прямых и диагональных шагов?

#33
1:25, 25 окт. 2020

Delfigamer

И я не совсем понимаю, что должно в конечном итоге получиться в ячейках. Ты хочешь найти минимальный путь между двумя ячейками? В чём выражается стоимость пути? Количество ходов, которое нужно потратить на него?

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

Какую роль здесь играют радиусы? Юнит за один ход может перейти в любую ячейку в пределах радиуса?

Изначально хотел с помощью радиуса сделать подсветку возможных ходов, что и получилось, но само движение нужно ещё сделать

Каким образом, всё-таки, считаются расстояния между ячейками? По прямой линии? По количеству прямых и диагональных шагов?

По прямым и диагональным шагам будет лучше сделать

#34
4:25, 25 окт. 2020

Вот, например, А-звезда.

#35
11:53, 25 окт. 2020

Delfigamer
По сути мы с ним и разобрали алгоритм A-Star =)

#36
(Правка: 20:42) 20:38, 25 окт. 2020

Delfigamer

Вот, например, А-звезда.

Добавил к себе, этот цикл нужен, чтоб повысить стоимость клеток вокруг той, куда нужно ходить? Их я убрал для тестов, результат получается не точный.

for x in range(6, 9):
  for y in range(9, 12):
    costField[x][y] = 20
costField[7][13] = float('inf')
generatePathField(7, 12, 100)  # Если поменять очки перемещений на 50, то получается это
+ Показать

Я немного переделал, чтоб отправлять в функцию только х, у и очки перемещений, но происходит странное, дублируются координаты:

Консоль:

+ Показать

Код:

+ Показать

На картинке отображение тайлов, жирным наложенные друг на друга:

дубликат | Поиск пути на шахматной Iso карте
#37
(Правка: 5:35) 5:32, 26 окт. 2020

xXZyzzXx
> for x in range(6, 9):
> for y in range(9, 12):
> costField[x][y] = 20
> costField[7][13] = float('inf')
Это задаётся проходимость разных клеток на карте, в качестве иллюстративного примера. Чем больше число - тем тяжелее клетка. float('inf') - полностью непроходимая.

xXZyzzXx
> print(move.prev, move.value)
Ты, скорее всего, неправильно понял код - в pathField[x][y].prev хранятся координаты ячейки, из которой нужно приходить в (x,y), чтобы получить минимальный путь.
Чтобы получить путь между двумя точками, нужен примерно такой код:

def buildPathTo(x,y):
  path = []
  current = (x,y)
  while current is not None:
    path.insert(0, current)
    cx,cy = current
    current = pathField[cx][cy].prev
  return path

generatePathField(startx, starty, movementPoints)
if pathField[endx][endy].value == 0:
    print('unreachable')
else:
    print(buildPathTo(endx, endy))
Если prev-ссылки обозначить стрелочками, то получится вот такой график:
Изображение

То, что координаты в prev дублируются - это означает, что из одной точки выходит сразу несколько путей.
На твоей картинке жирнота выглядит как раз логично - из каждой жирной клетки исходит сразу по три альтернативы (дальше от центра и две боковые), а из остальных - только по одному варианту, в сторону от центра.

#38
22:57, 27 окт. 2020

Delfigamer

Работает, и тайлы подсвечивает, и самый подходящий путь рассчитывает)

+ Показать

Страницы: 1 2 3
ПрограммированиеФорумИгровая логика и ИИ