Автор работы: Пользователь скрыл имя, 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
Разрешение ошибки 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,
sg,sg1,sg2,Sspeed,sstop:
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:
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
end;
seek(f2,0);
repeat
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
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;
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:
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+
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],
FloodFill(455,KO[j-1],
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);