Теория и технологии программирования

Нужен алгоритм уклонения монстра

Всем здравствуйте!
Я занимаюсь программированием ради удоаольствия, в свободное время.
Поэтому, уровень мой, можно сказать, близок к нолю.
Тем не менее, узнавать что-то новое для меня всегда приятно.
У меня следующая проблема:
В игре есть персонаж (Р) и есть монстр (М). Если монстр ранен,
он убегает (>>>) от персонажа и прячется за препятствиями (Х).
Когда расстояние от пересонажа до монстра справа и слева вокруг
препятствия одинаково, монстр должен остановиться (О).
Монст должен выбирать только те препятствия, вокруг которых можно обойти.
Как реализовать такое поведение? Нужен принцип, алгоритм.
М>>>
ХХХO
ХХХ
ХХХ
Р ХХХ
Заранее спасибо.
Вам нужно поискать по темам "Поиск пути", это не такой сложный алгоритм, он должен выполняться на каждого монстра как только его жизнь на низком уровне.
1) Если HP монстра выше нужного прога - поиск пути до персонажа (нападение);
2) Если HP монстра ниже нужного порога - поиск пути (пока не появится возможность скрыться от прямого вида персонажа).
Это довольно популярная тема, в сети много информации. Ключевые слова для поиска:
Алгоритм поиска кратчайшего пути
Алгоритм Дейкстры
Спасибо за советы, но то, что Вы мне предлагаете - это не то.
Уйти из поля зрения персонажа - мало. Монстр должен держаться на самом дальнем расстоянии и прятаться за препятствием.
Как найти кратчайший путь, я знаю. Я не могу найти самую удаленную точку за преградой.
Нужно что-то подобное:
step1: пустить волну от персонажа во все стороны, пока волна не наткнулась на препятствие.
step2: от точки столкновения волны с препятствием начать трассировку вокруг препятствия в обе стороны пока круг не замкнется.
step3: от точки смыкания пустить волну пока она не наткнется на монстра. Заставить монстра идти по клеткам с наименьшим значением
Вот как-то так. Может можно проще? Подскажите.
Забавно, ...ваш алгоритм построен так, что монстр задом чувствует где персонаж и постоянно перемещается за препятствием на равное растояние. Как тогда убить монстра, если он все время бегает, даже если не видит вас? По идее, монстр должен укрываться за ближайшим к нему препятствием и останавливаться, а если он снова увидит персонажа, то делать ноги чтобы опять не видеть персонажа. Волну следует пускать от монстра. Ну это ИМХО, а как вам нужно вы уже знаете, даже план действий есть, в чем проблемы?
Как тогда убить монстра, если он все время бегает, даже если не видит вас?
Никак! Это подлый монстр, он любой ценой должен спастись.
По идее, монстр должен укрываться за ближайшим к нему препятствием и останавливаться, а если он снова увидит персонажа, то делать ноги чтобы опять не видеть персонажа.
Когда мы повернем за угол где стоит монстр, он может нас огреть чем-нибудь. А какой смысл ему убегать, когда его жертва так близко?
Ну, если серьезно, просто я так хочу. Моя игра - не имитация реальной жизни. Пусть монстр слышит шаги, пусть у него будет радар, или еще что-нибудь. В конце концов, мы-то видим всю игровую ситуацию сверху (игра лабиринтная двумерная), видим все ходы, всех врагов, себя... Пусть монстр тоже видит.
Волну следует пускать от монстра
Тогда, при достижении искомой точки надо будет пускать обратную волну, которая прокладывает маршрут. Это в чистом виде волновой алгоритм. А, раз координаты искомой точки заранее известны, пускаем только одну волну - дискретный метод.
а как вам нужно вы уже знаете, даже план действий есть, в чем проблемы?
Все время находится какая-то мелочь, которая мою программу портит. Ситуация на игровом поле постоянно меняется и алгоритмы при определенных условиях дают сбои. Я уже кучу перепробывал. Одни находят точку только за препятствиями простой формы, другие - только в узких ходах между препятствиями и т.д.
Нужен надежный метод. Планируется еще редактор уровней, поэтому, каким будет игровое поле предсказать сложно. Может кто-то уже сталкивался с такой проблемой?
Сообщение от pre_pod
Всем здравствуйте!
Я занимаюсь программированием ради удоаольствия, в свободное время.
Поэтому, уровень мой, можно сказать, близок к нолю.
Наоборот, если только для удовольствия - то уровень должен быть высоким. Ведь то, что мы любим, тем мы чаще и занимаемся.
Сообщение от pre_pod
Когда мы повернем за угол где стоит монстр, он может нас огреть чем-нибудь. А какой смысл ему убегать, когда его жертва так близко?
Ну, если монстр действительно хитрый, то он понимает, что с одного удара он персонажа не срубит, а унего HP как раз на один удар персонажа, так что, ему лучше делать ноги
Раз дела обстоят таким образом, то может просто не париться, пускать волну от монстра к ближайшему препятствию, переть туда, брать сразу позицию персонажа и выполнять противоположные движения, но направленные кроме того к центру препятствия? Задачу можно упростить, если для каждого препятствия можно будет задать его центр обхода в редакторе.
P.S. "Иногда бывают случаи, когда 11-летний пацан решает задачу проще и эффективнее, только потому, что он не такой умный как вы."
Да, так было бы логичнее всего. Дойти до препятствия и "спросить" у него, куда идти дальше, но сами препятствия у меня тоже меняются и исчезают...
Можно попробовать использовать контрольные точки (или как они там называются).
Насчет последнего утверждения полностью согласен.
pre_pod, если посмотреть в корень, то все гораздо проще. Вот есть монстр. По определению хитрый, по поведению вполне тупой. Это определение выполняется не сложными алгоритмами, а применением той же хитрости программирования. Раз препятствия появляются и исчезают, то и соответственно точки центра в них так же появляются и исчезают. Как делать? ...через расчет ширины и высоты (наибольшее число клеток по-горизонтали и по-вертикали и деление пополам, с учетом четности или нечетности). Искусственного интеллекта нет, и не может быть, есть только то, что заложено алгоритмами. В вашем случае важен результат видимый на экране, своего рода псевдоинтеллект, который на самом деле просто противоположные действия. Нужно лишь установить пределы работы "хитрого" метода.