Несовершенный понг AI

19

Итак, я начинаю изучать Java и немного OpenGL, используя LWJGL. Для начала я пишу клон Atari Pong. Я правильно настроил игровой экран, обнаружение столкновений, и вся игра в основном работает, на самом деле, если бы это была игра для двух игроков, я бы уже сделал это, но, поскольку я планирую сделать это для одиночной игры Я должен придумать простой ИИ для управления вторым игроком.

Знать, где будет удар по мячу, кажется довольно тривиальным, и создание ИИ, который всегда бьет по мячу, кажется легким делом, но я хочу, чтобы игра была в состоянии выиграть, поэтому я не всегда могу заставить ИА попасть в мяч.

Итак, вот мой вопрос, как я должен кодировать это, чтобы добавить человеческий недостаток к ИИ. Должен ли я случайно решить, будет ли ИИ провален в данный момент? Или есть более умная (или, может быть, просто очевидная) вещь, которую я здесь скучаю?

Большое спасибо.

Setzer22
источник
5
Ну, как правило, вы заставляете летучую мышь ИИ двигаться только на определенной скорости, поэтому, если игрок правильно расположил мяч, ИИ не сможет его достать ..
4
Я бы начал с ограничения скорости, с которой ИИ может перемещать весло, и / или построения в случайное (короткое) время задержки до того, как ИИ начнет реагировать на удар.
4
@ byte56 Я бы не стал называть это обманом этого вопроса. Это похоже на пример, приведенный здесь blog.stackoverflow.com/2011/01/… под заголовком «Если вы собираетесь закрыть вопрос пользователя как дубликат, он должен быть настоящим дубликатом». Этот вопрос является хорошим ресурсом (и кто-то, возможно, мог бы использовать этот вопрос, чтобы получить ответ самостоятельно, учитывая содержание там), но я не думаю, что он действительно отвечает на конкретные вопросы этого вопроса.
Тетрад
1
@ Тетрад Я думаю, что ответы в конечном итоге очень похожи, но вы правы, вопросы разные. Я думаю, что этот вопрос является своего рода более конкретной версией связанного вопроса. Если бы ОП виделся первым, я не уверен, что этот вопрос был бы задан. Когда я проголосовал, я не определился, поэтому я проголосовал за вопрос и ответы и проголосовал за дубликат. Это может пойти в любую сторону для меня.
MichaelHouse

Ответы:

20

Мой любимый несовершенный ИИ понг очень прост, но позволяет делать довольно неплохой провал ИИ.

Невидимый шар AI

Настройка AI : Когда мяч отражается от вашего весла, вы знаете, где он и как быстро он движется. Создайте невидимый шар в этой точке, но с большей скоростью. Он окажется там, где движется видимый шар. Каждый кадр заставляет ИИ двигаться в направлении местоположения невидимого шара. Остановите невидимый шар, как только он достигнет стороны ИИ, поэтому ИИ должен сдвинуть весло.

Результаты : ИИ выглядит так, будто пытается предсказать траекторию мяча. Скажем, игрок отразил мяч под крутым углом, чтобы он отскочил от стены. ИИ немного отследит мяч, а затем - будучи медленнее мяча - не сможет отследить его достаточно быстро. Вы обманули ИИ, и это выглядит довольно логично с человеческой точки зрения. Вы можете видеть, как компьютер пытается предсказать, куда пойдет мяч, а затем - о, он пропустил, он был слишком медленным, и вы выиграли очко.

Это значительно лучше, чем вставка случайности, поскольку ИИ выглядит довольно умным. Достойный противник. Он также позволяет ИИ играть по тем же правилам, что и человек, что выглядит лучше для игрока и облегчает вашу работу.

Настройки : Вы также можете настроить скорость невидимого мяча, так как это будет определять, насколько далеко будет планировать ИИ. Чем быстрее мяч-невидимка, тем больше времени весло будет вынуждено перемещать, чтобы блокировать, и тем лучше игрок будет целиться.

DDR
источник
Все приведенные ответы предоставили действительно хорошую информацию, но, поскольку я должен был отметить один, чтобы получить правильный ответ, я выбрал этот, поскольку мне действительно нравится ваш подход. Это, в сочетании с некоторыми другими вещами, сказанными в других ответах (например, игра со временем реакции), может привести к действительно
похожему
Это отлично сработало для моей установки, потому что у меня есть переменные углы, скорость и ускорение, основанные на определенных специальных движениях, поэтому мяч может быть повсюду. ИИ становился владельцем, но теперь он намного лучше. Я понимаю, почему этот метод не самый лучший для фиксированной скорости и углов 45 градусов, но это совсем не моя игра.
негодяй
1
Хотя мне нравится этот подход, у меня были проблемы с моей реализацией. Проблема в том, что, поскольку трассирующий шар движется быстрее, чем тот, который он представляет, он может пропустить некоторые столкновения, которые произойдут с мячом, который он представляет. Разумеется, причина в том, что трассирующий шар будет перемещаться на большее расстояние между кадрами.
Вольфганг Шреурс
Если вы хотите большей точности, вы можете пересчитать положение шарика трассера дважды за кадр и уменьшить скорость вдвое для каждого расчета.
ГДР
22

Игры в понг, в которые я играл, похоже, ведут себя следующим образом: весло, контролируемое ИИ, знает, куда попадет мяч, но ограничено в том, как быстро он может достичь этой позиции. Так что иногда это не хватает. Я думаю, что это самый очевидный способ сделать это.


источник
Эта. Не помогает ИИ знать, куда попадет мяч, если он может двигаться, скажем, 3 пикселя за кадр, и он должен двигаться сверху вниз.
KeithS
14

Когда я создал на своем TI83 офигительный клон почти-pacman? Калькулятор, самая большая проблема, с которой я столкнулся, заключалась в том, что «призраки» были слишком быстрыми. Я должен был как-то замедлить их. Итак, я вставил туда большой старый грех (cos (tan (x-координата))). Более простые уровни будут выполнять этот расчет несколько раз, а более сложные уровни - только одну из операций.

Дело в том, ВРЕМЯ РЕАКЦИИ. Изучите типичное время реакции человека и добавьте к нему 10 мс. Используйте это как отправную точку. По мере того, как уровни становятся сложнее, уберите время из времени реакции ... которое может быть простым Thread.sleep(time);для ИИ. Подождите столько времени, прежде чем ИИ начнет двигаться.

Вы также можете контролировать, насколько быстро движется весло, или, если вы ДЕЙСТВИТЕЛЬНО хотели усложниться, определить, где будет находиться шарик, основываясь на различной степени информации ... скажем, только 2 пикселя, а не вектор. Добавьте модификаторы угла к стенам, чтобы добавить степень случайности, заставляя ИИ пересчитывать.

Рассел Уль
источник
2
Не могли бы вы объяснить, почему именно вы использовали sin(cos(tan(x)))?
Нульпотент
5
потому что я был молод, глуп, и на TI83 грех (cos (tan (x))) создал хорошую единицу отставания в ИИ. Также потому, что, насколько мне известно, калькулятор не имел команды ожидания, которая могла бы использовать миллисекунды. Возможно, какая-то ясность: я не использовал ассемблер, микротекст и любой другой язык, который вы можете скомпилировать для запуска этих вещей. Я использовал встроенный программный код (кнопка prgm). У меня было МАКСИМАЛЬНО 8 строк кода на экране в любой момент. Я не мог вспомнить что-нибудь более сложное за время задержки.
Рассел Уль
2
Я научился программировать в коде прошивки TI83. Затем мне пришлось заново изучать структурированное программирование на C ++. Я бы сказал, что TI83 научил меня, что такое строковый код спагетти и почему он плохой. С тех пор я не использовал оператор goto. Хорошие времена, хотя.
ContextSwitch
2
о боже, готово. Я пересматриваю код время от времени .... и быстро сдаюсь. Я понятия не имею, как мне удалось запрограммировать эту вещь в течение нескольких недель на уроках математики.
Рассел Уль
1
Не нужно защищаться от задержки триггера. Математика с плавающей точкой в ​​цикле была обычным способом сделать паузу в программах, написанных несколько десятилетий назад, и производительность / возможности ваших калькуляторов соответствуют компьютеру начала 80-х.
Дэн Нили
6

Если вы просто замедляете весло, то всякий раз, когда вы ударяете по мячу под острым углом (то есть двигаетесь вверх и вниз, а не прямо на другую сторону), компьютер почти всегда будет пропускать, потому что мяч движется вверх / вниз быстрее, чем весло может компенсировать.

Вместо этого я бы играл со скоростью весла и точкой, в которой ИИ реагирует. Например:

  • когда пользователь бьет по мячу
    • ИИ может немедленно отреагировать и пойти туда, где будет мяч. Если это будет достаточно быстро, он доберется вовремя
  • когда мяч пересекает середину поля
    • ИИ должен подождать, пока он не пересечет середину поля, прежде чем реагировать

Еще одна вещь, которую нужно изменить, это то, как ИИ реагирует. Вы выделили стратегию, в которой весло всегда перемещается в положение, в котором будет находиться мяч. Человек не всегда может сделать это. Они с большей вероятностью будут следовать за мячом вверх и вниз, не зная, где именно будет находиться мяч, когда он доберется до них из-за всех отскоков.

Таким образом, более человеческий метод реакции - всегда двигаться к мячу. Например, если мяч движется вверх, весло движется вверх. Если весло достаточно быстрое, оно может реагировать на скачки сверху и снизу. Если его весло недостаточно быстрое, оно будет чрезмерно компенсировать движение вверх, когда мяч движется вверх, но затем, когда оно подпрыгивает, весло может быть не в состоянии двигаться достаточно быстро.

Наконец, вы можете играть с размером весла, чтобы увеличить / уменьшить сложность.

Тренин
источник
2

Одним из факторов, который следует учитывать, является случайность - у игроков всегда есть некоторая вариация в их игре, поэтому, если вы хотите, чтобы ваш ИИ выглядел как человек, вам также понадобятся некоторые вариации в их игре.

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

  • Время реакции (насколько быстро ИИ начинает двигаться)
  • Скорость (насколько быстро ИИ перемещает весло)
  • Точность (насколько близко ИИ доберется до того места, куда он действительно хочет переместить весло, что дает возможность не достигать цели или превышать ее, где они хотят быть)

Затем при каждом ударе противника ИИ может выбрать значение в пределах этих диапазонов и принимать свои решения (и движения) на основании этого. Для более лёгких противников ИИ вы можете сделать эти диапазоны довольно плохими, но при этом иметь широкие диапазоны, чтобы дать ИИ «удачные выстрелы». Для более сложных противников вы можете ужесточить эти диапазоны и поставить их всех в «хороший» диапазон.

Blobinator
источник
2

Я собираюсь предложить более общее решение, которое не относится только к понгу. Я считаю, что это может быть применимо к любой игре - не только понг. Вы хотите человеческого поведения, верно? Так что человек может чувствовать, что он играет человека ... и, следовательно, надеяться на победу. Ну так что ты делаешь?

Соблюдайте человека! Как игрок может проиграть в понг? Что ж, если мы посмотрим на двух игроков в понг, это будет совершенно очевидно. Обычно потеря происходит потому, что мяч слишком быстр и время реакции игроков задерживается. Это два параметра, один из которых настраивается. Другая - способность игроков нажимать правильное направление. Таким образом, у вас есть частота ошибок и частота реакции - и то, и другое можно настроить в зависимости от сложности.

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

Это может быть применено практически к любой игре - даже такой, как крестики-нолики или даже более сложные модели. Этот подход ломается в более сложных сценариях, но этого вполне достаточно, когда игры, в которых количество параметров и область действия узки.

Вон Хилтс
источник
1

Вот список нескольких вариантов, некоторые из которых уже были рассмотрены:

  • Заставьте более умных компьютерных игроков нацеливать мяч так, чтобы игроку было труднее достичь с большим количеством отскоков, и сделайте наоборот для легких противников.
  • Умный игрок будет перемещать весло к середине, пока мяч находится на пути к противнику, и они не знают, куда он вернется.
  • Перед последним отскоком человеку труднее предсказать, где мяч окажется в конце. Заставить ИИ иметь подобную неточность.
  • Ограничьте скорость ракетки, чтобы она была медленнее мяча. Это должно быть меньше чем половина вертикальной скорости, чтобы промахнуться с прекрасной игрой.
  • Увеличьте скорость мяча в зависимости от сложности, продолжительности матча и т. Д.
  • Люди не реагируют мгновенно. ИИ игроки тоже не должны.
  • Дайте ИИ случайный шанс ошибиться и пропустить мяч.
Адам
источник
0

Я тоже сделал небольшой клон Понг (в LUA).

Мой ИИ очень прост, но это не так уж плохо, имхо.

Я просто проверяю положение y мяча и, если опустить, я перемещаю весло вниз, если выше, я поднимаю весло вверх.

Затем, чтобы точно настроить сложность, я увеличиваю или уменьшаю расстояние от мяча, с которого компьютерное весло начинает двигаться.

Pitto
источник