Приключенческая игра - ходить по комнате - PullRequest
0 голосов
/ 26 октября 2009

Я работаю над приключенческой игрой на Python, используя Pygame. Моя главная проблема заключается в том, как я собираюсь определить границы комнаты и заставить главного героя ходить пешком, не выходя за границы каждый раз. К сожалению, я никогда не изучал алгоритмы, поэтому понятия не имею, как рассчитать путь. Я знаю, что этот вопрос довольно общий и на него трудно ответить, но точка в правильном направлении будет очень признательна. Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 октября 2009

Существует два простых способа определения границ, подходящих для такой игры.

Более простой метод - разделить вашу область на сетку и использовать 2D-массив, чтобы отслеживать, какие квадраты в сетке являются проходимыми. Обычно в этом массиве также хранится информация о вашей карте, поэтому в каждой позиции есть число, указывающее, содержит ли этот квадрат траву, или стену, или дорогу, или гору и т. Д. (И, следовательно, какое изображение отображать). Чтобы дать вам грубую картину:

######
#.#  #
# ## #
#    #
######

Более сложный метод, который необходим, если вы хотите что-то вроде «лабиринта», с тонкими стенками , состоит в том, чтобы использовать двумерный массив, который указывает, существует ли вертикальная стена между квадратами сетки, а также есть ли горизонтальная стена между квадратами сетки. Грубая картина (в ASCII она выглядит натянутой, но, надеюсь, вы поймете это):

 - - - -
| |     |
   - - 
|       |
 - - - -

Следующее, что нужно решить, это то, в каких направлениях может двигаться ваш персонаж (вверх / вниз / влево / вправо проще, но диагонали не слишком 1011 * слишком 1012 * намного сложнее). Затем программа в основном должна «мысленно» исследовать область, начиная с вашей текущей позиции, в надежде натолкнуться на пункт назначения.

Простой поиск, который легко реализовать для вверх / вниз / влево / вправо и который найдет вам кратчайший путь, если он есть, называется Поиск в ширину . Вот некоторый псевдокод:

queue = new Queue #just a simple first-in-first-out
queue.push(startNode)
while not queue.empty():
    exploreNode = queue.pop()
    if isWalkable(exploreNode): #this doesn't work if you use
                                #"thin walls". The check must go
                                #where the pushes are instead

        if isTarget(exploreNode):
            #success!!!
        else:
            #push all neighbours
            queue.push( exploreNode.up )
            queue.push( exploreNode.down )
            queue.push( exploreNode.left )
            queue.push( exploreNode.right )

Этот алгоритм является медленным для больших карт, но он поможет вам привыкнуть к некоторым понятиям поиска графов и поиска путей. После того, как вы убедились, что он работает правильно, вы можете попробовать заменить его на A * или что-то подобное, что должно дать те же результаты за меньшее время!

A * и многие другие алгоритмы поиска используют очередь приоритета вместо очереди FIFO. Это позволяет им сначала рассмотреть «более вероятные» пути, но перейти к обходным путям, если окажется, что более прямые пути заблокированы.

3 голосов
/ 26 октября 2009

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

Если эта игра двумерная (или 2.5), я предлагаю вам использовать систему плиток, так как проверка на столкновения будет проще. В Интернете можно найти много информации, с которой можно начать.

3 голосов
/ 26 октября 2009

К сожалению, я никогда не изучал алгоритмы, поэтому понятия не имею, как рассчитать путь.

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

1 голос
/ 26 октября 2009

Я не знаком с Pygame, но многие приложения обычно используют ограничивающие тома , чтобы определить границу некоторого региона. Идея состоит в том, что когда ваш персонаж ходит, вы будете проверять, пересекается ли громкость персонажа с объемом стены. Затем вы можете отрегулировать скорость или остановить движение вашего персонажа. Используйте различные формы, чтобы получить гладкую стену, чтобы ваш персонаж не застрял на острых краях.

Эти концепции могут использоваться для любого приложения, которое требует быстрого обнаружения границ и границ.

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