Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2007, 01:15   #1
pre_pod
Пользователь
 
Аватар для pre_pod
 
Регистрация: 30.11.2007
Сообщений: 19
По умолчанию Нужен алгоритм уклонения монстра

Всем здравствуйте!
Я занимаюсь программированием ради удоаольствия, в свободное время.
Поэтому, уровень мой, можно сказать, близок к нолю.
Тем не менее, узнавать что-то новое для меня всегда приятно.

У меня следующая проблема:
В игре есть персонаж (Р) и есть монстр (М). Если монстр ранен,
он убегает (>>>) от персонажа и прячется за препятствиями (Х).
Когда расстояние от пересонажа до монстра справа и слева вокруг
препятствия одинаково, монстр должен остановиться (О).
Монст должен выбирать только те препятствия, вокруг которых можно обойти.

Как реализовать такое поведение? Нужен принцип, алгоритм.

М>>>
ХХХO
ХХХ
ХХХ
Р ХХХ

Заранее спасибо.
Изображения
Тип файла: jpg pic1 копия.jpg (24.4 Кб, 160 просмотров)
pre_pod вне форума Ответить с цитированием
Старый 01.12.2007, 17:10   #2
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вам нужно поискать по темам "Поиск пути", это не такой сложный алгоритм, он должен выполняться на каждого монстра как только его жизнь на низком уровне.
1) Если HP монстра выше нужного прога - поиск пути до персонажа (нападение);
2) Если HP монстра ниже нужного порога - поиск пути (пока не появится возможность скрыться от прямого вида персонажа).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.12.2007, 18:58   #3
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Это довольно популярная тема, в сети много информации. Ключевые слова для поиска:
Алгоритм поиска кратчайшего пути
Алгоритм Дейкстры
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 01.12.2007, 20:03   #4
pre_pod
Пользователь
 
Аватар для pre_pod
 
Регистрация: 30.11.2007
Сообщений: 19
По умолчанию

Спасибо за советы, но то, что Вы мне предлагаете - это не то.
Уйти из поля зрения персонажа - мало. Монстр должен держаться на самом дальнем расстоянии и прятаться за препятствием.

Как найти кратчайший путь, я знаю. Я не могу найти самую удаленную точку за преградой.

Нужно что-то подобное:

step1: пустить волну от персонажа во все стороны, пока волна не наткнулась на препятствие.

step2: от точки столкновения волны с препятствием начать трассировку вокруг препятствия в обе стороны пока круг не замкнется.

step3: от точки смыкания пустить волну пока она не наткнется на монстра. Заставить монстра идти по клеткам с наименьшим значением

Вот как-то так. Может можно проще? Подскажите.
Изображения
Тип файла: jpg step1.jpg (44.2 Кб, 161 просмотров)
Тип файла: jpg step2.jpg (50.0 Кб, 146 просмотров)
Тип файла: jpg step3.jpg (41.4 Кб, 149 просмотров)
pre_pod вне форума Ответить с цитированием
Старый 01.12.2007, 22:01   #5
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Забавно, ...ваш алгоритм построен так, что монстр задом чувствует где персонаж и постоянно перемещается за препятствием на равное растояние. Как тогда убить монстра, если он все время бегает, даже если не видит вас? По идее, монстр должен укрываться за ближайшим к нему препятствием и останавливаться, а если он снова увидит персонажа, то делать ноги чтобы опять не видеть персонажа. Волну следует пускать от монстра. Ну это ИМХО, а как вам нужно вы уже знаете, даже план действий есть, в чем проблемы?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 01.12.2007, 22:44   #6
pre_pod
Пользователь
 
Аватар для pre_pod
 
Регистрация: 30.11.2007
Сообщений: 19
По умолчанию

Цитата:
Как тогда убить монстра, если он все время бегает, даже если не видит вас?
Никак! Это подлый монстр, он любой ценой должен спастись.
Цитата:
По идее, монстр должен укрываться за ближайшим к нему препятствием и останавливаться, а если он снова увидит персонажа, то делать ноги чтобы опять не видеть персонажа.
Когда мы повернем за угол где стоит монстр, он может нас огреть чем-нибудь. А какой смысл ему убегать, когда его жертва так близко?
Ну, если серьезно, просто я так хочу. Моя игра - не имитация реальной жизни. Пусть монстр слышит шаги, пусть у него будет радар, или еще что-нибудь. В конце концов, мы-то видим всю игровую ситуацию сверху (игра лабиринтная двумерная), видим все ходы, всех врагов, себя... Пусть монстр тоже видит.

Цитата:
Волну следует пускать от монстра
Тогда, при достижении искомой точки надо будет пускать обратную волну, которая прокладывает маршрут. Это в чистом виде волновой алгоритм. А, раз координаты искомой точки заранее известны, пускаем только одну волну - дискретный метод.
Цитата:
а как вам нужно вы уже знаете, даже план действий есть, в чем проблемы?
Все время находится какая-то мелочь, которая мою программу портит. Ситуация на игровом поле постоянно меняется и алгоритмы при определенных условиях дают сбои. Я уже кучу перепробывал. Одни находят точку только за препятствиями простой формы, другие - только в узких ходах между препятствиями и т.д.
Нужен надежный метод. Планируется еще редактор уровней, поэтому, каким будет игровое поле предсказать сложно. Может кто-то уже сталкивался с такой проблемой?
pre_pod вне форума Ответить с цитированием
Старый 02.12.2007, 04:15   #7
SkyM@n
Laravel/Vue expert
Старожил Подтвердите свой е-майл
 
Аватар для SkyM@n
 
Регистрация: 08.08.2007
Сообщений: 2,832
По умолчанию

Цитата:
Сообщение от pre_pod Посмотреть сообщение
Всем здравствуйте!
Я занимаюсь программированием ради удоаольствия, в свободное время.
Поэтому, уровень мой, можно сказать, близок к нолю.
Наоборот, если только для удовольствия - то уровень должен быть высоким. Ведь то, что мы любим, тем мы чаще и занимаемся.
SkyM@n вне форума Ответить с цитированием
Старый 02.12.2007, 17:49   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от pre_pod Посмотреть сообщение
Когда мы повернем за угол где стоит монстр, он может нас огреть чем-нибудь. А какой смысл ему убегать, когда его жертва так близко?
Ну, если монстр действительно хитрый, то он понимает, что с одного удара он персонажа не срубит, а унего HP как раз на один удар персонажа, так что, ему лучше делать ноги

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

P.S. "Иногда бывают случаи, когда 11-летний пацан решает задачу проще и эффективнее, только потому, что он не такой умный как вы."
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 02.12.2007, 20:08   #9
pre_pod
Пользователь
 
Аватар для pre_pod
 
Регистрация: 30.11.2007
Сообщений: 19
По умолчанию

Да, так было бы логичнее всего. Дойти до препятствия и "спросить" у него, куда идти дальше, но сами препятствия у меня тоже меняются и исчезают...
Можно попробовать использовать контрольные точки (или как они там называются).
Насчет последнего утверждения полностью согласен.
pre_pod вне форума Ответить с цитированием
Старый 03.12.2007, 20:42   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

pre_pod, если посмотреть в корень, то все гораздо проще. Вот есть монстр. По определению хитрый, по поведению вполне тупой. Это определение выполняется не сложными алгоритмами, а применением той же хитрости программирования. Раз препятствия появляются и исчезают, то и соответственно точки центра в них так же появляются и исчезают. Как делать? ...через расчет ширины и высоты (наибольшее число клеток по-горизонтали и по-вертикали и деление пополам, с учетом четности или нечетности). Искусственного интеллекта нет, и не может быть, есть только то, что заложено алгоритмами. В вашем случае важен результат видимый на экране, своего рода псевдоинтеллект, который на самом деле просто противоположные действия. Нужно лишь установить пределы работы "хитрого" метода.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логика монстра(ов) ChukCha Gamedev - cоздание игр: Unity, OpenGL, DirectX 15 19.08.2008 15:31
Алгоритм SunKnight Работа с сетью в Delphi 5 29.04.2008 15:24
Алгоритм Rifler Паскаль, Turbo Pascal, PascalABC.NET 3 30.03.2008 01:33