xXZyzzXx
У тебя в цикле _x/_y ни когда не принимают значение +1 (а должны)
Jeners
Спасибо большое, я напился пива и перепутал значения, написал тогда for _y in range(-2, 1):, а нужно for _y in range(-1, 2). Теперь всё работает как нужно))
Результат
Код
xXZyzzXx
> По такому массиву получится сделать карту перемещений?
По-моему, вы какой-то фигнёй занимаетесь.
У тебя же изначально в #0 уже есть сетка с координатами - почему не используешь её как есть?
И я не совсем понимаю, что должно в конечном итоге получиться в ячейках. Ты хочешь найти минимальный путь между двумя ячейками? В чём выражается стоимость пути? Количество ходов, которое нужно потратить на него?
Какую роль здесь играют радиусы? Юнит за один ход может перейти в любую ячейку в пределах радиуса?
Каким образом, всё-таки, считаются расстояния между ячейками? По прямой линии? По количеству прямых и диагональных шагов?
Delfigamer
И я не совсем понимаю, что должно в конечном итоге получиться в ячейках. Ты хочешь найти минимальный путь между двумя ячейками? В чём выражается стоимость пути? Количество ходов, которое нужно потратить на него?
Основная цель - сделать передвижение юнитов. Визуально будет лучше, если ходить юниты будут не напрямую, а по осям и диагоналям, потому что на пути могут быть препятствия. Если позже реализовать здания, в которые вход только через дверной проём, а не стену, то придется сделать движение так
Какую роль здесь играют радиусы? Юнит за один ход может перейти в любую ячейку в пределах радиуса?
Изначально хотел с помощью радиуса сделать подсветку возможных ходов, что и получилось, но само движение нужно ещё сделать
Каким образом, всё-таки, считаются расстояния между ячейками? По прямой линии? По количеству прямых и диагональных шагов?
По прямым и диагональным шагам будет лучше сделать
Delfigamer
По сути мы с ним и разобрали алгоритм A-Star =)
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, то получается это
Я немного переделал, чтоб отправлять в функцию только х, у и очки перемещений, но происходит странное, дублируются координаты:
Консоль:
Код:
На картинке отображение тайлов, жирным наложенные друг на друга:
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 дублируются - это означает, что из одной точки выходит сразу несколько путей.
На твоей картинке жирнота выглядит как раз логично - из каждой жирной клетки исходит сразу по три альтернативы (дальше от центра и две боковые), а из остальных - только по одному варианту, в сторону от центра.
Delfigamer
Работает, и тайлы подсвечивает, и самый подходящий путь рассчитывает)
Тема в архиве.