2013-11-14 5 views
3

Я пишу небольшую игру, состоящую из лабиринта, персонажа игрока и множества врагов. И ПК, и враги принадлежат к определенному классу, и они обновляют их движение каждые несколько миллисекунд в соответствии с указанными мной критериями. (Все эти ограничения являются частью задания). Теперь я пытаюсь написать критерии, чтобы ни враги, ни ПК не переместились на квадрат, занятый лабиринтной стеной. Для этого я использовал следующий способ (все это в классе 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, сколько миллисекунд прошло , так что враг будет перемещать соответствующее количество пикселей.

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

Любая помощь в устранении этих недостатков будет оценена по достоинству. Я понимаю, что этот вопрос не очень краток, но из-за моей неопытности с языком я не мог придумать, как сделать вопрос более конкретным, и никакие предыдущие ответы не помогли мне. Заранее спасибо!

ответ

1

, если вы только проверяете конечную позицию, не будет ли змея ударить по стене, если она мешает. Скажите, что стена только 15 квадратных метров от змеи?

Кроме того, змея движется 30 * segundos, но вы только проверить, если есть стена 30 квадратных прочь

if snake[1] > self.heroe_x: 
    next_position_x = snake[1] - (30 * segundos) 
    if self.isNotWall(next_position_x,snake[2]): 
     snake[1] = next_position_x 

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

http://en.wikipedia.org/wiki/Pathfinding

Также проверьте эту библиотеку

http://lib2dp.sourceforge.net/

+0

Я вижу проблемы, которые вы отмечаете, но имейте в виду, я не могу использовать внешние библиотеки (это для назначения). Есть ли у вас предложения по внедрению isNotWall для каждого пикселя в диапазоне между текущей позицией и точкой прибытия? Мои попытки пока не сработали. –

+0

Вы можете проверить каждый квадрат по дороге. Реализация поиска пути не должна быть очень сложной. A * (звезда) - очень удобный и не столь жесткий алгоритм для реализации. –

+0

Хотя я ценю эти предложения, я боюсь, что внедрение алгоритмов поиска путей не соответствует сложности этого назначения. Тем не менее, я выделил источник проблемы, который заключается в том, что программа рассматривает координаты символа как единую точку x, y в пикселях. Теперь я пытаюсь придумать способ реализовать метод, так что позиция персонажа определяется квадратом бокового self.grid, что позволяет частично перекрывать стены. –

Смежные вопросы