Создание игры

Министерство образования РФ.

ИжГТУ.

Кафедра Радиотехники.

Курсовая работа

по информатике.

Тема: ”Создание игры”.

                                                                Проверил:          

Старший преподаватель

Сидорина В.А.

                                                                  Выполнил:

Студент гр.2-29-1

Скворцов Я.А.

Ижевск.2003.

                                                    Содержание                                              Стр.

Введение--------------------------------------------------------------------------------3

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

2 Алгоритмы и блок-схемы---------------------------------------------------------5

3 Программа на языке Pascal с комментариями--------------------------------6

4 Руководство пользователя для работы в программе-----------------------16

Заключение----------------------------------------------------------------------------17

Список использованной литературы---------------------------------------------18

ВВЕДЕНИЕ:

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

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

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

Требуется создать игру, основным смыслом которой является то, что в одной части экрана перемещаются объект-(объекты) одного типа(«Самолёты»), а в другой части экрана находится объект другого типа(«Средство противовоздушной обороны»), и «Средство ПВО» должно сбивать «Самолёты».

а) Выбор, обоснование и изложение метода решения задачи.

Я предпочёл использование динамической памяти, прорисовку текстур в отдельной процедуре и звуковое сопровождение.

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

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

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

б) Построение алгоритма задачи.

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

Далее в зависимости от нажатых клавиш динамические объекты двигаются так или иначе.

в) Создание и отладка программы.

Создание программы состояло из трёх этапов: создание меню, создание основного тела игры в виде отдельной процедуры без прорисовки текстур и окончательная прорисовка текстур.

г) Оформление пояснительной записки и защита курсового проекта.

2 Блок-схема.

3 Программа на языке Pascal c комментариями.

program jim;

uses crt,graph;

label 1,3;

var a:char;

    b:integer;

    procedure beep;{Выдача звука}

    begin

    sound(300);delay(6000);nosound;delay(700);

    end;

     procedure zemlya;{прорисовка нижней части экрана}

     begin

     setcolor(3);

     line(0,55,640,55);

     line(0,479,0,430);

     line(0,430,639,430);

     line(639,430,639,479);

     line(639,479,0,479);

     setfillstyle(7,5);

     floodfill(10,470,3);

     end;

  procedure PVO;{Прорисовка средства ПВО}

    begin

        setcolor(6);

        line(5,37,45,37);line(45,37,47,39);

        line(47,40,37,50);line(37,50,7,50);

        line(7,50,3,39);line(3,38,5,37);

        circle(15,43,6);circle(30,43,6);

        circle(6,39,2);circle(44,39,2);

        setfillstyle(1,6);

        floodfill(41,43,6);floodfill(22,49,6);

        floodfill(7,43,6);floodfill(10,39,6);

        setcolor(2);

        line(3,39,3,34);line(3,34,20,34);

        line(21,34,21,23);line(21,23,33,23);

        line(33,23,47,36);line(47,36,47,36);

        line(47,36,3,36);

        line(36,26,29,26);line(29,27,30,30);

        line(31,31,42,31);

        setfillstyle(1,2);floodfill(26,32,2);

        setcolor(9);

        line(8,33,8,23);line(9,24,9,13);

        line(9,13,11,12);line(11,12,11,9);line(11,12,13,13);

        line(13,13,13,24);line(14,23,14,33);

        line(8,28,3,33);line(3,33,19,33);

        line(19,33,14,28);

        setfillstyle(1,9);floodfill(11,28,9);

        line(21,24,24,24); line(21,25,24,25);

        setcolor(4);line(21,26,25,26);line(21,27,25,27);

        setcolor(15);line(21,28,26,28);line(21,29,26,29);

    end;

  procedure NLO; {прорисовка летающей тарелки}

    var l:integer;

    begin randomize;l:=random(256);

        setcolor(l);

        line(9,8,7,8);line(7,9,5,9);

        line(5,10,3,10);line(3,11,1,11);

        line(1,11,1,13);line(2,14,4,14);

        line(3,15,5,15); line(5,16,8,16);

        line(7,17,10,17);line(10,18,16,18);

        line(16,19,35,19);line(35,18,41,18);

        line(41,17,44,17);line(44,16,46,16);

        line(46,15,48,15);line(48,14,49,14);

        line(49,14,49,11);line(49,11,48,11);

        line(48,10,46,10);line(46,9,44,9);

        line(44,8,41,8);line(41,7,41,9);

        line(41,9,40,9);line(40,10,37,10);

        line(37,11,33,11);line(33,12,17,12);

        line(17,11,13,11);line(13,10,10,10);

        line(10,9,9,8);

        setfillstyle(1,l);floodfill(24,15,l);

        putpixel(31,16,0);putpixel(42,12,0);

        putpixel(18,16,0);putpixel(7,13,0);

        setcolor(11);

        line(18,11,32,11);line(32,10,36,10);

        line(36,9,39,9);line(40,8,40,5);

        line(39,4,36,4);line(36,3,32,3);

        line(32,2,18,2);line(18,3,14,3);

        line(14,4,11,4);line(10,5,10,8);

        line(11,9,14,9);line(14,10,18,10);

        setfillstyle(1,11);floodfill(25,7,11);

     end;

  procedure pulka;{Прорисовка снаряда}

        begin

        setcolor(5);

        line(2,6,2,3);line(3,6,3,0);line(4,6,4,3);

        setcolor(13);

        line(3,8,3,7);

        setcolor(14);

        line(1,5,1,7);line(2,7,2,9);

        putpixel(3,9,14);line(4,7,4,9);line(5,5,5,7);

        end;

    procedure gameover(b,v:integer);{предписания при выигрыше одной

      var u,o:integer;                                      из сторон}

          i:^integer;

          siz:word;

     begin

      siz:=imagesize(0,100,1,100);

      getmem(i,siz);

      getimage(0,100,1,100,i^);

      if v>500 then begin

      outtextxy(300,240,'Y');beep;

      outtextxy(308,240,'o');beep;

      outtextxy(316,240,'u');beep;

      outtextxy(324,240,'_');beep;

      outtextxy(332,240,'W');beep;

      outtextxy(340,240,'I');beep;

      outtextxy(348,240,'N');beep;

                    end;

      if b>500 then begin

                       outtextxy(300,240,'G');beep;

                       outtextxy(308,240,'a');beep;

                       outtextxy(316,240,'m');beep;

                       outtextxy(324,240,'e');beep;

                       outtextxy(332,240,'_');beep;

                       outtextxy(340,240,'O');beep;

                       outtextxy(348,240,'v');beep;

                       outtextxy(356,240,'e');beep;

                       outtextxy(364,240,'r');beep;

                       delay(45000);outtextxy(330,260,':');beep;

                                    outtextxy(338,260,'-');beep;

                                    outtextxy(346,260,'>');beep;

                    end;

      delay(64500);delay(64500);

      delay(64500);

      for u:=0 to 640 do

      for o:=0 to 480 do begin

                           putimage(u,o,i^,copyput);

                         end;

     end;

  procedure jim; {Непосредственно игра}

  label 2,3;

  var i,j,x,y,m,n,v,b:integer;

      key:boolean;

      s,ss,s1,s2,s3:word;p,pp,p1,p2,p3:pointer;{рр-пустой квадрат;р-ПВО...;р1-пулька}

  begin i:=9;j:=2;initgraph(i,j,'');

3:      ss:=imagesize(0,430,50,480);a:='y';

        getmem(pp,ss);

        getimage(0,430,50,480,pp^);

        s:=imagesize(0,0,50,50);

        getmem(p,s);

        PVO;

        getimage(0,0,50,50,p^);

        putimage(0,0,pp^,copyput);

        s1:=imagesize(0,0,5,10);

        getmem(p1,s1);

        pulka;

        getimage(0,0,5,10,p1^);

        putimage(0,0,pp^,copyput);

        s2:=imagesize(0,0,5,10);{р2-маленький квадратик пульки}

        getmem(p2,s2);

        getimage(0,0,5,10,p2^);

        s3:=imagesize(0,0,50,20);

        getmem(p3,s3);

        NLO;

        getimage(0,0,50,20,p3^);  putimage(0,0,pp^,copyput);

        zemlya;

        x:=200;y:=379;putimage(x,y,p^,copyput);

        v:=0;b:=0;delay(45000);delay(45000);

      repeat        {Начало самого процесса игры}

              for n:=1 to 1770 do begin

              putimage(round(n/3),60,p3^,copyput);

              if n>1760 then begin

                               putimage(round(n/3),60,pp^,copyput);

                               sound(300);delay(100);nosound;

                             end;

              key:=keypressed;

              if key=false then goto 2;

              a:=readkey;

                  if a=chr(77) then begin

                                     x:=x+3;

                                     if x>580 then begin

                                                    putimage(x,y,pp^,copyput);

                                                    x:=10;

                                                   end;

                                     putimage(x,y,p^,copyput);

                                     end;

                  if a=chr(75) then begin

                                     x:=x-3;

                                     if x<10 then begin

                                                     putimage(x,y,pp^,copyput);

                                                     x:=580;

                                                  end;

                                     putimage(x,y,p^,copyput);

                                    end;

                  if a=chr(32) then begin for m:=y-2 downto 56 do begin

                                                        putimage(x+8,m,p1^,copyput);

                                                        delay(5);

                                                                  end;

                                                        if m<90 then

                                                        if round(n/3)>(x-50) then

                                                        if round(n/3)<(x+10) then begin

                                                        sound(800);delay(2000);

                                                        nosound;putimage(round(n/3),60,pp^,copyput);

                                                        putimage(v,10,p1^,copyput);n:=1;

                                                        v:=v+15;if v>500 then begin gameover(b,v);goto 3;end;end;

                                         putimage(x+8,56,p2^,copyput);

                                    end;

2:                                 end;putimage(b,24,p3^,copyput);b:=b+50;

                                   if b>500 then begin gameover(b,v);goto 3;end;

                            if a=chr(113) then begin

                                  v:=550;gameover(b,v);goto 3;

                                     end;

      until a=chr(27);

  end;

begin{Основная программа}

1:   clrscr;

     gotoxy(30,10);

     write('Введение');

     gotoxy(30,11);

     write('Постановка задачи');

     gotoxy(30,12);

     write('Математические методы...');

     gotoxy(30,13);

     write('Описание данных');

     gotoxy(30,14);

     write('Алгоритмы и блок-схемы');

     gotoxy(30,15);

     write('ПРОГРАММА');

     gotoxy(30,16);

     write('Текстовые примеры');

     gotoxy(30,17);

     write('Руководство пользователю');

     gotoxy(30,18);

     write('Заключение');

     gotoxy(30,19);

     write('Список литературы');{Это всё менюшка}

     gotoxy(26,10);

     write('>>>');

     gotoxy(25,10);

     repeat

           a:=readkey;

           if a=chr(80) then begin{движение курсора вниз}

                                   b:=wherey;

                                   gotoxy(26,b);

                                   write('   ');

                                   if b>=19 then b:=9;

                                   gotoxy(26,b+1);

                                   write('>>>');

                                   gotoxy(25,b+1);

                                   sound(3000);

                                   delay(1000);

                                   nosound;

                              end;

           if a=chr(72) then begin{движение курсора вверх}

                                   b:=wherey;

                                   gotoxy(26,b);

                                   write('   ');

                                   if b<=10 then b:=20;

                                   gotoxy(26,b-1);

                                   write('>>>');

                                   gotoxy(25,b-1);

                                   sound(4000);

                                   delay(1000);

                                   nosound;

                              end;

           if a=chr(13) then begin {Опрос клавиши ENTER}

                              b:=wherey;

                              if b=19 then begin  {Список литературы}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Книжка по Турбо-Паскалю');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                              if b=10 then begin {Введение}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                               writeln('Основной целью данного курсового проекта');

                                           gotoxy(30,b+1);

                                writeln('является закрепление и демонстрация знаний,');

                                           gotoxy(30,b+2);

                                writeln('полученых при изучении курса информатики');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                              if b=11 then begin  {Постановка задачи}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Сделать игру: леталку-стрелялку');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                              if b=18 then begin  {Заключение}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Мне понравилась моя прога   :-)');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                              if b=17 then begin  {руководство пользователю}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                        write('Если Вы в этой проге ничего не поменяете');

                                           gotoxy(30,b+1);

                                           write('она будет работать ВЕЧНО...');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                               if b=12 then begin  {математические методы}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Задача сама по себе не математическая,');

                                           gotoxy(30,b+1);

                                 write('значит и математических методов никаких нет');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                                if b=13 then begin  {Описание данных}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Данных нет...');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                                 if b=14 then begin  {Алгоритм.блок-схема}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Смотри Пояснителную записку');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                                  if b=16 then begin  {Текстовые примеры}

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           clrscr;

                                           gotoxy(30,b);

                                           write('Текстовых примеров у меня тоже нет');

                                           repeat

                                                 a:=readkey;

                                           until a=chr(13);

                                           sound(4000);

                                           delay(1000);

                                           nosound;

                                           goto 1;

                                           end;

                                  if b=15 then begin

                                           sound(3000);

                                           delay(1000);

                                           nosound;

                                           jim;

                                           closegraph;

                                           goto 1;

                                           end;

                              end;

     until a=chr(27);

end.

4 Руководство пользователя для работы в программе.

При запуске программы появляется меню, предлагающее широкий выбор пунктов.

Курсор перемещается при помощи клавиш курсора, выбор осуществляется клавишей ENTER .

При выборе какого-либо пункта меню появляется соответствующее сообщение, однако же, при выборе пункта «Программа» запускается непосредственно сама игра.

Суть игры заключается в сбивании летающих тарелок средством ПВО.

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

Игрок проигрывает в случае достижения числа не сбитых тарелок правого края экрана.

Игрок выигрывает в случае достижения числа сбитых тарелок правого края экрана.

После проигрыша либо выигрыша игра повторяется.

Заключение.

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

Длителен также процесс детальной прорисовки графики.

Необходимо, чтобы в той папке, где лежит данная программа, находился файл egavga.bgi . Этот файл имеется во многих версиях ТР в папке bin, он отвечает за инициализацию графики.

Список использованной литературы.

1 Меженный О.А. «Turbo Pascal-учитесь программировать»;Москва-С.Петербург-Киев; «Диалектика»;2001;448с.

2 Бабушкин И.А.; «Практикум по ТР»-учебное пособие по курсам ИВТ; Москва, 1998.

3 http://www.freepascal.org;

4 http://www.geocities.com/~franzglaser/tp.php;

5 http://www.garbo.uwasa.fi/pc/turboobj.php;