Искусственный интеллект для Pong-игры
Много игр позволяют играть двум игрокам, но зачастую приходится играть в одиночку из-за
того, что играть не с кем. В таких ситуациях всегда хочется, чтобы противник был не слишком силен, но тем не менее и не слишком слаб - так, чтобы в игру не было скучно играть. Если вы программируете подобную игру, вамнужно написать AI (искусственный интеллект), который "играет" против игрока-человека. В этой главе я объясню вам, как запрограммировать очень пройстой AI, который может использоваться, скажем, в игре типа Streethockey, которую делал я. Речь будет идти только о программировании AI, другие классы и методы в исходном коде изучите, пожалуйста, самостоятельно (исходный код - внизу страницы).
Ситуация
Для начала мы должны решить что мы хотим от AI: в Pong-игре компьютер вколачивает голы игроку и парирует их сам как вратарь. Человек, играющий в такую игру, будет всегда стараться занять такую же y-позицию, как и мячик, чтобы последний отскакивал, ударяясь о "ракетку" игрока. Компьютер будет поступать так же, и сейчас мы "научим" компьютер следовать за y-позицией мячика.
Идея
Итак, компьютер должен "видеть" мячик и стараться быть на такой же позиции (в игре Streethockey это y-позиция), как и мяч. Представьте, что объект мяча будет иметь методы, сообщающие нам (компьютеру) скорость, направление и позицию мячика, которые и будут "глазами" компьютера. AI-метод очень прост, как вы сами сейчас сможете убедиться.
AI-метод
/** этот метод двигает компьютер */
public void move (Ball ball)
{
-
// вычисляем центр ракетки
real_y_pos = y_pos + (size_y / 2);
/* Если мячик двигается в противоположном направлении от ракетки и опасности словить гол нет, компьютер перемещает свою ракетку обратно в центр, в среднюю y-позицию */
if (ball.getXSpeed() > 0)
{
-
// если позиция ракетки больше средней y-позиции
if (real_y_pos < 148)
{
-
y_pos += y_speed;
// если позиция ракетки меньше средней y-позиции
else if (real_y_pos > 152)
{
-
y_pos -= y_speed;
// мячик направляется к ракетке
else if (ball.getXSpeed() < 0)
{
-
// До тех пор, пока y-позиции мяча и ракетки различны
if ( real_y_pos != ball.getYPos())
{
-
// Если позиция мяча меньше позиции ракетки, перемещаем вверх
if (ball.getYPos() < real_y_pos)
{
-
y_pos -= y_speed;
// Если позиция мяча больше позиции ракетки, перемещаем вниз
else if (ball.getYPos() > real_y_pos)
{
-
y_pos += y_speed;
Объяснение работы метода
Метод очень прост, есть только две разных ситуации:
Если мячик не движется по направлению к ракетке (его x-скорость положительна), ракетка возвращается в центр своего поля. Чтобы сделать это, нужно знать, больше или меньше по значению позиция ракетки значения точки середины поля. Если меньше, то ракетка движется вверх, больше - вниз.
Теперь у нас более интересная, "AI-ситуация": мячик летит в сторону поля компьютера и компьютер должен решать, куда ему двигаться. Если позиция компьютера больше, чем позиция мячика, ракетка перемещается вверх. Я думаю, вы уже догадались, что получается в обратном случае... верно, перемещается вниз. Вот так это и делается, и причем работает, в чем вы можете убедиться, посмотрев апплет!
Еще одна важная штучка
Не проблема написать AI, который не может быть побит. Компьютер не устает и всегда видит мяч. Вы как программист должны подумать и о игроке-человеке. Игра весела только тогда, когда вы можете выиграть. Победа не должна доставаться слишком легко, но должна быть возможной. Так что компьютер тоже должен иногда давать слабину. Например, двигаться медленне, чем мяч, и не мог ловить быстрые удары. Вам нужно найти верный баланс между сильным и слабым AI, что может занять намного больше времени, чем написание непосредственно AI.
Скачать исходный код апплета (zip-архив)
Запустить апплет
Следующая глава:
Генерирование 2D ландшафта