Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 13.2. Муха (FLY.C).






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

#include < stdio.h>

#include < graph.h>

#include < math.h>

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

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

//значение таймера. Содержимое этой 32-битовой ячейки

//обновляется 18.2 раз в секунду

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

// Х- и Y-компоненты шаблонов траекторий, по которым будет

// двигаться " муха"

int patterns_x[3] [20]={1, 1, 1, 1, 1, 2, 2, -1, -2, -3, -1, 0, 0, 1, 2, 2, -2, -2, -1, 0, 0, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 3, 3, 3, 3, 2, 1, -2, -2, -1, 0, -l, -2, -3, -3, -2, -2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1};

int patterns_y[3] [20]={0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 1, 2, 2, -1, -1, -1, -2, -2, -1, -1, 0, 0, 0, 1, 1, 1, 1, 1};

/////////////////////////////////////////////

void Timer(int clicks)

{

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

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

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

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

// по адресу 0000: 0: 46Ch

unsigned int now;

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

now = *clock;

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

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

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

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

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

// ОСНОВНАЯ ФУНКЦИЯ //////////////////////////////////////

void main(void)

{

int px=160, py=100, // начальные координаты игрока

ex=0, ey=0; // начальные координаты противника

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

doing_pattern=0, // флаг выполнения команд шаблона

current_pattern, // номер выполняемого шаблона,

// принимает значение в интервале 0-2

pattern_element; < // номер выполняемой команды шаблона

_setvideomode(_MRES256COLOR,);

printf(" The Fly - Q to Quit");

// главный игровой цикл

while(! 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 (! doing_pattern)

{

if(px> ex) ex++;

if(px< ex) ex--;

if(py> ey) ey++;

if(py< ey} ey--;

// Теперь проверяем, не надо ли начать выполнять

// шаблон. Он начинает выполняться, если игрок

// оказывается в радиусе 50 точек от противника.

if (sqrt(.1+(рх-ех)*(рх-ех)+(ру-еу)*(ру-еу))< 15)

{

// Даже не думайте использовать функцию sqrt в

// настоящей игре!

// Получаем случайный номер шаблона

curent_pattern = rand()%3;

// Переводим " мозг" в режим действий по шаблону

doing_pattern = 1;

pattern_element=0;

} // конец проверки на попадание игрока

// в " радиус действия"

} // конец действий, для случая, когда шаблон не выполнялся

else {

// перемещаем противника, используя следующий

// элемент текущего шаблона

ex+=patterns_x[current_pattern][pattern_element];

ey+=patterns_y[current_pattern] [pattern_element];

// мы закончили обработку шаблона?

if (++pattern_element==20)

{

pattern_element = 0;

doing_pattern = 0;

} // конец проверки на окончание шаблона

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

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

// рисуем точки

_setcolor(9);

_setpixel(px, py);

_setcolor(12);

_setpixel(ex, ey); // Немного подождем...

Timer(1);

} // конец цикла while

// восстановление начального видеорежима

_setvideomode(_DEFAULTMODE);

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

Когда вы запустите программу из Листинга 13.2, то поймете, почему я назвал ее " Муха". Точка, бегающая по экрану и в самом деле напоминает муху. Она приближается к вам и вдруг начинает быстро летать вокруг. И такое поведение персонажа воплощено всего в нескольких строках программы с применением описанных выше алгоритмов. (Гм, так как вы думаете, может быть люди - это и в самом деле комплекс действий и реакций?) Теперь рассмотрим случайные передвижения.

Случайные передвижения

Что я понимаю под случайным передвижением? Это выполнение персонажем какого-нибудь совершенно непредсказуемого действия. Нечто подобное мы уже сделали в программе из Листинга 13.2. Однако, мы можем расширить эту концепцию не только выбирая способ реагирования, но и определяя, нужна ли реакция как таковая. Почему бы нам не добавить еще один тип поведения нашей " Мухе" - случайное передвижение.

Случайные перемещения используются во многих видеоиграх как один из способов реагирования виртуального мира на действия игрока. Такой образ Действий можно назвать " неявной логикой". Неявная логика помогает принять Рвение при отсутствии части необходимой информации, или вообще информации как таковой.

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

К примеру, когда вы сталкиваетесь с решением некоторого вопроса, такого как обход препятствия, возникшего на вашем пути, вы попытаетесь избежать встречи с ним, двигаясь направо или налево. Если все варианты равны между собой и одинаково возможны, решение, скорее, случайно и, следовательно является «неявным решением». Если бы кто-нибудь спросил вас, например почему вы решили обойти столб справа, а не слева, то вряд ли вы сумели бы внятно объяснить мотивы своего поведения. В другом случае мы можем использовать случайные переменные для выбора направления движения нашей маленькой «Мухи». Алгоритм 13.5 создает маленькую точку, которой теперь полагается летать, двигаясь в случайном направлении.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.01 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал