Архивы: по дате | по разделам | по авторам

DiNGS – программирование игр в домашних условиях. Часть 13

АрхивПрограммазм (архив)
автор : Александр Супрунов   02.04.2003

Искусственный интеллект в играх.

До этого момента мы предполагали, что в нашей игре есть 2 участника. Но как быть, если никого рядом нет, а сыграть в игру хочется? Поэтому с самых первых игр программисты пытались воссоздать разум человека, награждая им компьютерного оппонента. Это получило название – Искусственный Интеллект (АI). AI используется практически во всех играх. Кому то удается приблизится к модели поведения очень близкой настоящему человеку, кому то это не удается. Сегодня мы попытаемся вдохнуть в наш компьютер человеческий разум. Заставим компьютер действовать и мыслить, как человек. Создадим компьютерного соперника. В играх его обычно именуют CPU.

Хотя создать умного соперника задача не простая, но все это не так сложно, как может показаться и очень увлекательно. Исходя из того, что мы пишем игру-клон PingPong, где бита должна отбивать мяч, напишем искусственный интеллект способный самостоятельно отбивать биту и что самое важное… Иногда промахиваться! Действительно, чисто человеческая черта. Посадите друга за игру и понаблюдайте за ним, что за действия он выполняет. Можно конечно и самому одновременно играя выступить в роли наблюдателя.
Действие:
мяч летит в нашу сторону.
Реакция:
сдвигаем биту в направлении мяча.

Это самый примитивный вариант искусственного интеллекта. Пример кода:

BitaY_Player2=ballY;
//Координата биты по Y всегда  соответствует координате мяча по Y.

Все. 

При таком AI компьютер не может проиграть, он обязательно отобьет мяч и такой вариант не всегда плох. В игре может быть задумано, что при финальной битве с Боссом CPU пропустить мяч не может, но существуют способы другими средствами разрушить ракетку противника. Но во всех остальных случаях играть против такого соперника будет не интересно. Заставим компьютерного оппонента поумнеть.

Пример кода:

IF ballY > BitaY_Player2  THEN BitaY_Player2= BitaY_Player2+1
IF ballY < BitaY_Player2  THEN BitaY_Player2= BitaY_Player2-1

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

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

Действие:
мяч летит в нашу сторону.
Реакция:
отсутствует, пока мяч не достиг некоей критической точки (например, середины экрана), когда уже необходима сосредоточенность и точность перемещения биты.

Действие:
мяч пересек середину экрана.
Реакция:
Сдвигаем биту для отбива мяча.

Такая схема более вероятно моделирует поведение человека. Пример кода (бита управляемая компьютером находится слева и разрешение экрана 640x480):

IF ballY<=320;
IF ballY > BitaY_Player2;
BitaY_Player2= BitaY_Player2+1
ENDIF
ENDIF

IF ballY<=320;
IF ballY < BitaY_Player2;
BitaY_Player2= BitaY_Player2-1
ENDIF
ENDIF

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

Пример (если a<10 и b>2 тогда с= a+b):

IF (a<10)
IF (b>2)
c=a+b;
ENDIF
ENDIF

Пока «a» не станет меньше 10, второе условие даже не будет проверяться. Таким способом мы можем создавать конструкции любой сложности.

Итак, мы действительно создали Искусственный Интеллект способный управлять битой и поспорить с вами на звание чемпиона в игру Ping Pong! Но…

Не кажется ли вам, что компьютер действует слишком прямолинейно? Все так и есть. По данному алгоритму компьютер играет очень сильно, что не интересно. Но чтобы улучшить АI , необходимо научить компьютер ошибаться! Придать железу черты человека.
Что для этого необходимо?
Как уже было не раз – доработать выше приведенную схему. (На данном примере хорошо видно, что для реализации сложных задач необходимо начинать с элементарных вещей. Заставить компьютер сделать один ход, проанализировать, понять, что не удовлетворяет в таком его поведении и изменить. Это путь от простого к сложному. Добавляя новые возможности к однострочной конструкции, мы можем получить очень мощные алгоритмы, имитирующие поведение человека). Ниже приведен улучшенный алгоритм поведения компьютерного оппонента.

Действие:
мяч летит в нашу сторону.
Реакция:
отсутствует, пока мяч не достигнет некоей критической точки (например, середины экрана), когда уже необходима сосредоточенность и точность перемещения биты.

Но ведь живой человек не в состоянии определить с абсолютной точностью когда мяч пересекает середину экрана. Он может начать двигать битой либо с опозданием, что приведет к пропуску мяча (не обязательно), либо раньше.

Действие:
мяч пересек середину экрана.
Реакция:
Сдвигаем биты для отбива мяча.

Необходимо добавить некую случайность реагирования CPU на приближение мяча. Если отсутствие реакции на мяч летящей во второй половине экрана вполне естественно, то при пересечении середины экрана необходимо ввести случайный фактор реакции компьютерного игрока. Чтобы в разные моменты он мог среагировать на мяч и когда он уже пересек 400 точек экрана, и когда он только пересек границу, а то и находится в 100 точках от биты. В последнем случае, скорее всего CPU пропустит мяч – что соответствует выражению «прозевал мяч»!

Пример кода улучшенного AI CPU:

Zone_Action=RND(300)
IF  Zone_Action <70 THEN Zone_Action =70
. . .

IF ballY<= Zone_Action;
IF ballY > BitaY_Player2;
BitaY_Player2= BitaY_Player2+1
ENDIF
ENDIF
. . .

По аналогии надеюсь, вы самостоятельно сможете дописать до конца весь алгоритм. Что мы видим? Компьютер действует, как живой! Самое время изменить код нашей игры, дав компьютерному противнику Искусственный Интеллект!

(Продолжение следует)

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.