Недосконалий понг ШІ


19

Тому я починаю вивчати Java та деякі OpenGL під час використання LWJGL. Щоб почати легко, я пишу клон Атарі-понгу. Я правильно налаштував ігровий екран, виявлення зіткнень, і вся гра в основному працює, насправді, якби це була гра з двома гравцями, я б вже закінчився, але так як я планую робити цю гру для одного гравця , Я повинен придумати простий AI для управління другим гравцем.

Знання, куди потрапить м'яч, здається досить тривіальним, і створити AI, який завжди потрапляє в м'яч, здається, що це легко зробити, але я хочу, щоб гру можна було виграти, тому я не завжди можу змусити ІА потрапити в удар куля.

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

Велике спасибі.


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

4
Я б почав з обмеження швидкості, з якою AI може переміщати весло, та / або будувати у випадковому (короткому) відстані до того, як AI почне реагувати на удар.


4
@ byte56 Я б насправді не назвав це справжнім питанням. Схоже, приклад, наведений тут blog.stackoverflow.com/2011/01/… у розділі "Якщо ви збираєтесь закрити запитання користувача як дублікат, він повинен бути справжнім дублікатом". Це питання є хорошим ресурсом (і хтось, можливо, міг би скористатись цим запитанням, щоб отримати відповідь, сам з огляду на його вміст), але він насправді не відповідає специфіці цього питання, я не думаю.
Тетрад

1
@Tetrad Я думаю, що відповіді в кінцевому підсумку дуже схожі, але, ти маєш рацію, питання різні. Я вважаю, що це питання є якось більш конкретною версією пов'язаного питання. Якби ОП спочатку побачила іншого, я не впевнений, чи було б це запитання. Коли я голосував, я не визначився, тому я і схвалив питання, і відповіді, і проголосував як дублікат. Для мене це могло піти будь-яким шляхом.
MichaelHouse

Відповіді:


20

Мій улюблений недосконалий понг AI жорстоко простий, але дозволяє зробити якийсь досить приємний AI провал.

Невидимий м'яч AI

Налаштування AI : Коли м'яч відбивається від вашого весла, ви знаєте, де він знаходиться і як швидко йде. Народжують невидимий кульку в цій точці, але з більшою швидкістю. Він буде звиватися там, де йде видима куля. Кожен кадр повинен мати AI рухатися до місця невидимого кулі. Зупиніть невидимий кулю, як тільки він досягне сторони ШІ, тож саме там ІС повинен перемістити своє весло.

Результати : ІС виглядає так, що намагається передбачити шлях кулі. Скажіть, гравець відбив м'яч під крутим кутом, щоб він відскочив від стіни. ШІ буде відслідковувати м'яч трохи вниз, а потім - будучи повільніше, ніж м'яч - не зможе відстежити його назад досить швидко. Ви обдурили ШІ, і це виглядає досить логічно з людської точки зору. Ви можете бачити комп’ютер, який намагається передбачити, куди піде м'яч, а потім - о, він пропустив, це було занадто повільно, і ви виграли очко.

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

Налаштування : Ви також можете налаштувати швидкість невидимого кулі, оскільки це визначатиме, наскільки вперед плануватиме AI. Чим швидше невидимий м'яч, тим більше часу весла доведеться рухатись до блоку, і тим краще гравцеві доведеться прицілитися.


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

Це чудово спрацювало для мого налаштування, оскільки у мене змінні кути, швидкість та прискорення на основі певних спеціальних рухів, тому м'яч потенційно може бути повсюдно. ШІ отримав власність, але зараз це набагато краще. Я бачу, чому цей метод не найкращий для заблокованої швидкості та кутів 45deg, але це зовсім не моя гра.
jackrugile

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

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

22

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


Це. Це не допомагає ШІ дізнатись, куди потрапить м'яч, якщо він може рухатись, скажімо, 3 пікселями на кадр, і він повинен рухатися зверху вниз.
KeithS

14

Коли я створив на своєму TI83 чудовий клон майже-pacman? калькулятор, найбільша проблема, з якою я стикався, полягала в тому, що "привиди" були занадто швидкими. Мені довелося якось уповільнити їх. Отже, я вкладаю великий старий гріх (cos (tan (x-координата))). Простіші рівні зробили б цей розрахунок кілька разів, а складніші рівні зробили б лише одну з операцій.

Справа в тому, що РЕАКЦІЙНИЙ ЧАС. Дослідіть, який типовий час реакції людини, і додайте до нього 10 мс. Використовуйте це як вихідну точку. Оскільки рівні стають складнішими, зніміть час із часу реакції ... що може бути простим Thread.sleep(time);для ШІ. Зачекайте, скільки часу починає рух ШІ.

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


2
Чи можете ви пояснити, чому саме ви використовували sin(cos(tan(x)))?
недійсний

5
тому що я був молодий, дурний, і на TI83, гріх (cos (tan (x))) створив добру одиницю відставання в ШІ. Також тому, що, наскільки мені відомо, у калькулятора не було команди очікування, яка могла б використовувати мілісекунди. Можливо, ясність: я не використовував асемблер чи мікро скрипт чи будь-яку мову, яку ви можете скласти, щоб працювати над цими речами. Я використовував вбудований програмний код програмування (кнопка prgm). У мене в будь-який момент було на екрані MAXIMUM 8 рядків коду. Я не міг згадати нічого складнішого за відставання.
Рассел Ул

2
Я навчився програмувати на вбудованому програмному коді TI83. Тоді мені довелося заново вивчити структуроване програмування на C ++. Я б сказав, що TI83 навчив мене, що таке рядовий код спагетті і чому він поганий. З цього часу я не використовував goto заяву. Хоча гарні часи.
ContextSwitch

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

1
Не потрібно бути оборонним щодо тривалої затримки. Математика з плаваючою комою в циклі була поширеним способом зробити паузу в програмах, написаних кілька десятиліть тому, і продуктивність / можливості ваших калькуляторів відповідають комп'ютеру епохи початку 80-х років.
Ден Нілі

6

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

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

  • коли користувач потрапляє в м'яч
    • ШІ може негайно відреагувати і поїхати туди, де буде куля. Якщо він буде досить швидким, він потрапить туди вчасно
  • коли м'яч перетинає середину поля
    • AI повинен зачекати, поки він перетне середину поля, перш ніж реагувати

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

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

Нарешті, ви можете грати і з розміром весла, щоб збільшити / зменшити труднощі.


2

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

Ви можете встановити діапазони для:

  • Час реакції (як швидко рухається ШІ)
  • Швидкість (як швидко AI переміщує весло)
  • Акуратність (наскільки близько AI дістанеться туди, де він насправді хоче перенести своє весло, даючи шанс підкреслити або перекрити туди, де вони хочуть бути)

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


2

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

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

Простий AI матиме більш високий відставання на вході та більше схильність робити випадкові помилки - де як складніший AI налаштований, щоб ці параметри були налаштовані на важкі.

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


1

Ось перелік кількох варіантів, деякі з яких уже висвітлено:

  • Зробіть розумніших комп’ютерних гравців націлювати м'яч так, щоб гравцеві було важче досягти великої кількості відскоків, а для легких опонентів зробіть навпаки.
  • Розумний гравець перемістить своє весло до середини, поки м'яч знаходиться на шляху до суперника, і вони не знають, куди він повернеться.
  • Перед фінальним відскоком людині складніше передбачити, куди потрапить куля. Зробіть, щоб AI мав подібну неточність.
  • Обмежте швидкість весла, щоб воно було повільніше, ніж м'яч. Щоб пропустити ідеальну гру, вона повинна бути менше половини вертикальної швидкості.
  • Збільшити швидкість кулі залежно від складності, тривалості матчу тощо.
  • Люди не реагують миттєво. І гравці AI також не повинні.
  • Дайте AI випадковий шанс помилитися і пропустити м'яч.

0

Я теж зробив невеликий понг-клон (в LUA).

Мій AI дуже простий, але це не так вже й погано, імхо.

Я просто перевіряю y-положення м'яча, і, якщо нижче, я переміщую весло вниз, якщо вище, я переміщую весло вгору.

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

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