Программирование игр для Windows. Советы профессионала

       

Преследование


Во-первых, нам необходимо знать расположение обоих объектов. У нас есть эти данные, так как мы знаем координаты игрока и игрового объекта, являющегося врагом.

Во-вторых, нам необходимо сконструировать алгоритм, который будет управлять поведением врага, преследующего игрока. Алгоритм 13.1 делает именно то, что мы от него и хотим:

Алгоритм 13.1. Алгоритм Преследования.

// Предположим, что рх,ру - координаты игрока,

// ех,еу - координаты противника

while (игра)

(

программный код

// Вначале рассматриваем перемещение по горизонтали (ось X)

if ех>рх then ex=ex+l if ex<px then ex=ex-l

 // Теперь рассматриваем вертикальный (Y) компонент

if ey>py then ey=ey+l if ey<py then ey=ey-l

программный код

}

§

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



§          Та же самая логика применима и к перемещению по вертикали.

Используя этот алгоритм, противник преследует игрока почти столь же неумолимо, как и Т1000 из Терминатора-2. Он не остановится до тех пор, пока не поймает игрока. Мы могли бы несколько облегчить его задачу путем добавления некоторой дополнительной логики, способствующей его движению к позиции нанесения удара. Однако, перед тем, как это делать, давайте посмотрим программу, моделирующую преследование. Листинг программы 13.1 рисует две точки: одну голубую (вы), а другую красную (противник). Что бы вы ни предпринимали, красная точка пытается настичь вас. Для движения (или, я бы сказал, бега!) нажмите клавишу U - перемещение вверх, N - вниз, Н -влево и J - вправо. Для выхода из программы нажмите Q.

Листинг 13.1. Программа Терминатор (TERM.С).

// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ///////////////////////////////

#include <stdio.h>

#include <graph.h>




// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ///////////////////////////////////

// указатель на переменную BIOS, содержащую текущее

// значение системного таймера. Это значение изменяется

// с частотой 18.2 раза в секунду

usigned int far *clock = (unsigned int far *)0x0000046C;

// функции /////////////////////////////////////////////////

void Timer(int clicks)

{ // Эта функция использует значение таймера для формирования

// задержки. Необходимое время задержки задается в "тиках"

// интервалах в 1/18.2 сек. Переменная, содержащая 32-битовое

// текущее значение системного таймера, расположена

// по

адресу 0000:046Ch

unsigned int now;

// получить текущее время

now = *clock;

// Ничего не делать до тех пор, пока значение таймера не

// увеличится на требуемое количество "тиков".

// Примечание: один "тик" соответствует примерно 55мс.

while(abs(*clock - now) < clicks){}

} // конец функции Timer

// ОСНОВНАЯ ПРОГРАММА ////////////////////////////////////

void main(void)

{

int рх=1б0,ру=100, // стартовая позиция игрока

ex=0,ey=0;     // стартовая позиция врага

done=0;        //флаг окончания работы программы

_setvideomode(_MRES256COLOR);

printf("     Terminator - Q to Quit");

//сновной игровой цикл

whilе(!done)

{

// удалить точки            

_setcolor(0);

_setpixel(px,py) ;

_setpixel(ex,ey) ;

// передвинуть игрока

if (kbhit())

{

// куда движется игрок?

switch(getch())

{

case 'u' : // вверх

{

py-=2;

} break;

case 'n': // вниз

{

py+=2;

} break;

case 'j': // вправо

{

px+=2;

} break;

case 'h': // влево

{

px-=2;

} break;

case 'q':

{

done=1;

}break;

} // конец оператора switch

} // конец обработки нажатия клавиши

// переместить врага

// начало работы "мозга"

if (рх>ех) ех++;

if (рх<ех) ех--;

if

(рy>еу) еу++;

if (рy<еу) еу--;

// конец работы "мозга"

// нарисовать точки

_setcolor(9);                                

_setpixel(px,py);

_setcolor(12);

_setpixel(ex,ey);

// немного подождать

Timer(2);

} // конец основного игрового цикла while

_setvideoroode(_DEFAULTMODE) ;

} // конец функции main

Листинг 13.1 показывает как просто сконструировать набор действий, кажущихся на вид разумными. Но на самом деле, прежде чем мы получим полноценный искусственный интеллект, эти строки программы должны претерпеть массу усовершенствований.


Содержание раздела