Як зробити випадкові нерестові точки справедливими?


22

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

Чи є спосіб сформувати нерестові точки або змінити карту, щоб:

  1. Усі гравці мають обмежену кількість суміжних ворогів.
  2. Усі гравці мають однаковий шанс зустріти суміжних ворогів.
  3. Розмір карти не повинен збільшуватися пропорційно кількості гравців.
  4. Ці обмеження не застосовуються за допомогою довільних непрохідних пробілів.

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


10
Нерест по колу?
Зібелас

1
@Zibelas Традиційний підхід, але порушує вимогу 3, і з великою кількістю гравців це створює величезну карту та порожній інтер'єр.
невідповідноКод

4
Це залежить від вашого типу гри. (2D / 3D, respawn / остання людина, що стоїть тощо) Ідеальний ікру можливий лише у світі з формою кульки (більше гравця, ближче ікру, але ви можете гарантувати, що вони мають однакові відстані). У двовимірному світі з фіксованими рамками у вас завжди менше межуючих гравців, оскільки у вас немає де їх нереститися. Якщо це 3D-гра, ви можете мати кілька шарів.
Зібелас

1
Я думаю, це допомогло б дізнатися, яку гру ви робите. Це звучить як якась гра війни, але які деталі? Це стрілець? Ви починаєте з усієї зброї, чи вам доведеться досліджувати та знаходити речі? Яка умова перемоги? Скільки часу триватиме матч?
RothX

3
Не для повного відповіді, але я думаю, що всі намагаються "справедливого та збалансованого нересту", який ... не весело. Подивіться на чудовий нерест PUBG (та інших Battle Royale): гравці можуть "нереститися" (ну, стрибати та приземлятися ...) майже де завгодно - якщо ви хочете конфлікту та драми, ви вибираєте місце, де більшість гравців приземляється / нереститься. Виграйте високу винагороду, але тільки якщо цього захоче гравець. Ви можете приземлитися десь в лісі, у вас є час, щоб підготуватися - винагорода з низьким рівнем ризику, але деякі гравці, можливо, віддадуть перевагу (як я, наприклад;)). Це НЕ випадково, його на вибір гравців.
Jan 'splite' K.

Відповіді:


27

Нехай гравці самі вибирають свої стартові місця.

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

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


3
@Shashimee Насправді я вважаю, що я бачив цей метод вперше в Anno 1602. Я також вважаю, що деякі з ранніх ігор на C&C мали це як необов'язковий варіант для багатокористувацької гри (але я не впевнений, чи правильно я пам'ятаю це).
Філіпп

3
@Philipp MULE для коммодора на 64 років старше 15 років і дозволить вам також вибрати свої позиції :)
Zibelas

Потім ви стикаєтеся з проблемою, за якою ви переходите до точки нересту. Звичайно, це може бути бажаним ігровим механіком, але це також може бути надзвичайно засмучуючим, а не тим, що ви вирішите, що хочете у своїй грі. Хорошою ідеєю було б, щоб герої нерестилися і не зіткнулися з гравцями, і знайти свою базу перед початком гри.
Dent7777

Це метод, який використовується лінійкою "Вампіризм" та "Дерево тегів" на користувальницьких гамедах на Warcraft 3. Він працює найкраще, оскільки всі гравці є в союзі (принаймні спочатку), а команда противника звільняється пізніше.
Кролтан

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

9

Розуміння вимог

  1. Усі гравці мають обмежену кількість суміжних ворогів.

По-перше, ми говоримо про породжені точки гравців, а не поточну позицію гравців у певній точці гри. Тільки позбувшись цього.

Суміжний добре визначений, коли ми говоримо про графік. Ми можемо придумати карту, яка представляє судноплавність на карті - відтепер - «графік».

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

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

Примітка: знайте розміри та форму вузлів та працюйте з фактично сусідніми вузлами. Не вважайте вузли точкою. Не вважайте з'єднання такими, що мають довжину. Також використовуйте опуклі вузли.

Графік міг бути попередньо складений (карту створив дизайнер); в іншому випадку його можна створити на льоту, якщо карта генерується випадковим чином.

  1. Усі гравці мають однаковий шанс зустріти суміжних ворогів.

Я припускаю, що вороги - це інші гравці. Знову ж таки, просто відволікти це.

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

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

  1. Розмір карти не повинен збільшуватися пропорційно кількості гравців.

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

  1. Ці обмеження не застосовуються за допомогою довільних непрохідних пробілів.

Я не збираюся додавати перешкоди для вирішення проблеми. Au contraire , мені потрібно працювати над перешкодами. Якби їх не було, реалізація була б простішою.


Рішення

Ми намагаємось розмістити N нерестових очок таким чином, щоб шанс зустріти іншого гравця в усіх цих ікру рівний.

Ми можемо отримати міру помилки як суму різниць шансів до середнього значення шансів. Ми намагаємося мінімізувати це (насправді ми хочемо зробити це 0).

Для цього нам потрібно знати шанс зустріти гравця на кожному вузлі графіка.

Щоб обчислити цей шанс, почніть з нуля. Оскільки шанс знайти гравця на будь-якому даному вузлі, коли немає гравців, дорівнює нулю. А потім для кожної точки нересту пройдіться по графіку, додавши до анотованого шансу значення функції для поточної точки нересту.

Примітка 1. Додавання або переміщення нерестової точки вплине на шанс зустріти гравця на всій карті.

Примітка 2: Відстеження того, наскільки кожна точка нересту впливає на шанс, полегшить ситуацію.

Примітка 3: Оскільки вузли мають розмір, то наскільки близько ви можете дійти до помилки = нуль, залежить від розміру вузлів. Ви можете бути більш точними, працюючи з діапазонами значень (мінімум і максимальний шанс, залежно від конкретного положення нерестових точок у вузлі).

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

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

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

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


Вищевказане рішення наблизиться до помилки = нуля, але не гарантовано досягне нуля. Ви можете зробити це запустити його, поки він не досягне локального мінімуму ... Теоретично ви можете розділити вузли, щоб зробити його точно нульовим ... Але це еквівалент налаштування координат точки нересту!

Спробуйте імітувати відпал для переміщення нерестової точки у вузлі. Хоча, чесно кажучи, напевно не варто зациклюватися на такому рівні деталізації.


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


6

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

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

Ваша карта є фіксованою чи створеною процедурою? І коли-небудь намагався грати Age of Empires з 8 людьми на карті на 2 людини? Неможливо масштабувати гравців нескінченно, не змінюючи розмір карти. Навіть несправедливе стартове розміщення може принести багато динаміки в грі (див. Серію «Вормс»). Ніхто не скаржився на те, що ви породжували право у великій групі, доки тривав ваш один раунд союз з іншим гравцем або у вас не було найбільше вижили черв'яків після першого раунду.

(Я додам ще кілька прикладів, якщо я знаю більше про ваш тип гри)


5

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

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

Крім того, вся карта може існувати на зовнішній стороні сфери, однак це ускладнює координати нересту.


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

4

Ось кілька можливих рішень:

  • Нереститься по випадковому колу кола
  • Нереститься на випадковому радіусі (не нерестується для закриття центру)
  • Додайте випадковий компонент часу нересту

Діаграма механізмів нересту


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

@Zanon, хоча з першими зображеннями гравці можуть (і, швидше за все,) відійти, перш ніж хтось туди приїде. Другий спричинить несправедливі нерести, деякі близькі до інших. Може бути , що - щось на зразок цього , де є 2 гуртки і різниця між меншим і більшим один, де вони ікру, так як друге зображення, але менш до центру.
пр.

1

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

Тоді ідеальний вузол має:

  • Наразі в ньому немає гравців
  • Більше нуля гравців у вузлах поблизу (деяка невелика кількість посилань)

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

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

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

Удосконалення:

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

0

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

Звернення до третього та четвертого критеріїв: "Карта не повинна розширюватися."

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

Розрахуйте евристику для бажаних характеристик нересту:

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


0

Якщо ігрове поле - це топологічний торус (тобто прямокутник, де виходити "поза межі" означає входити в протилежну сторону), це, ймовірно, буде хорошою відповіддю: гравець jнереститься x = (pjW/N) mod W, y = (qjH/N) mod H, де W,Hрозміри прямокутника N- це кількість гравців і p,qцілі числа, які потрібно визначити; вони виразні, (ймовірно) відносно первісні, і не надто далекі від sqrt(N). Точки нересту утворюють косий малюнок «шпалер».

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


0

Як щодо:

Кожного гравця оточує нерестовий ящик (або коло).

Як і в, є квадрат певного розміру, який породжує навколо кожного гравця і слідкує за цим гравцем навколо - жоден інший гравець не може породити в ньому квадрат.

Ці квадрати впливають лише на нерест, а не на будь-який інший рух під час гри.

Це працює з початковим нерестом або безперервним нерестом.

(Точки вказують гравців, а зелений - можливий нерестовий для нових гравців)

Розмір карти не повинен збільшуватися пропорційно кількості гравців

Щоб вирішити це, ви можете зробити одну з двох речей: (або обидві)

  • Зменшіть розмір вікон, що не містять нересту, залежно від кількості гравців.
  • Дозволити до X гравців противника нереститися у кожному полі.
    • Ця кількість може збільшуватися по мірі руху (починаючи з 0).
    • Варіант 1: мати менший ящик без нересту і більший ящик з обмеженим нерестом.
    • Варіант 2: ймовірність ваги залежно від того, наскільки новий ікру знаходиться близько до цього гравця (якщо він знаходиться в коробці) - це може бути важко ефективно застосувати.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.