Розрахунок виходу двох бойових армій


20

Я програмую стратегічну гру за допомогою Flash. Гра працює дуже схоже на знамениту гру «Травіан».

Моя проблема полягає в наступному: я намагаюся зробити розрахунок втрачених військ в результаті бою між двома арміями. Дві армії мають різні типи підрозділів. Деякі з них сильніші проти деяких інших одиниць і слабкіші проти інших типів.

Як я можу поставити ефект цієї різниці в рівнянні бою?

Здається, що це просто, якщо вони мають лише точки att та def, але коли вона переходить до залежності одиниць типу, я втрачаюсь.


6
Якщо результат ваших битв має бути детермінованим чи ви хочете скористатися якоюсь випадковістю?
sum1stolemyname

4
Я не думаю, що його слід позначати як багатокористувацьку гру, оскільки це не дано ОП - це може бути людина проти АІ. І ми говоримо про "типову залежність", чи це класична річ-> ножиці-> папір-> річ типу скелі?
Качка комуністична

Відповіді:


10

На додаток до підтримки пропозиції Аміта подивитися на рівняння Ланчестера, я просто хочу додати, що це рішення дизайну гри, а не емпіричний факт, який ми можемо вам надати. Якщо ви хочете врахувати тип одиниці, ви повинні вирішити, що це означає. Це означає вибір рівняння, яке включає всі фактори, які ви хочете, щоб ваш геймплей включав. Якщо ви хочете, щоб піхота була кращою, ніж кіннота, тоді ви повинні вирішити, що це має означати - наприклад. скільки кінноти потрібно, щоб дорівнювати 100 піхоті? І чи важливо, хто кого атакує? Ви, здається, натякаєте на те, що просто давати піхоті та кінноті різні цінності для нападу та оборони недостатньо добре - чому це так? Що ще ви намагаєтесь представляти, що не може бути захоплено лише цими значеннями?

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

Після того, як ви все це знаєте, ви можете скористатися декількома основними математичними підходами. Ви можете обходити систему "шанс потрапити", як у багатьох RPG, наприклад, наприклад. бойова система d20. Ви могли б зробити одноразову зважену систему монети "атака проти оборони", як це робили в оригінальній грі Civilization. Ви можете з кожної сторони генерувати бали, додаючи атрибути до випадкового числа, і той, хто отримає найвище значення, виграє. І ви можете переставити ці системи працювати по черзі, або віднімати точки потрапляння чи точки моралі, або будь-що інше. Будь-яка система може працювати, але ви повинні збалансувати її так, як ви хочете її відтворити. Оскільки в кінцевому підсумку вибір способу моделювання бою є ключовою частиною дизайну гри, і це не те, що інші люди можуть вам просто дати.


Ви абсолютно праві, килотан. У мене були деякі ідеї щодо боротьби, перш ніж розпочати дизайн гри. Однак я опублікував це питання, запитуючи, чи є кращий спосіб його розробити і з’ясувати, який найкращий спосіб його втілити. Я виграв в обох цілях, мабуть :) Мій друг, чи не могли б ви сказати мені, де я можу знайти більше інформації про ті математичні підходи? Крім того, якщо я відповім на всі запитання, які ви задаєте щодо вибору системи, чи можете ви порадити мені, який із моїх справ найкраще працює? Дякую вам за ваш час :)
Алі Альбахрані

Я не можу сказати вам, що буде найкраще, але вам, мабуть, слід почати просте і вдосконалити це, якщо вам потрібно. Травіан, схоже, має просту систему атаки проти оборони з двома типами одиниць (піхота та кіннота) та 2 балами захисту на одиницю відповідно. Простий спосіб вирішити бій, як це застосовується в Цивілізації 1, - розділити бал атаки нападників на загальний плюс плюс рахунок захисника. Це дає вам відсоток. Тепер виберіть випадкове число від 0 до 100 відсотків. Якщо вона нижча за показник атаки, нападники виграють. Інакше захисники перемагають.
Килотан

15

Для «Сонячних царств елітних» мене надихнули рівняни Ланчестера для моделювання війни . У мене було кілька одночасних боїв у кожному раунді бою.

У першому бою всі напали на солдатів. У СРЕ воїни найкраще проти солдатів (це не ножиці з паперу, а піхота, авіація та глибокий космос). Я створив силу для нападу та оборони, де солдати мали кращу атаку:

attack_strength = 3*soldiers + 1*fighters + 2*cruisers
defense_strength = 10*soldiers

У другій сутичці всі напали на станції оборони. У SRE винищувачі (повітряні) найкращі проти оборонних станцій (наприклад, зенітні):

attack_strength = 1*soldiers + 4*fighters + 2*cruisers
defense_strength = 25*defense_stations

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

attack_strength = 1*soldiers + 1*fighters + 10*cruisers
defense_strength = 15*cruisers

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

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


12

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

Я б використав щось подібне:

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

Потім виконуються всі підполітики. Приклад:

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

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

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

Після того як всі індивідуальні бої були вирішені, видаліть усі підрозділи, які зазнали критичного загрози або знищення.

Наступна ітерація починається з використання скорочених армій.


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

Мені дуже подобається ваша відповідь, і я думаю, що буду реалізовувати її випадково :)
Ali Albahrani

3

Я бета-тестую гру, яка наразі є простою версією Solar Realms ( Star Empire Elite ), і я почала з використання чогось подібного до рівнянь Аміта (вище). Зокрема, мені сподобалась ідея провести три фази в битві, де вам довелося виграти два з трьох. Але я також хотів ввести в бій елемент випадковості, і на це на мене вплинули деякі настільні ігри.

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

Я вирішив розбити битву на дві фази (аналогічні трійці в моделі Аміта): повітря і земля. Я обчислюю атаку і захищаю силу, і коригую силу атаки на дріб (щоб дати перевагу захиснику). У той момент, якщо сила атаки та сила оборони рівні, атака має 50% шансів на перемогу. Звідти я коригую відсотковий шанс на перемогу вгору або вниз, виходячи з того, наскільки більше (або менше) сили нападник порівняно з захисником. Ось кілька спрощених рівнянь для повітря:

air_attack_strength = 1 * soldiers + 10 * fighters
air_defence_strength = 2 * soldiers + 25 * stations

differential = (air_attack_strength - air_defence_strength) * constant

chance_of_victory = 50 - differential

Я вказую, що chance_of_victory ніколи не може бути більше 80 або менше 5. Звідти я просто генерую випадкове число зі 100, а потім переношу цей результат до сухопутного бою.

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

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