Создание игровой программы “Теннис”

Автор работы: Пользователь скрыл имя, 26 Июня 2013 в 07:59, курсовая работа

Краткое описание

Данное программное средство (ПС) разработано и составлено в рамках задания курсовой работы, дисциплины технологии программирования.
ПС представляет собой спортивный симулятор , имитирующий игру в теннис
Программа должна обеспечивать возможность выполнения следующих функций:
o Однопользовательскую / многопользовательскую игру;
o Игра в режиме турнир
o Изменение скорости подачи мяча, а так же количества забитых мячей необходимых для победы.

Содержание

1. Постановка задачи и определение основных требований к разрабатываемому программному обеспечению 3
1.1. Основание для разработки 3
1.2. Назначение программного средства «Теннис» 3
1.3. Требования к программному средству 3
1.3.1. Требования к функциональным характеристикам. 3
1.3.2. Требования к надежности 3
1.3.3. Требования к условиям эксплуатации 3
1.3.4. Требования к составу и параметрам технических средств 3
1.3.5. Требования к информационно-программной совместимости 4
2. Проектирование программного средства и программная реализация 4
2.1. Разработка структурной схемы программ 4
2.2. Разработка модульной структуры программы 5
2.3. Разработка алгоритмов программы (блок-схемы) 6
2.3.1. Блок-схемы алгоритмов модуля MainMenu 7
2.3.2. Блок-схемы алгоритмов модуля GAME: 10
2.4. Описание структур, типов данных и глобальных переменных 15
2.4.1. Переменные, используемые в основной программе: 15
2.4.2. Типы переменных, используемые модулем MainMenu. 16
2.4.3. Переменные, используемые модулем MainMenu: 16
2.4.4. Типы переменных, используемые модулем GAME. 16
2.5. Описание процедур и функций 19
2.5.1. Процедуры и функции модуля MainMenu: 19
2.5.2. Процедуры и функции модуля GAME: 19
3. Тестирование и отладка программного средства. 20
3.1. Перечень ошибок, обнаруженных в ходе отладки ПС 20
3.2. Пути решения выявленных ошибок 20
Приложение 1 Руководство пользователю 21
Приложение 2 Текст программы 23

Вложенные файлы: 1 файл

Отчет к курсовому проекту.docx

— 1.40 Мб (Скачать файл)
    1. При нажатии двух клавиш единовременно, в режиме многопользовательской игре, ни одна из ракеток не перемещается.
    2. В режиме турнира, заливка на последнем элементе попадает на фон, таким образом нарушается заливка необходимых приметивов.
    1. Пути решения выявленных ошибок

Разрешение ошибки a): наложить дополнительные условия на перемещение одной из табличек в зависимости от положения мяча.

Разрешение ошибки b): пересчитать координаты смещения.

 

Приложение 1  Руководство пользователю

Навигация по меню

При запуске  программы появляется главное меню, которое представленное на Рисунок 19 . Перемещение и выбор необходимого подменю по меню осуществляется при помощи стрелок: ↑↓→ соответственно, активный пункт меню имеет красный индикатор, остальные желтый.

  

Рисунок 18  Выбор режима игры человек/компьютер (в данный момент установлен режим многопользовательской игры)

Рисунок 19  Главное меню, актина кнопка «игра»

Регулировать настройки игры можно  при помощи подменю параметры, в  нем можно регулировать скорость игры, количество набранных  очков  для победы. Так же можно выбрать  режим игры: против человека/компьютера; Режим игры отображается при помощи зависимого переключателя Рисунок 18. Выбранные вами параметры возможно изменять от игры к игре, для этого необходимо возвращаться в подменю «Параметры»

Выйти из любого подменю можно при помощи клавиши пробел.

 

 

 

 

 

Процесс игры

Рисунок 20 Окно игры (слева), сообщение пользователю, упустившему мяч

В режиме игры против компьютера, можно потренироваться перед турниром или многопользовательской игрой. В случае если мяч упущен выводиться сообщение P.S. В данном режиме компьютер не проигрывает.В режиме игры против человека управление ведется при помощи стрелок ↑↓ для правой площадки, кнопками “w” и ”s” для левой для левой площадки соответственно. Что бы вернуться в главное меню нужно нажать на кнопку пробел.

 

Рисунок 21 Окно программы в режиме «турнир»


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


 

 

Выход из игры производится из главного меню, при переходе на кнопке «выход».

 

Приложение 2 Текст программы

unit GAME;

interface

 uses GraphABC,Events,Utils;

 type con=array[1..4]of integer;

      gamer=array [1..2,1..3]of integer;

 var pr,px,py,kx,ky,ku,pc,pctab,speed,stop: integer;

     sg,sg1,sg2,Sspeed,sstop:string;

     k1,k2,ups,ups2:byte;

     kl,back,change,run:boolean;

     x:con;

     a:gamer;

     f1:file of con;

     f2:file of string;

procedure load;

procedure buttonclick4(key:integer);

procedure buttonclick3(key:integer);

procedure Option;

procedure KeyDown(Key: integer);

procedure Pm;

procedure Pm1(s:string);

procedure Pm2(s:string);

procedure multiplayer(speed,stop:integer;s1,s2:string);

procedure gametennis(speed,stop:integer);

Implementation

procedure buttonclick4(key:integer);

begin

  case Key of

VK_Up: if ups2>0 then ups2:=ups2-1;

VK_Down: if ups2<(filesize(f2)-1) then ups2:=ups2+1;

VK_Right: begin

           run:=true; back:=true;

          end;

VK_Space: back:=true;

   end;

   end;

{------------------------------------------}

procedure load;

var b,q,qq:integer;

    i,k:byte;

    s,S1,S2,s3,s4:string;

    x:con;

begin

  back:=false;

  assign(f1,'mytest.data');

  assign(f2,'mynameis.data');

  Reset(f2);

  Reset(f1);

  clearwindow(claqua);

  SetBrushColor(claqua);

  SetFontSize(30);

  textout(200,50,'ACCOUNTS');

  SetFontSize(15);

  if filesize(f2)<>0 then

   begin

     b:=300 div filesize(f2);//êîýôôèöèåíò ðàññòîÿíèÿ ïëîòíîñòè

     k:=filesize(f2)-1;//ïîñëåäíèé áëîê

     SetPenColor(clSilver);

                           for i:=0 to k do

                               begin

                                SetPenColor(clGray);

                                Rectangle(75,100+i*b+30,525,150+i*b+30);

                                floodfill(110,100+i*b+31,clSilver);

                                SetBrushColor(clSilver);

                                Circle(50,125+i*b+30,10);

                                read(f2,s);

                                read(f1,x);

                                str(x[3],s1);

                                str(x[4],s2);

                                SetFontColor(clNavy);

                                textout(85,100+i*b+40,'Name:');

                                textout(280,100+i*b+40,'Gemes:');

                                textout(430,100+i*b+40,'Win:');

                                SetFontColor(clMaroon);

                                textout(160,100+i*b+40,s);

                                textout(375,100+i*b+40,s1);

                                textout(490,100+i*b+40,s2);

                               end;

                               seek(f2,0);

                             repeat

                                 OnKeyDown:= buttonclick4;

                                   if ups2=0 then

                                       begin

                                         floodfill(51,125+ups2*b+31,clRed);

                                         floodfill(51,125+(ups2+1)*b+31,clSilver);

                                        end;

                                    if ups2=k then begin

                                         floodfill(51,125+ups2*b+31,clRed);

                                         floodfill(51,125+(ups2-1)*b+31,clSilver);

                                                   end;

                                     if (ups2>0) and (ups2<k) then begin

                                        floodfill(51,125+(ups2+1)*b+31,clSilver);

                                        floodfill(51,125+ups2*b+31,clRed);

                                        floodfill(51,125+(ups2-1)*b+31,clSilver);

                                                                     end;

                           until back ;

     if run then

          begin

               seek(f2,ups2);

               read(f2,s3);

               seek(f2,ups2+1);

               read(f2,s4);

             seek(f1,ups2);

             read(f1,x);

             x[3]:=x[3]+1;

             write(f1,x);

             seek(f1,ups2+1);

             read(f1,x);

             x[3]:=x[3]+1;

             write(f1,x);

             setpencolor(clblack);

             multiplayer(speed,stop,s3,s4);

                  if k1>k2 then

                   begin

                     seek(f1,ups2);

                     read(f1,x);

                     x[4]:=x[4]+1;

                     write(f1,x);

                   end

                  else

                    begin

                     seek(f1,ups2+1);

                     read(f1,x);

                     x[4]:=x[4]+1;

                     write(f1,x);

                  end;

          end;

    end

   else textout(200,225,'Ôàéë ïóñò èëè íå íàéäåí!');

   sleep(1500);

   close(f1);

   close(f2);

   ups:=0;

end;

{------------------------------------------}

procedure buttonclick3(key:integer);

begin

  case Key of

VK_Up: if ups>0 then ups:=ups-1;

VK_Down: if ups<2 then ups:=ups+1;

VK_right: case ups of

                2: if speed > 3 then speed:=speed-1;

                1: if stop < 9 then inc(stop);

                0: if change then change:=false;

             end;

VK_left:  case ups of

                2: if speed < 7 then inc(speed);

                1: if stop >1  then dec(stop);

                0: if not(change) then change:=true;

             end;

VK_Space: back:=true;

   end;

end;

{------------------------------------------}

procedure option;

begin

ClearWindow(clAqua);

SetBrushColor(clAqua);

SetFontSize(40);

TextOut(120,25,'ÏÀÐÀÌÅÒÐÛ');

 

SetFontSize(15);

SetBrushColor(clSilver);

 

Rectangle(150,150,450,200);

floodfill(160,175,clSilver);

textout(155,160,'COMP               HUMAN');

 

Rectangle(150,250,450,300);

floodfill(160,275,clSilver);

textout(155,260,'ÈÃÐÀÒÜ ÄΠ           Î×ÊÎÂ');

 

Rectangle(150,350,450,400);

floodfill(160,370,clSilver);

textout(155,360,'ÑÊÎÐÎÑÒÜ');

 

SetBrushColor(claqua);

Circle(125,175,10);

Circle(125,275,10);

Circle(125,375,10);

setpencolor(clblack);

SetBrushColor(clSilver);

UPS:=0; back:=false;

repeat

  OnKeyDown:=buttonclick3;

      if (ups=0) then

       begin

        floodfill(125,175,clwhite);

        floodfill(125,275,claqua);

       end;

       if ups=1 then

        begin

          floodfill(125,175,claqua);

          floodfill(125,275,clwhite);

          floodfill(125,375,claqua);

        end;

       if ups =2 then

         begin

          floodfill(125,375,clwhite);

          floodfill(125,275,claqua);

         end;

                                          if change then begin

                                          Circle(250,172,5);

                                          floodfill(250,172,clwhite);

                                          floodfill(400,172,clSilver);

                                                          end

                                          else           begin

                                          Circle(400,172,5);

                                          floodfill(400,172,clwhite);

                                          floodfill(250,172,clSilver);

                                                                      end;

 str(stop,sstop);

 textout(300,260,sstop);

 str(abs(speed-8),sspeed);

 textout(375,360,sspeed);

 sleep(25);

until back;

  ups:=0;

end;

{------------------------------------------}

procedure KeyDown(Key: integer);

begin

  case Key of

       VK_Up: if (pr>10) then pr:=pr-10;

       VK_Down: if (pr<490) then pr:=pr+10;

       VK_left: kl:=true;

       ord('W'): if (pctab>10)and change then pctab:=pctab-10;

       ord('S'): if (pctab <490)and change then pctab:=pctab+10;

       end;

end;

{------------------------------------------}

procedure Pm;

begin

if px<10 then kx:=kx*(-1);

if (py<10) or (py>490) then ky:=ky*(-1);

if px>590 then

   if (py>pr-20) and (py<pr+20) then kx:=kx*(-1)

   else

   begin

    showmessage('Âû óïóñòèëè ìÿ÷èê!');

    inc(ku);

    px:=15;

    py:=250;

   end;

px:=px+kx;

py:=py+ky;

end;

 

{------------------------------------------}

procedure Pm1(s:string);

begin

if (py<10) or (py>490) then ky:=ky*(-1);

if px>590 then

   if (py>pr-20) and (py<pr+20) then kx:=kx*(-1) else

   begin

   showmessage(s);

   k1:=k1+1;

   px:=590;

   py:=250;

   pr:=250;

   pctab:=250;

   end;

px:=px+kx;

py:=py+ky;

end;

{------------------------------------------}

procedure Pm2(s:string);

begin

if px<10 then

   if (py>pctab-20) and (py<pctab+20) then kx:=kx*(-1) else

   begin

   showmessage(s);

   k2:=k2+1;

   pctab:=250;

   px:=15;

   py:=250;

   pr:=250;

   end;

end;

{------------------------------------------}

procedure multiplayer(speed,stop:integer; s1,s2:string);

begin

lockdrawing;

centerwindow;

setwindowsize(600,500);

kx:=1; ky:=1; px:=15; py:=250; pr:=250; pctab:=250;

k1:=0;

K2:=0;

repeat

  clearwindow;

  setbrushcolor(clgreen);

  rectangle(5,5,595,495);

  Pm1('Упустил мяч игрок '+s1);

  Pm2(''Упустил мяч игрок '+s2);

  setbrushcolor(clwhite);

  circle(px,py,10);

  OnKeyDown:=KeyDown;

  pc:=py;

  setbrushcolor(clblack);

  rectangle(592,pr-20,597,pr+20);

  rectangle(3,pctab-20,8,pctab+20);

  sleep(speed);  

  str(k2,sg2);

  str(k1,sg1);

  SetBrushColor(clgreen);

  SetFontColor(clLime);

  textout(150,50,sg1);

  textout(450,50,sg2);

  redraw;

until (k1=stop)or(k2=stop);

 sg:='Geme over    '+sg1+' : '+sg2;

   showmessage(sg);

end;

{------------------------------------------}

procedure gametennis(speed,stop:integer);

 

begin

kl:=false;

lockdrawing;

setwindowsize(600,500);

kx:=1; ky:=1; px:=15; py:=250; pr:=250;

repeat

  clearwindow;

  setbrushcolor(clgreen);

  rectangle(5,5,595,495);

  Pm;

  setbrushcolor(clwhite);

  circle(px,py,10);

  OnKeyDown:=KeyDown;

  pc:=py;

  setbrushcolor(clblack);

  rectangle(592,pr-20,597,pr+20);

  rectangle(3,pc-20,8,pc+20);

  sleep(speed);

  redraw;

until (ku=stop)or kl;

end;

{------------------------------------------}

 

 

end.

 

unit MainMenu;

interface

 uses GraphABC,Events;

 type svitch=array[1..5] of integer;

 var  a,b,j,mt:integer;

      KO:svitch;

procedure menu;

 procedure buttonclick(Key: integer);

 procedure move;

procedure buttonclick2(Key: integer);

 procedure help(S:string);

Implementation

 procedure menu;

 var H:Byte;

    y1,y2:integer;

begin

setpencolor(clBlack);

ClearWindow(clAqua);

SetBrushColor(clNavy);

SetPenWidth(1);

Line(75,0,75,500);

Line(525,0,525,500);

Line(0,100,600,100);

SetBrushColor(clAqua);

SetFontStyle(fsBold);

SetFontSize(40);

SetFontColor(clPurple);

TextOut(195,25,'ÒÅÍÍÈÑ');

  SetFontSize(20);

  SetFontColor(clSilver);

  Rectangle(100,125,500,173);

  FloodFill(110,126,clMedGray);

  Circle(450,147,10);

  KO[1]:=147;

  FloodFill(451,147,clYellow);

  y1:=125;

  y2:=173;

     for H:=2 to 5 do

      begin

       SetFontColor(clSilver);

       y1:=y1+73;

       y2:=y2+73;

       Rectangle(100,y1,500,y2);

       FloodFill(115,(y1+y2)div 2,clMedGray);

       Circle(450,(y1+y2)div 2,10);

       FloodFill(455,(y1+y2)div 2,clYellow);

       KO[H]:=(y1+y2)div 2;

      end;

  SetBrushColor(clMedGray);

  SetFontColor(clPurple);

  TextOut(150,130,'ИГРА');

  TextOut(150,203,'ТУРНИР');

  TextOut(150,275,'ПАРАМЕТРЫ');

  TextOut(150,350,'ПОМОЩь');

  TextOut(150,425,'ВЫХОД');

end;

{------------------------------------------------}

procedure buttonclick(Key: integer);

begin

  case Key of

VK_Up: if a>1 then a:=a-1

       else a:=5;

VK_Down: if a<5 then a:=a+1

         else a:=1;

VK_RIGHT: b:=3;

   end;

end;

{------------------------------------------------}

procedure move;

begin

setwindowsize(600,500);

menu;

b:=5;

a:=1;

repeat

    OnKeyDown:=buttonclick;

    j:=a;

    FloodFill(455,KO[j],clRed);

    if (j<>5) and (j<>1) then

       begin

        FloodFill(455,KO[j+1],clYellow);

        FloodFill(455,KO[j-1],clYellow);

       end;

    if j=5 then

       begin

         FloodFill(455,KO[4],clyellow);

         FloodFill(455,KO[1],clyellow);

       end;

    if j=1 then

       begin

         FloodFill(455,KO[2],clyellow);

         FloodFill(455,KO[5],clyellow);

       end;

    sleep(15);

    redraw;

until b=3;

 end;

{------------------------------------------------}

procedure buttonclick2(key:integer);

begin

  case Key of

VK_left:  if a>0 then a:=a-1;

VK_right: if a<3 then a:=a+1;

VK_space: b:=1;

   end;

end;

{--------------------------------------}

procedure help(S:string); begin

ClearWindow(clAqua);

SetBrushColor(clAqua);

SetFontSize(40);

TextOut(225,25,'HELP');

Rectangle(45,125,170,175);

Информация о работе Создание игровой программы “Теннис”