Як визначити діапазон можливих рухів у покроковій, дистанційній стратегічній грі?


11

Я створюю двовимірну покрокову стратегічну гру, використовуючи c ++ та SFML-2.0. Рух є на відстані, а не на сітці, з кількома різними фігурами у формі трикутника, які за певний поворот можуть або обертатися на місці, або рухатися вперед.

Рух працюватиме таким чином, що гравець вибирає місце, куди рухається твір, що генерує потенційний шлях для того, щоб твір пройшов. Після того, як гравець підтвердить своє рішення, твір переміститься по цьому шляху до потрібного місця. Шляхи обмежені двома факторами: відстань, наскільки далеко може вийти шматок, враховуючи будь-які повороти (тому якщо крива є, це буде довжина вздовж кривої, а не безпосередньо від точки до точки); і кут нахилу керма, наскільки далеко шматок може обертатися в будь-якій (і до кожної) точці під час руху (наприклад, від -30 до 30 градусів).

Моє запитання: як мені взяти участь у визначенні діапазону потенційних локацій, який гравець може вибрати, щоб рухати твір?

Я не зовсім впевнений, які рівняння та / або алгоритм тут використовувати. Первісний мій план був надзвичайно складним, до того моменту, коли його практично неможливо було здійснити, не кажучи вже про пояснення, і я в цей момент повністю загубився, коли проект зупинився.

Як я можу визначити діапазон, яким може рухатися одиниця, враховуючи його радіус повороту?

Наприклад, на зображенні нижче. Червоні, сині та зелені лінії були б однакової довжини. Фіолетовий круг позначає діапазон руху, по якому може рухатися одиниця. (Форма, ймовірно, неточна, і лінії, ймовірно, насправді не однакової довжини, але ви розумієте)

введіть тут опис зображення


Це ще тільки зможе просунути ту саму (загальну) відстань. Таким чином, питання насправді про з'ясувати , «наскільки ж це виходить?» / «Скільки потрібно повернути?» / « Де робить це потрібно повернути?». Вам, мабуть, потрібно почати з визначення звичайного шляху, а потім зробити крок назад на поворот назад для кутів вище певної кількості; зауважте, що кінцева відстань буде довшою прямолінійним шляхом (поворот останнім), ніж кривими.
Завод-Муза

Так, пройдена відстань є головним обмежуючим фактором. Моя найбільша перешкода тут полягає в тому, що мені потрібно врахувати, що шматок може повертатись і продовжувати повертатись у будь-який момент, до якого він може досягти, доки у нього ще доступна відстань.
sfphilli

Що ви маєте на увазі, діапазон, яким може рухатися одиниця? Ви маєте на увазі бали, до яких вона може перейти? Наскільки ви знайомі з лінійною алгеброю (векторами)?
BlueRaja - Danny Pflughoeft

1
Який сценарій у реальному житті ви намагаєтеся моделювати? Ваша проблема надто розпливчаста щодо вимог, внаслідок чого пропонується занадто багато підходів до вирішення. Існують добре відомі підходи до (практично) кожної конкретної проблеми в цій галузі, але всі здогадуються, яку з цих багатьох проблем ви насправді вирішуєте.
Пітер Геркенс

1
@PieterGeerkens Я думаю, оскільки ОР не запитує код, вони запитують алгоритм. І навели досить детально про сценарій, який алгоритм міг би бути розумно задуманий. Це є загальним і прийнятним.
MichaelHouse

Відповіді:


4

Створіть поле потоку чи відстані, використовуючи поле Dijsktra.

По суті, заповніть сітку, використовуючи алгоритм Dijkstra без призначення (можливо, інша назва для цього; не знаю цього). Просто візьміть кожен відкритий вузол, обчисліть доступні сусіди, висуньте їх у відкритий список, встановіть у закритому списку, оновіть шлях наступного "батьківського вузла" у відповідних випадках тощо. Визначаючи вартість досягнення нового вузла, враховуйте обмеження повороту.

Результатом тепер стане те, що у вас є мережа всіх ваших вузлів, як повернутися до початку. Перший крок не буде торкатися вузлів, до яких неможливо дістатись. Вузли, до яких можна дістатись, матимуть обчислений елемент "Наступний вузол уздовж найкращого можливого шляху до батьківського", тож ви можете виділити всі вузли, а потім також використовувати цю інформацію для показу або виконання контуру руху, коли користувач наводить курсор або клацає на виділених ділянках.


Не зовсім те, як я пояснював би концепцію чи як я її втілював, але, безумовно, правильний підхід.
Пітер Геркенс

Як я розумію, алгоритм полягає в тому, що обхід вузла повинен бути незалежним від шляху. Отже, для цього вам потрібно буде додати ще одну ступінь свободи (ще одну вісь, на якій можна створити свої вузли), присвячену облицюванню. Іншими словами, у вас буде вузол для кожної комбінації різних X, Y, потенційно Z та Облицювання. В іншому випадку пошук найкоротшого шляху для входу у вузол не розрізняє різні облицювання при виході з нього. Це правильно? Якщо це так, чи можливо цей метод занадто інтенсивний?
TASagent

@TASagent: хороший момент, я не вважав, що це повністю. Тоді алгоритм може бути трохи недоступним, але підхід повинен працювати.
Шон Міддлічч

@PieterGeerkens: Я погоджуюся, що це погане пояснення. Ви повинні зробити власну відповідь, яка пояснює все це краще.
Шон Міддлічч

Це здається, що це досить близько до того, що мені потрібно, але я повинен визнати, що я ніколи не чув про цей алгоритм, і тому не знаю, як узагальнити його до того, що мені потрібно. Чи трапляється у вас посилання на будь-яку хорошу інформацію або навчальні посібники на ньому?
sfphilli

4

Рішення грубої сили було б:

  1. Створіть коло вершин навколо одиниці, з одиницею в центрі. Радіус кола - максимальна відстань руху. Щільність вершин може змінюватися залежно від того, наскільки детальним ви хочете отримати кінцевий результат.
  2. Для кожного положення вершини моделюйте рух рульового пристрою до цього положення. Це робиться в щільній петлі без відтворення.
  3. Коли в моделюванні керма буде досягнуто максимальної відстані, перемістіть вершину до точки модельованого блоку. Ця точка є найближчою, до якої одиниця могла дістатися до цієї вершини до завершення поточного повороту. Це призводить до зменшення кола до розміру фактичного руху.
  4. Використовуйте ці вершини разом із вершиною, зосередженою на одиниці, щоб створити відведене коло, щоб намалювати можливі відстані руху.

введіть тут опис зображення

Отже, починаючи з синього кола, ви обробляєте свої контури, закінчуючи фіолетовим колом. Потім ви можете використовувати ці точки з центральною точкою на пристрої, щоб скласти червоні трикутники, необхідні для відображення форми. (Просто створення цього зображення дає мені зрозуміти, що ця форма неправильна, але буде цікаво подивитися, що насправді правильне)


3

Я збираюся розкрити рішення Шона окремою відповіддю, оскільки це являє собою інший підхід від того, що я спочатку пропонував.

Це рішення, ймовірно, є найбільш доступним методом. Для цього потрібно розділити ваше середовище на вузли. Так, це повторне введення підходу на основі сітки, але він може бути порівняно тонкий або використаний для широкого наведення маршруту з більш точним розташуванням, обробленим всередині вузла. Чим грубіша структура вузла, тим швидше простежується контур.

Велика проблема тут полягає в тому, що ви насправді маєте справу з судном, тому багато традиційних рішень прокладання маршрутів не можна використовувати без змін. Зазвичай вони є агностическими, оскільки їм не байдуже, як ви потрапили до вузла, в якому перебуваєте. Це добре працює, коли прискорення, уповільнення та повороти є миттєвими та вільними. На жаль для вас поворот не безкоштовний. Однак, оскільки дійсно є одна додаткова інформація, яка потрапляє при цьому спрощенні, ми можемо кодувати її як іншу змінну. У фізиці це було б відоме як фазовий простір.

Якщо припустити 2-х розміри, ви можете екстраполювати на 3:

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

(0,0) - (1,0) - (2,0)
  | \  /  |  \  / |
(0,1) - (1,1) - (2,1)

Ви б побудували вузлик суміжних точок і з'єднали їх за допомогою просторової сусідності. Тоді ви використовуєте алгоритм Дейкстри, вбиваючи вузли, які перевищують значення руху, дозволеного для повороту, доки не залишилися не досліджені живі вузли, пов'язані з досліджуваними вузлами. Кожен вузол відстежує найменшу відстань, необхідну для його досягнення.

Щоб розширити цей метод, який можна використовувати з обертанням, уявіть цей самий вузлик у трьох вимірах. Напрямок Z відповідає обертанню / поверненню і є циклічним, тобто якщо ви продовжуєте подорожувати в напрямку Z, ви повернетесь туди, де ви почали. Тепер вузли, що відповідають суміжним позиціям, з'єднуються лише через лицьову сторону, що відповідає цьому напрямку. Ви перебираєте вузли, підключені до вже досліджених вузлів, як зазвичай. Я рекомендую обмежувати N, NE, E, SE, S, SW, W, NW у цій схемі.

Це рішення може розповісти вам про всі доступні області космосу, а також про найкращий шлях до туди, скільки обертання у вас, коли ви приїдете туди, і всі орієнтації, які ви могли мати, коли приїдете туди.

Потім, фактично виконуючи шлях, ви можете інтерполювати / кубічний сплайс, щоб зробити його більш автентичним.


1
Це чудово. Мені потрібно трохи проаналізувати алгоритм і поекспериментувати з ним в моїй грі, але це дійсно вражає мене як ідеальне пристосування, тим більше, що я можу узагальнити його на деякі інші важливі частини гри.
sfphilli

1

Це здається, що вам може знадобитися спершу визначитися з тим, як саме ви хотіли б повернути роботу. Варіанти, такі як:

  • Якщо вони рухаються всередині конуса, спочатку обертаються, а потім починають рух. Це більш просте рішення для реалізації та шлях. Він також менш цікавий, тому я не хотів би ним користуватися.

  • Постійний поворот під час руху, аж до загальної 45 градусів. Цей набагато хитріший, і, сподіваємось, той, за яким ви хочете. Числове інтегрування через шлях за допомогою фіксованого часового кроку - це, мабуть, найпростіший спосіб наблизитися до цього. Ваш конус буде обмежений максимальним (+ X градусами на кожен крок) і мінімальним (-X градусів на кожен крок) поворотом.

Те, як найкраще пройти через космос за допомогою другої з цих вимог, значною мірою залежить від того, в якому середовищі вони будуть рухатися. Якщо є багато перешкод, які вам доведеться подолати, то все може стати справді складним і дійсно дорогим. Однак якщо цього немає, то ви можете навантажувати обертання (і навіть зменшувати його), щоб опинитися в потрібному місці.

У мене є відчуття, що я, можливо, лише частково висвітлив теми, з якими ви мали питання, тому сміливо додайте більше коментарів, і я можу розширити дискусію.


Я, безумовно, хочу використовувати другий варіант - повернути до (наприклад) 45 градусів у будь-якій та, можливо, в кожній точці на шляху. Також будуть перешкоди, кожен більший за шматки (думайте, гігантські скелі). Спочатку я думав про це - генерувати конус можливих кінцевих точок, а потім для кожної з цих кінцевих точок генерувати новий конус і так далі для кожного можливого місця, поки він не досягне максимальної пройденої відстані. Однак, я не зовсім впевнений, як реалізувати це без шалених надмірностей.
sfphilli

Гммм, здається, що мені було / мені трохи незрозуміло деякі деталі. Озираючись назад на питання, я бачу, що ви вказали "покрокову" і що одиниці можуть "обертатися або рухатися" на черзі. Чи означає це, що гравець розгортає свої дії на багато поворотів заздалегідь, і ви хочете робити обхід маршруту, поки вони рухаються? Деякі додаткові роз'яснення щодо того, як повинен працювати рух, було б корисним.
ТАСагент

Ні, я мав на увазі те, що в даний момент гравець може або обертати свою частину на місці, як би далеко не хотів, або може рухатися в напрямку, в якому вже дивиться. Якщо вони рухаються, вони можуть пройти певну відстань по доріжці, і під час руху вони можуть повернути або піднятись під певний кут (наприклад, від -45 до 45 градусів). Отже, уявіть, що обраний шлях передбачає криву, щоб рухатись вліво або вправо. Шлях визначатиметься тим, що гравець вибирає точку, до якої хоче перейти, в межах можливих точок, які у мене виникають проблеми з визначенням.
sfphilli

Гаразд, це насправді звучить так, як, на жаль, бажані вами характеристики, можливо, занадто обмежуючі для алгоритму Dijkstra, про який ми говоримо вище: - \. Можливо. Я прорисую деякі речі для цього пізніше, коли повернусь додому.
TASagent

Ви можете відредагувати частину цієї інформації, яку ви зібрали, щоб з’ясувати проблему в початковому питанні, тому люди, які приїдуть пізніше, можуть почати з додатковою інформацією.
TASagent
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.