Существует два простых способа определения границ, подходящих для такой игры.
Более простой метод - разделить вашу область на сетку и использовать 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. Это позволяет им сначала рассмотреть «более вероятные» пути, но перейти к обходным путям, если окажется, что более прямые пути заблокированы.