Разработка игровой программы

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОСИЙСКОЙ ФЕДЕРАЦИИ
Таганрогский государственный радиотехнический университет
Кафедра вычислительной техники
_____________________________________________________________________

Дистанционное обучение
2000 – 2001 учебный год

КУРСОВАЯ РАБОТА
по курсу
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

Студента группы ВД – 49

Каретина Флориана Викторовича

Задание выполнил ________________ _____________________
подпись студента дата выполнения задания

Задание проверил ________________ _____________________
оценка подпись преподавателя

_______________________
дата проверки задания

Рецензия преподавателя
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________

ОГЛАВЛЕНИЕ
1. Постановка задачи 3 стр.
2. Входные данные 3 стр.
3. Выходные данные 3 стр.
4. Текст программы 4 стр.

1. Постановка задачи.

Необходимо разработать игровую программу «Арканоид». Дощечки для отбивания шарика надо разместить слева и справа. Правая дощечка должна управляться клавишами «A» и «Z» (вверх и вниз соответственно), а правая дощечка должна управляться клавишами «L» и «<» (вверх и вниз соответственно). Так же должен быть предусмотрен режим игры за компьютер (автоматическое отбивание дощечками шарика). По нажатию клавиши «1» - включение/выключение игры за компьютер левой дощечки, по нажатию клавиши «2» - включение/выключение игры за компьютер правой дощечки. Программа должна иметь дружественный интерфейс, работать на компьютере с процессором 486DX-66. 2. Входные данные.
1. Управление дощечками пользователем.
2. Положение дощечек при приближении шарика к краям экрана.

3. Выходные данные.

Перемещение дощечки по экрану при нажатии определенных клавиш.
Отталкивание/непопадание шарика от дощечки.
Выдача очков играющих.
Звуковое сопровождение при попадании или непопадании шарика по дощечке, или отскакивания его от стенки.

Текст программы
program Game_Tenis;
uses DOS, Crt2, Graph;
var
CK, StopRun, Up1, Down1, Up2, Down2, Auto1, Auto2 Boolean;
R1, R2, oR1, oR2, BX, BY, oBX, oBY, Step Integer;
kX, kY, rBX, rBY Real;
MissCount1, MissCount2 Word;
OldInt9 procedure;
{____________________________________________________________________________}
{работа с клавиатурой по превываниям}
procedure UserInt9; interrupt;
begin
case Port[$60] of
$81 StopRun =True; {Esc — выход}
$1E begin CK =True; Up1 =True; end; {вверх первая дощечка}
$9E begin CK =True; Up1 =False; end;
$2C begin CK =True; Down1 =True; end; {вниз первая дощечка}
$AC begin CK =True; Down1 =False; end;
$25 begin CK =True; Up2 =True; end; {вверх вторая дощечка}
$A5 begin CK =True; Up2 =False; end;
$32 begin CK =True; Down2 =True; end; {вниз вторая дощечка}
$B2 begin CK =True; Down2 =False; end;
$02 Auto1 =not Auto1; {включение/выключение авто-режима}
{для игрока 1}
$03 Auto2 =not Auto2; {включение/выключение авто-режима}
{для игрока 2}
end;

Inline ($E4/$61/$8A/$E0/$0C/$80/ {вставка в машинных кодах}
$E6/$61/$86/$E0/$E6/$61/ {для правильной работы}
$B0/$20/$E6/$20); {обработчика прерывания}
end;
{—————————————————————————-}
{процедура установки пользовательского прерывания}
procedure SetUserInt;
begin
GetIntVec($09,@OldInt9); {сохранение старого вектора}
SetIntVec($09,Addr(UserInt9)); {установка нового}
end;
{—————————————————————————-}
{восстановление старого вектора}
procedure SetOldInt;
begin
SetIntVec($09,@OldInt9);
end;
{—————————————————————————-}
{процедура инициализации графического режима}
procedure InitScreen;
var
GrMode, GrDriver Integer;
GrPath String;
begin
GrDriver =VGA;
GrMode =VGAHi;
GrPath =’E plbpbgi’;
InitGraph(GrDriver, GrMode, GrPath);
SetTextStyle(2, 0, 6);
end;
{—————————————————————————-}
{процедура обновления количества очков игроков}
procedure RefrCount;
var
s1 String;
begin
SetFillStyle(1,0);

Bar(610, 230, 639, 250);
Str(MissCount1, s1);
OutTextXY(614,232, s1);
Bar(0, 0, 29, 479);
Str(MissCount2, s1);
OutTextXY(5,232, s1);

Bar(0, 230, 29, 250);
Str(MissCount2, s1);
OutTextXY(4,232, s1);
Bar(610, 0, 639, 479);
Str(MissCount1, s1);
OutTextXY(615,232, s1);
end;
{—————————————————————————-}
procedure Game;
var
t1 Integer;
ChC Boolean;
begin
{прорисовка игрового поля}
SetColor(12);
Rectangle(30,0, 609, 479);
SetFillStyle(1, 1);
Bar(31,1, 608, 478);
{первоначальная установка переменых}
kX =0.8;
kY =0.3;
Step =10;
rBX =320;
rBY =240;
oBX =320;
oBY =240;
R1 =240;
R2 =240;
oR1 =240;
oR2 =240;

repeat
{если нажата клавиша вверх и не нажата клавиша вниз}
{для игрока 1}
if Up1 and not Down1 then
begin {перемещение дощечки вверх}
R1 =R1-10;
if R1<50 then R1 =50; {не пропускать выше положенной}
SetColor(1); {координаты}
Line(50, oR1-48, 50, oR1+48);
SetColor(11);
Line(50, R1-48, 50, R1+48);
oR1 =R1;
end;
{если нажата клавиша вниз и не нажата клавиша вверх}
{для игрока 1}
if Down1 and not Up1 then
begin {перемещение дощечки вниз}
R1 =R1+10;
if R1>430 then R1 =430;{не пропускать ниже положенной}
SetColor(1); {координаты}
Line(50, oR1-48, 50, oR1+48);
SetColor(11);
Line(50, R1-48, 50, R1+48);
oR1 =R1;
end;
{если нажата клавиша вверх и не нажата клавиша вниз}
{для игрока 2}
if Up2 and not Down2 then
begin {перемещение дощечки вверх}
R2 =R2-10;
if R2<50 then R2 =50; {не пропускать выше положенной}
SetColor(1); {координаты}
Line(590, oR2-48, 590, oR2+48);
SetColor(10);
Line(590, R2-48, 590, R2+48);
oR2 =R2;
end;
{если нажата клавиша вниз и не нажата клавиша вверх}
{для игрока 2}
if Down2 and not Up2 then
begin {перемещение дощечки вниз}
R2 =R2+10;
if R2>430 then R2 =430;{не пропускать ниже положенной}
SetColor(1); {координаты}
Line(590, oR2-48, 590, oR2+48);
SetColor(10);
Line(590, R2-48, 590, R2+48);
oR2 =R2;
end;
{если включен автоматический режим для игрока 1}
if Auto1 then
begin {автоматическое перемещение дощечки}
R1 =BY;
if R1<50 then R1 =50;{не пропускать выше положенной}
{координаты}
if R1>430 then R1 =430;{не пропускать ниже положенной}
{координаты}
SetColor(1);
Line(50, oR1-48, 50, oR1+48);
oR1 =R1;
end;
SetColor(11);
Line(50, R1-48, 50, R1+48);
{если включен автоматический режим для игрока 2}
if Auto2 then
begin {автоматическое перемещение дощечки}
R2 =BY;
if R2<50 then R2 =50;{не пропускать выше положенной}
{координаты}
if R2>430 then R2 =430;{не пропускать ниже положенной}
{координаты}
SetColor(1);
Line(590, oR2-48, 590, oR2+48);
oR2 =R2;
end;
{перерисовка полета шарика}
SetColor(10);
Line(590, R2-48, 590, R2+48);

SetColor(12);
Rectangle(30,0, 609,479);

SetFillStyle(1, 1);
SetColor(1);
FillEllipse(oBX, oBY, 10, 10);

rBX =rBX+kX*Step;
rBY =rBY+kY*Step;
BX =Round(rBX);
BY =Round(rBY);
SetFillStyle(1, 15);
SetColor(7);
FillEllipse(BX, BY, 10, 10);
{если дощечка не попала}
if ChC then
begin
ChC =False;
RefrCount; {обновить очки игроков}
end;
{столкновение шарика с дощечкой слева}
if (BX<60) and (BY>(R1-55)) and (BY<(R1+55)) then
begin
kX =-kX;
Sound(1000);
Delay(10);
NoSound;
end;
{не попадание дощечкой слева}
if (BX<40) then
begin
rBX =580;
rBY =R2;
kX =Abs(kX);
Sound(700);
Delay(500);
NoSound;
Inc(MissCount1);
ChC =True;
end;
{столкновение шарика с дощечкой справа}
if (BX>580) and (BY>(R2-55)) and (BY<(R2+55)) then
begin
kX =-kX;
Sound(1000);
Delay(10);
NoSound;
end;
{не попадание дощечкой справа}
if (BX>600) then
begin
rBX =60;
rBY =R1;
kX =-Abs(kX);
Sound(700);
Delay(500);
NoSound;
Inc(MissCount2);
ChC =True;
end;
{удар шарика об верхнюю или нижнюю стенку}
if (BY<10) or (BY>470) then kY =-kY;
oBX =BX;
oBY =BY;

Delay(10);
until StopRun; {выход если нажата клавиша Esc}

end;
{============================================================================}
begin
InitScreen; {инициализация графического режима}
SetUserInt; {установка пользовательского прерывания}
Game; {непосредственно вызов игры}
SetOldInt; {восстановления старого вектора прерывания}
CloseGraph; {закрытие графического режима}
end.

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОСИЙСКОЙ ФЕДЕРАЦИИ
Таганрогский государственный радиотехнический университет
Кафедра вычислительной техники
_____________________________________________________________________

Дистанционное обучение
2000 – 2001 учебный год

ОТЧЕТ
о выполнении практических заданий
по курсу
ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

Студента группы ВД – 49

Каретина Флориана Викторовича

Задание выполнил ________________ _____________________
подпись студента дата выполнения задания

Задание проверил ________________ _____________________
оценка подпись преподавателя

_______________________
дата проверки задания

Рецензия преподавателя
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________

Описание программы созданной с помощью Turbo Visual.

Начинается программа с подключения библиотек Turbo Visual
uses App, Objects, Menus, Drivers, Editors, Views;
Основной блок программы состоит из трех команд
Begin
MyApp.Init; {Подготовить работу программы}
MyApp.Run; {Выполнить необходимые действия}
MyApp.Done; {Завершить исполнение программы}
End.
Для создания собственной строки статуса вводим следующее описание
type
TMyApp=object(TApplication) {Создаем объект-потомок от TApplication}
procedure InitStatusLine; virtual; {Перекрываем старый метод InitStatusLine новым}
Описание нового метода, с помощью которого создается строка статуса
Procedure TMyApp.InitStatusLine;
Var R TRect; {хранит границы строки статуса}
Begin
GetExtent(R); {устанавливает R в координаты всего экрана}
R.A.Y =R.B.Y-1; {передвигает вершину выше нижней на 1 строку}
StatusLine =New(PStatusLine, Init(R, {создает строку статуса}
NewStatusDef(0,$FFFF, {устанавливает диапазон контекстного Help}
NewStatusKey(‘~Alt-X~ Exit’, kbAltX, cmQuit, {определяет элемент}
NewStatusKey(‘~Alt-F3~ Close’, kbAltF3, cmClose, {другой}
nil)), {больше нет клавиш}
nil))) {больше нет определений}
End;
Формирование меню
Описание в разделе типов
TMyApp=object(TApplication) {Создаем объект-потомок от TApplication}
procedure InitMenuBar; virtual; {Перекрываем старый метод InitMenuBar новым}
Тело процедуры
procedure TMyApp.InitMenuBar;
Var R TRect;
Begin
GetExtent(R); {устанавливает R в координаты всего экрана}
R.B.Y =R.A.Y+1;
MenuBar =New(PMenuBar, Init(R, NewMenu( {создать полосу меню}
NewSubMenu(‘~F~ile’, hcNoContext, NewMenu( {определить меню}
StdFileMenuItems(nil)), {стандратная функция определения элементов}
{меню File}
NewSubMenu(‘~W~indow’, hcNoContext, NewMenu( {определить меню}
StdWindowMenuItems(nil)), {стандратная функция определения элементов}
{меню Window}
nil) {больше нет подменю}
)))); {конец полосы}
End;
Создание окон и манипуляции с ними
Описание
procedure NewWindow; virtual;
procedure HandleEvent(var Event TEvent); virtual;
end;
PDemoWindow=^TDemoWindow; {тип указателя для нового объектного типа}
TDemoWindow=object(TWindow) {определение нового типа окна}
constructor Init(Bounds TRect; WinTitle String; WindowNo Integer);
end;
PInterior=^TInterior;
TInterior=object(TScroller)
constructor Init(var Bounds TRect; HS, VS PScrollBar);
procedure Draw; virtual;
procedure HandleEvent(var Event TEvent); virtual;
end;
Описание тела конструктора инициализации окна
constructor TDemoWindow.Init(Bounds TRect; WinTitle String; WindowNo Integer);
var
S String[3];
Interior PInterior;
HS, VS PScrollBar;
begin
Str(WindowNo,S); {устанавливает номер окна в заколовке}
TWindow.Init(Bounds, WinTitle+’ ‘+S, wnNoNumber);
GetClipRect(Bounds);
Bounds.Grow(-1,-1); {интерьер помещается внутри рамки окна}
VS =StandardScrollBar(sbVertical+sbHandleKeyBoard); {разрешение перемещения вертикального бегунка стрелками на клавиатуре}
HS =StandardScrollBar(sbHorizontal+sbHandleKeyBoard); {разрешение перемещения горизонтального бегунка стрелками на клавиатуре}
Interior =New(PInterior, Init(Bounds, HS, VS));
Insert(Interior); {добавляет интерьер к окну}
end;
Описание конструктора инициализации интерьера
constructor TInterior.Init(var Bounds TRect; HS, VS PScrollBar);
begin
TScroller.Init(Bounds, HS, VS);
GrowMode =gfGrowHiX+gfGrowHiY;
end;
Описание процедуры прорисовки интерьера окна
procedure TInterior.Draw;
begin
TScroller.Draw; {Вызов стандартной прорисовки}
WriteStr(0,0,’Текст в окне’,1); {Вывод текста в окно}
TScroller.ShowCursor; {Показать курсор}
end;
Описание тела процедуры создания нового окна
procedure TMyApp.NewWindow;
var
Window PDemoWindow;
R TRect;
Begin
Inc(WinCount);
R.Assign(0,0,26,7); {установка начального размера и позиции}
R.Move(Random(58),Random(16)); {случайное перемещение по экрану}
Window =New(PDemoWindow, Init(R, ‘Demo Window’, WinCount));
DeskTop^.Insert(Window); {вывести окно на панель экрана}
End;
Описание тела процедуры обработки команд среды
procedure TMyApp.HandleEvent(var Event TEvent);
Begin
TApplication.HandleEvent(Event); {действует как предок}
if Event.What=evCommand Then
Begin
case Event.Command of {но откликается на дополнительные команды}
cmNew NewWindow; {определяет действие для команды cmNew}
else
Exit;
End;
ClearEvent(Event); {очищает событие после обработки}
end;
End;
Описание тела процедуры обработки команд в окне
procedure TInterior.HandleEvent(var Event TEvent);
Begin
TScroller.HandleEvent(Event); {действует как предок}
case Event.What of {проверка события}
evKeyDown {если нажата клавиша}
Begin
Case Event.KeyCode of {проверка какая клавиша нажата}
kbLeft {стрелка влево}
begin
if x>0 then {если координата по Х больше 0}
Begin
x =x-1; {то уменьшить ее на 1}
SetCursor(x,y); {установить на новую координату курсор}
End
end;
kbRight {стрелка вправо}
begin
x =x+1; {увеличить координату по Х на единицу}
SetCursor(x,y); {установить на новую координату курсор}
end;
kbUp {стрелка вверх}
begin
if y>0 then {если координата по Y больше 0}
Begin
y =y-1; {то уменьшить ее на 1}
SetCursor(x,y); {установить на новую координату курсор}
End
end;
kbDown {стрелка вниз}
begin
y =y+1; {увеличить координату по Y на 1}
SetCursor(x,y); {установить на новую координату курсор}
end;
end;
Case Event.ScanCode of {проверка скан-кода клавиатуры}
57 {если пробел}
begin
If GetState(sfCursorVis) Then {если курсор виден}
TScroller.HideCursor {то скрыть его}
Else
TScroller.ShowCursor; {иначе показать его}
end;
end;
End;
end;
End;

Описание игровой программы «Стрельба по мишени».

Игровая программа состоит из трех процедур (minv — уменьшение кол-ва патронов, intro — заставка, go — конец игры) и основного блока программы.
Процедура minv (уменьшение количества патронов).
kv =kv-1; {уменьшение значение переменной kv (в основной программе она фигурирует как количество патронов) }
setfillstyle(1,9); {установка стиля заполнения фона}
bar((20-kv)*10+415,4,(20-kv)*10+425,12); {стирание одного патрона с экрана}
Процедура intro; {Заставка}
Выводит заставку игры.
settextstyle(0,0,15); {установка стиля текста}
setcolor(12); {установка цвета}
outtextxy(140,100,’ТИР’); {вывод текста}
settextstyle(0,0,2);
setcolor(10);
outtextxy(130,290,’ESC — ‘);
setcolor(14);
outtextxy(220,290,’Выход из программы’);
settextstyle(0,0,1);
tp =’НАЖМИТЕ ЛЮБУЮ КНОПКУ ДЛЯ НАЧАЛА ИГРЫ’;
settextstyle(0,0,1);
setcolor(11);
outtextxy(320-trunc(length(tp)*4),340,tp); {вывод текста с расчетом по центру}
a =readkey;
if ord(a)=27 then exi =true; {если нажата клавиша Esc – выйти из игры}
setfillstyle(1,0);
bar(100,30,600,350);
Процедура go – выводит заставку конца игры
procedure go; {Конец игры}
begin
settextstyle(0,0,5); {установка стиля вывода текста}
setcolor(2); {установка цвета}
outtextxy(50,200,’ВСЕ,ДОИГРАЛИСЬ’);
settextstyle(0,0,2);
readkey;
UROV =1;MENU =true;oko =0;
end;
Основное тело программы
begin
d =vga;initgraph(d,r,»); {инициализация графики}
setgraphmode(2); {установка графического режима}
randomize; {вызов генератора случайных чисел}
urov =1;oko =0; mus =true; sou =true;menu =true; {первоначальная установка переменных}
repeat {начало основного цикла программы}
{Cоздание интерфейса}
cleardevice; {очистака экрана}
setfillstyle(1,1); {установка стиля заполнения фона}
bar(0,0,640,2); {рисование прямоугольников вокруг рабочей области}
bar(0,0,2,480);
bar(0,480,640,478);
bar(640,480,638,0);
setfillstyle(1,9);
bar(2,2,638,17);
bar(2,2,5,478);
bar(2,478,638,475);
bar(638,2,635,478);
setfillstyle(1,3);
bar(5,17,635,19);
bar(5,17,7,475);
bar(5,475,635,473);
bar(635,17,633,475);
setfillstyle(9,14);
setcolor(14); {установка цвета рисования}
moveto(7,460); {перемещение графического курсора в указанные координаты}
for i =1 to 62 do {рисование песка холмиками}
lineto(i*10+7,460+random(10));
lineto(633,460);
line(7,473,633,473);
line(7,473,7,460);
line(633,473,633,460);
floodfill(9,469,14); {заполнение стилем области, расположенной либо внутри замкнутого контура, либо вне его}
setlinestyle(0,0,1); {установка стиля линий}
setfillstyle(8,6); {установка стиля заполнения фона}
bar(260,408,380,470);
setfillstyle(1,1);
setcolor(14);
line(260,408,260,470);
line(260,408,380,408);
line(380,408,380,470);
fillellipse(320,408,23,15); {вычерчивание контура эллипса текущим цветом и заполнение ограниченной контуром области экрана текущим узором}
setlinestyle(0,3,3);
setcolor(11);
line(320,391,320,376);
fi =pi;tzm =40;tzs =40;
settextstyle(0,0,2);
cou =0; kv =20; ov =1; ex =0;
setfillstyle(1,15);setcolor(7);
bar(250,6,310,12);
setfillstyle(1,0);
bar(17,2,220,17);
setcolor(12);
outtextxy(20,3,’Cчет ‘);
setcolor(11);
setfillstyle(1,11);
for i =1 to kv do fillellipse(i*10+420,8,3,3); {рисование патронов}
if menu then intro; {если menu=true, то вызвать процедуру intro (заставка игры)}
menu =false;
if exi then goto 1; {если exi=true (выход), то перейти на метку 1}
repeat
if keypressed then a =readkey;
settextstyle(0,0,1);
outtextxy(280,280,’Нажмите ENTER’);
setcolor(random(16));
settextstyle(0,0,2);
str(urov,em);
outtextxy(270,200,concat(‘УРОВЕНЬ ‘,em)); {вывод текста с помощью процедуры конкатенации}
str(urov*1000,em);
outtextxy(190,240,concat(‘Наберите ‘,em,’ очков’));
until ord(a)=13; {выход из цикла по клавише Enter}
setfillstyle(1,0);
bar(180,200,500,300);
gettime(q1,min,sec,q2); {получение системного времени}
mk =min+1; {увеличение минут на 1}
sk =sec;
if mk>=60 then begin {если количество минут больше 60,}
hk =q1+1; {то количество часов увеличить на 1}
mk =0; {минуты обнулить}
end;
repeat
gettime(q1,min,sec,q2); {получение системного времени}
setfillstyle(1,1); {установка стиля заполнения}
setcolor(4); {установка цвета рисования}
if mk=min then rk =60-abs(sk-sec) else rk =abs(sk-sec);
bar(250,6,250+abs(rk),12);
if not(bm) then begin
gettime(q1,min,sec,q2); {получение системного времени}
po =random(3);
if sec+po>=59 then begin
tpm =min+1;
tps =0;
end
else begin
tpm =min;
tps =sec+po;
end;
end;
xnp =round(sin(fi)*24+320);
ynp =round(cos(fi)*15+406);
xkp =round(sin(fi)*38+320);
ykp =round(cos(fi)*30+406);
setlinestyle(0,3,3);
setcolor(11);
line(xnp,ynp,xkp,ykp);
ok =false;
if keypressed then begin
a =readkey;
if a=chr(77) then begin fi =fi-0.05; ok =true; end; {Поворот дула влево}
if a=chr(75) then begin fi =fi+0.05; ok =true; end; {Повоорт дула вправо}
if ord(a)=27 then menu =true; {Выход в меню}
if fi
if fi>3*pi/2 then fi =3*pi/2;
if a=’ ‘ then begin {Выстрел}
if (not(fire.v)) and (not(ok)) then begin
minv;
for d =1 to 100 do begin
if sou then sound(random(200)+100);delay(1);
end;
nosound;
fire.v =true;
fire.r =35;
fire.si =sin(fi)*1.1;
fire.co =cos(fi);
ok =true;
fire.xs =-10;
fire.ys =-10;
end;
s =s+1;
end;
end;
if (kv=0) and (not(fire.v)) then ex =ex+1;
if fire.v then begin {Полет снаряда}
setfillstyle(1,0);
setcolor(0);
bar(fire.xs-4,fire.ys-4,fire.xs+4,fire.ys+4);
xv =round(fire.si*fire.r+320);
yv =round(fire.co*fire.r+406);
fire.r =fire.r+5;
fire.xs =xv;fire.ys =yv;
if (fire.xs<=23) or (fire.xs>=622)
or (fire.ys<=33) then begin
cou =cou-50;
if cou<0 then cou =0;
setcolor(10);
setfillstyle(1,0);
bar(100,3,220,17);
str(cou,em);
outtextxy(100,3,em);
fire.v =false;
setfillstyle(1,0);
setcolor(0);
bar(fire.xs-4,fire.ys-4,fire.xs+4,fire.ys+4);
end else begin
setfillstyle(1,10);
setcolor(10);
fillellipse(xv,yv,3,3);
end;
if (fire.xs+4>=xm) and (fire.xs-4<=xm+mi)
and (fire.ys+4>=ym) and (fire.ys-4<=ym+mi)
then begin
fire.v =false;
setfillstyle(1,0);
setcolor(0);
bar(fire.xs-4,fire.ys-4,fire.xs+4,fire.ys+4);
bm =false;mn =false;
str((7-nch)*100,em);
setfillstyle(1,0);
bar(xm,ym,xm+mi,ym+mi);
for i =10 to 800 do begin
sound(i);
setcolor(I);
outtextxy(xm,ym,em);
end;
nosound;
setfillstyle(1,0);
bar(xm,ym,xm+30,ym+15);
xm =-1500;ym =-1500;
setcolor(10);
bar(100,3,220,17);
cou =cou+(7-nch)*100;
str(cou,em);
outtextxy(100,3,em);
end;
end;
gettime(q1,min,sec,q2);
if (min>=tpm) and (sec>=tps) and not(mn) then begin
bm =true;mn =true;
xm =random(560)+30;
ym =random(320)+30;
vm =random(2)+3;
if vm+sec>=59 then begin
tzm =min+1;
tzs =abs(vm+sec-60);
end
else begin
tzm =min;
tzs =vm+sec;
end;
repeat
nch =random(5)+1;
mi =20+nch*5; {Размер мишени}
until nch<=6;
setfillstyle(1,nch);
bar(xm,ym,xm+mi,ym+mi);
end;
gettime(q1,min,sec,q2);
if (min>=tzm) and (sec>=tzs) then begin
bm =false;mn =false;
setfillstyle(1,0);
bar(xm,ym,xm+mi,ym+mi);xm =-1300;ym =-1300;
end;
if ok then begin
setcolor(0);
line(xnp,ynp,xkp,ykp);
end;
until (ord(a)=27) or (ex=1) or ((mk=min) and (sec>=sk));
oko =oko+cou;
str(oko,em);
bm =false;mn =false;fire.v =false;
if cou

*1000>
until exi;
1 closegraph; {закрытие графического режима}
end.