С для профессиональных программистов

Тело главной программы


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

int directx,directy; /* направление  */

main()

union k

char c[2];

int i;

 key;

int deltax=0,deltay=0;

int swaph=0,swapc=0;

int it=COMPUTER;

long htime,ctime,starttime,curtime; /* таймер счета */

int count;

mode(4); /* установка 4 режима графики CGA/EGA */



palette(0); /* палитра 0 */

load_pic(); /* ввод игрового поля */

time(&starttime); /* установка времени */

htime=ctime=0;

display_object(human,4,1);

display_object(computer,4,3);

count=0;

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

do

/* вычисление текущего счета  */

time(&curtime);

if (it==COMPUTER) htime+=curtime-starttime;

else ctime+=curtime-starttime;

time(&starttime);

show_score(it,htime,ctime);

if (bioskey(1))  /* если нажата клавиша */

directx=directy=IDLE; /* устанавливает

направление перемещения */

key.i = bioskey(0);

deltax=0;deltay=0;

if(!key.c[0]) switch(key.c[1])

case 75: /* влево */

deltay= -1;

directy=LEFT;

break;

case 77: /* вправо */

deltay=1;

directy=RIGHT;

break;

case 72: /* вверх */

deltax= -1;

directx=UP;

deltax= -1;

directx=UP;

break;

case 80: /* вниз */

deltax=1;

directx=DOWN;

break;

case 71: /* вверх и влево */

deltay= -1;

directy=LEFT;

deltax= -1;

directx=UP;

break;

case 73: /* вверх и вправо */

deltay=1;

directy=RIGHT;

deltax= -1;

directx=UP;

break;

case 79: /* вниз и влево */

deltay= -1;

directy=LEFT;

deltax=1;

directx=DOWN;

break;

case 81: /* вниз и вправо */

deltay=1;

directy=RIGHT;

deltax=1;

directx=DOWN;

break;


/* смена типа спрайта игрока  */

if (!swaph) display_object(human,4,1);

else display_object(human2,4,1);

if (is_legal(human,deltax,deltay,4))

update_object(human,deltax,deltay,4);

update_object(human2,deltax,deltay,4);

/* проверяет: попался ли убегающий */

if (!count && tag(human,computer))

 

it= !it; /* смена амплуа */

count=6;

swaph= !swaph; /* смена фигуры имитирующей бег */

/* изображение "человека" в новой позиции */

if (!swaph) displey_object(human,4,1);

else displey_object(human2,4,1);

if (!swapc) display_object(computer,4,3);

else display_object(computer2,4,3);

/* генерация движения спрайта компьютера */

if (it==COMPUTER)

it_comp_move(computer,computer2,human,4);

else not_it_comp_move(computer,computer2,directx,directy,4);

if (!count && tag(human,computer))

it= !it;

count=6;

/* компьютер догоняет; изменение координаты Х на 2

так, чтобы быстрей стать догоняемым

*/

if (is_legal(computer, 2, 0, 4))

update_object(computer, 2, 0, 4); update_object(computer2, 2, 0, 4);

else

update_object(computer, -2, 0, 4);

update_object(computer2, -2, 0, 4);

swapc = !swapc; /* заменить тип спрайта */

/* вывод на экран спрайта компьютера */

if(!swapc) display_object(computer, 4, 3);

else                      display_object(computer2, 4, 3);

if(count) count--;

while (key.c[0] !='q' && htime<999 && ctime<999);

mode(2);

if(ctime>htime)

printf("Компьютер выиграл!");

else

printf("Вы победили!");

 

В теле главной программы экран терминала устанавливается в 4-й графический режим, выбирается палитра 0 и инициализируются переменные счета игры. После этого оба спрайта отображаются в своих исходных позициях.

Переменная htime содержит значение счета игрока, а ctime - компьютера. Переменные swapc и swaph предназначены для указания типа спрайта. Переменные deltax и deltay содержат изменения значений координат после очередного нажатия клавиш игроком. Глобальные переменные directx и directy содержат координаты спрайта, управляемого игроком. Значения этих величин используются компьютером для генерации перемещения своего спрайта. Переменная­признак it содержит информацию о том, кто в данный момент находится в режиме догоняющего. Она может принимать одно из двух значений, описанных в макроопределении #define: COMPUTER или HUMAN.



Главная   программа   работает                                циклически.                 На   экране

отображается  текущий  счет.  После  этого  проверяется,  была ли

нажата  какая-либо  клавиша.   Если   клавиша   была  нажата,  то

определяется ее  код и производится  заданное перемещение спрайта

игрока.  Обратите  внимание  на  то,  что в  данной программе нет

режима ожидания  нажатия клавиши игроком.  Поэтому,  не смотря на

то,  что игрок  не  нажимает  клавиш,  компьютер  продолжает свою

работу,  и спрайт игрока продолжает указанное  перемещение до тех

пор,  пока не будет нажата другая клавиша. Такое движение спрайта

обеспечивает достаточно высокую динамичность игры.

После очередного перемещения спрайта игрока, компьютер генерирует движение собственного спрайта, если это необходимо. Обратите внимание на то, что для генерации движения спрайта используются различные функции в зависимости от того в режиме догоняющего или догоняемого находится спрайт. При реализации очередного перемещения собственного спрайта, компьютер так же проверяет его корректность.

Рассмотрим некоторые программы, используемые в этой игре.


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