Итак, я начинаю изучать Java и немного OpenGL, используя LWJGL. Для начала я пишу клон Atari Pong. Я правильно настроил игровой экран, обнаружение столкновений, и вся игра в основном работает, на самом деле, если бы это была игра для двух игроков, я бы уже сделал это, но, поскольку я планирую сделать это для одиночной игры Я должен придумать простой ИИ для управления вторым игроком.
Знать, где будет удар по мячу, кажется довольно тривиальным, и создание ИИ, который всегда бьет по мячу, кажется легким делом, но я хочу, чтобы игра была в состоянии выиграть, поэтому я не всегда могу заставить ИА попасть в мяч.
Итак, вот мой вопрос, как я должен кодировать это, чтобы добавить человеческий недостаток к ИИ. Должен ли я случайно решить, будет ли ИИ провален в данный момент? Или есть более умная (или, может быть, просто очевидная) вещь, которую я здесь скучаю?
Большое спасибо.
Ответы:
Мой любимый несовершенный ИИ понг очень прост, но позволяет делать довольно неплохой провал ИИ.
Невидимый шар AI
Настройка AI : Когда мяч отражается от вашего весла, вы знаете, где он и как быстро он движется. Создайте невидимый шар в этой точке, но с большей скоростью. Он окажется там, где движется видимый шар. Каждый кадр заставляет ИИ двигаться в направлении местоположения невидимого шара. Остановите невидимый шар, как только он достигнет стороны ИИ, поэтому ИИ должен сдвинуть весло.
Результаты : ИИ выглядит так, будто пытается предсказать траекторию мяча. Скажем, игрок отразил мяч под крутым углом, чтобы он отскочил от стены. ИИ немного отследит мяч, а затем - будучи медленнее мяча - не сможет отследить его достаточно быстро. Вы обманули ИИ, и это выглядит довольно логично с человеческой точки зрения. Вы можете видеть, как компьютер пытается предсказать, куда пойдет мяч, а затем - о, он пропустил, он был слишком медленным, и вы выиграли очко.
Это значительно лучше, чем вставка случайности, поскольку ИИ выглядит довольно умным. Достойный противник. Он также позволяет ИИ играть по тем же правилам, что и человек, что выглядит лучше для игрока и облегчает вашу работу.
Настройки : Вы также можете настроить скорость невидимого мяча, так как это будет определять, насколько далеко будет планировать ИИ. Чем быстрее мяч-невидимка, тем больше времени весло будет вынуждено перемещать, чтобы блокировать, и тем лучше игрок будет целиться.
источник
Игры в понг, в которые я играл, похоже, ведут себя следующим образом: весло, контролируемое ИИ, знает, куда попадет мяч, но ограничено в том, как быстро он может достичь этой позиции. Так что иногда это не хватает. Я думаю, что это самый очевидный способ сделать это.
источник
Когда я создал на своем TI83 офигительный клон почти-pacman? Калькулятор, самая большая проблема, с которой я столкнулся, заключалась в том, что «призраки» были слишком быстрыми. Я должен был как-то замедлить их. Итак, я вставил туда большой старый грех (cos (tan (x-координата))). Более простые уровни будут выполнять этот расчет несколько раз, а более сложные уровни - только одну из операций.
Дело в том, ВРЕМЯ РЕАКЦИИ. Изучите типичное время реакции человека и добавьте к нему 10 мс. Используйте это как отправную точку. По мере того, как уровни становятся сложнее, уберите время из времени реакции ... которое может быть простым
Thread.sleep(time);
для ИИ. Подождите столько времени, прежде чем ИИ начнет двигаться.Вы также можете контролировать, насколько быстро движется весло, или, если вы ДЕЙСТВИТЕЛЬНО хотели усложниться, определить, где будет находиться шарик, основываясь на различной степени информации ... скажем, только 2 пикселя, а не вектор. Добавьте модификаторы угла к стенам, чтобы добавить степень случайности, заставляя ИИ пересчитывать.
источник
sin(cos(tan(x)))
?Если вы просто замедляете весло, то всякий раз, когда вы ударяете по мячу под острым углом (то есть двигаетесь вверх и вниз, а не прямо на другую сторону), компьютер почти всегда будет пропускать, потому что мяч движется вверх / вниз быстрее, чем весло может компенсировать.
Вместо этого я бы играл со скоростью весла и точкой, в которой ИИ реагирует. Например:
Еще одна вещь, которую нужно изменить, это то, как ИИ реагирует. Вы выделили стратегию, в которой весло всегда перемещается в положение, в котором будет находиться мяч. Человек не всегда может сделать это. Они с большей вероятностью будут следовать за мячом вверх и вниз, не зная, где именно будет находиться мяч, когда он доберется до них из-за всех отскоков.
Таким образом, более человеческий метод реакции - всегда двигаться к мячу. Например, если мяч движется вверх, весло движется вверх. Если весло достаточно быстрое, оно может реагировать на скачки сверху и снизу. Если его весло недостаточно быстрое, оно будет чрезмерно компенсировать движение вверх, когда мяч движется вверх, но затем, когда оно подпрыгивает, весло может быть не в состоянии двигаться достаточно быстро.
Наконец, вы можете играть с размером весла, чтобы увеличить / уменьшить сложность.
источник
Одним из факторов, который следует учитывать, является случайность - у игроков всегда есть некоторая вариация в их игре, поэтому, если вы хотите, чтобы ваш ИИ выглядел как человек, вам также понадобятся некоторые вариации в их игре.
Вы можете установить диапазоны для:
Затем при каждом ударе противника ИИ может выбрать значение в пределах этих диапазонов и принимать свои решения (и движения) на основании этого. Для более лёгких противников ИИ вы можете сделать эти диапазоны довольно плохими, но при этом иметь широкие диапазоны, чтобы дать ИИ «удачные выстрелы». Для более сложных противников вы можете ужесточить эти диапазоны и поставить их всех в «хороший» диапазон.
источник
Я собираюсь предложить более общее решение, которое не относится только к понгу. Я считаю, что это может быть применимо к любой игре - не только понг. Вы хотите человеческого поведения, верно? Так что человек может чувствовать, что он играет человека ... и, следовательно, надеяться на победу. Ну так что ты делаешь?
Соблюдайте человека! Как игрок может проиграть в понг? Что ж, если мы посмотрим на двух игроков в понг, это будет совершенно очевидно. Обычно потеря происходит потому, что мяч слишком быстр и время реакции игроков задерживается. Это два параметра, один из которых настраивается. Другая - способность игроков нажимать правильное направление. Таким образом, у вас есть частота ошибок и частота реакции - и то, и другое можно настроить в зависимости от сложности.
Простой ИИ имел бы более высокую задержку ввода и большую склонность к случайным ошибкам - тогда как более сложный ИИ был бы настроен так, чтобы эти параметры были сложными.
Это может быть применено практически к любой игре - даже такой, как крестики-нолики или даже более сложные модели. Этот подход ломается в более сложных сценариях, но этого вполне достаточно, когда игры, в которых количество параметров и область действия узки.
источник
Вот список нескольких вариантов, некоторые из которых уже были рассмотрены:
источник
Я тоже сделал небольшой клон Понг (в LUA).
Мой ИИ очень прост, но это не так уж плохо, имхо.
Я просто проверяю положение y мяча и, если опустить, я перемещаю весло вниз, если выше, я поднимаю весло вверх.
Затем, чтобы точно настроить сложность, я увеличиваю или уменьшаю расстояние от мяча, с которого компьютерное весло начинает двигаться.
источник