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

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

                       Кафедра вычислительной техники


_____________________________________________________________________



                                                      Дистанционное обучение

                                                     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<pi/2 then fi:=pi/2;
 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<urov*1000 then go else urov:=urov+1;
until exi;
1: closegraph; {закрытие графического режима}
end.