Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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 создает маленькую точку, которой теперь полагается летать, двигаясь в случайном направлении.
|