Я пишу небольшую игру, состоящую из лабиринта, персонажа игрока и множества врагов. И ПК, и враги принадлежат к определенному классу, и они обновляют их движение каждые несколько миллисекунд в соответствии с указанными мной критериями. (Все эти ограничения являются частью задания). Теперь я пытаюсь написать критерии, чтобы ни враги, ни ПК не переместились на квадрат, занятый лабиринтной стеной. Для этого я использовал следующий способ (все это в классе Game творю):Алгоритм обнаружения столкновений в python
def isNotWall(self,x,y):
self.wallXI = 0
self.wallXF = 0
self.wallYI = 0
self.wallYF = 0
for wall in self.wallList:
self.wallXI = wall[0]*self.grid + 1
self.wallXF = (wall[0]+1)*self.grid
self.wallYI = wall[1]*self.grid + 1
self.wallYF = (wall[1]+1)*self.grid
if self.wallXI < x < self.wallXF and self.wallYI < y < self.wallYF:
return False
return True
Где wallList находится список, содержащий координаты х и у для каждой стены в массиве координат и сетки является размер каждого квадрата сетки (в этом случае 32 пикселя).
Теперь, для примера того, как я осуществил это:
if snake[1] > self.heroe_x:
if self.isNotWall(snake[1] - 30,snake[2]):
snake[1] = snake[1] - 30 * segundos
Где змея [1] является х-координаты в пикселях, змея [2] у, и segundos, сколько миллисекунд прошло , так что враг будет перемещать соответствующее количество пикселей.
В соответствии с этим змея (и персонаж) не должна двигаться в определенном направлении, если их расположение в конце движения занято стеной. Однако это работает только частично, поведение неустойчиво, некоторые стены работают только в одном направлении, и часто персонажи застревают внутри стен или перестают холодно без причины.
Любая помощь в устранении этих недостатков будет оценена по достоинству. Я понимаю, что этот вопрос не очень краток, но из-за моей неопытности с языком я не мог придумать, как сделать вопрос более конкретным, и никакие предыдущие ответы не помогли мне. Заранее спасибо!
Я вижу проблемы, которые вы отмечаете, но имейте в виду, я не могу использовать внешние библиотеки (это для назначения). Есть ли у вас предложения по внедрению isNotWall для каждого пикселя в диапазоне между текущей позицией и точкой прибытия? Мои попытки пока не сработали. –
Вы можете проверить каждый квадрат по дороге. Реализация поиска пути не должна быть очень сложной. A * (звезда) - очень удобный и не столь жесткий алгоритм для реализации. –
Хотя я ценю эти предложения, я боюсь, что внедрение алгоритмов поиска путей не соответствует сложности этого назначения. Тем не менее, я выделил источник проблемы, который заключается в том, что программа рассматривает координаты символа как единую точку x, y в пикселях. Теперь я пытаюсь придумать способ реализовать метод, так что позиция персонажа определяется квадратом бокового self.grid, что позволяет частично перекрывать стены. –