Разработка программной игры "баскетбол"
Министерство образования Российской Федерации
КРАСНОЯРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
Кафедра
КУРСОВАЯ РАБОТА
Красноярск 2002
Содержание
1 Задание к проекту
2 Описание программы
Укрупненный алгоритм
Таблица идентификаторов
Описание процедур и функций
Алгоритм
Контрольные примеры
Текст программы
1 Задание к проекту
Необходимо написать программу - игру баскетбол. Должены быть упрощенно изображены баскетбольный щит и игрок. Необходимо, чтобы можно было изменять положение игрока, направление бросока и его силу.
программа компьютерная игра алгоритм
2 Описание программы
Так как программа использует графический режим, то для ее корректной работы в папке, где находится basket.exe должен находиться и файл egavga.bgi, иначе будет выводиться сообщение об ошибке инициализации графики.
При помощи клавиатуры играющий может перемещать игрока вправо или влево, изменять направление броска.
Управление:
A - движение игрока влево
D - движение игрока вправо
W - увеличение угла броска
S - уменьшение угла броска
SPACE - режим броска, бросок
После нажатия на SPACE включается режим броска. В левом верхнем углу экрана появится прямоугольник, показывающий силу броска. Сила броска будет циклически изменяться от 0 до максимума. Чем больше высота прямоугольника, тем сильнее получится бросок. Максимальная сила отмечена чертой. Для совершения броска необходимо в нужный момент еще раз нажать SPACE. Затем можно увидеть полет мяча. Только после этого режим броска выключается.
В этом режиме нельзя передвигать игрока или изменять направление броска.
3 Укрупненный алгоритм
Таблица идентификаторов
Имя переменнойТипНазначениеgrdriverintegerСлужебные переменные для включения и настройки графического режимаgrmodeintegererrcodeintegerxintegerПоложение игрокаxprevintegerПредыдущее положение игрокаstepintegerШаг игрокаradiusintegerРадиус мячаhandxintegerКоордината мяча и руки по оси xhandyintegerКоордината мяча и руки по оси yvintegerСкорость мячаdelay1integerЗадержкаchangeintegerБыла ли нажата клавишаangleReal Направление руки (броска)angleprevRealПредыдущее Направление руки anglestepRealИзменение направления рукиkeyCharВведенная клавишаycrealКоордината мяча по оси yiintegerСчетчикdirectionintegerНаправление полета мячаhandintegerВременная переменнаяgoalintegerБыл ли голyrealКоордината мяча по оси yyprealПредыдущая координата мяча по оси yvxrealСкокость мяча по оси xvyrealСкокость мяча по оси ydistancerealРасстояние от мяча до угла кольцаkrealБыл ли удар мяча об кольцоk1realВременные переменныеtmpRealtmp1Realtmp2Real
5 Описание процедур и функций
Процедура showbasket - Процедура, рисующая баскетбольный щит.
Функция findy(x:real;y:real;vx:real;vy:real):real - Функция нахождения координаты мяча по оси y.
Процедура showplayer(x:integer;angle:real) - Процедура, рисующая игрока.
Процедра shot(x:integer;angle:real) - Процедура "Бросок мяча".
6 Алгоритм
Программа basketball
Подключение библиотек crt,graph
Переменные:
grdriver,grmode,errcode,x,xprev,step,radius:integer
handx,handy,v,delay1,change:integer
angle,angleprev,anglestep:real
key:char
процедура showbasket
начало
переместить перо в (130,100)
провести линию в(135,100)
провести линию в(135,230)
провести линию в(130,230)
провести линию в(130,100)
переместить перо в (130,150)
провести линию в(85,175)
провести линию в(35,250)
провести линию в(5,460)
провести линию в(60,280)
провести линию в(85,175)
переместить перо в (130,190)
провести линию в(90,215)
провести линию в(60,280)
провести линию в(65,460)
провести линию в(35,250)
провести линию в(90,215)
провести линию в(85,175)
провести линию в(130,190)
провести линию из (0,460) в (639,460)
переместить перо в (135,190)
провести линию в(185,190)
провести линию в(185,192)
провести линию в(135,192)
конец
функция вызов findy(x:realy:realvx:realvy:real):real
Переменные yc:real
начало
yc=y-vy/sqrt(v*v+0.0001)
возврат yc из функции
конец
процедура showplayer(x:integerangle:real)
начало
нарисовать эллипс (x,350,0,360,23,40)
провести линию из (x-10,385) в (x-20,459)
провести линию из (x+10,385) в (x+20,459)
нарисовать окружность в точке (x,297) с радиусом 13
handx=x-округление(60*cos(angle))
handy=297+округление(60*sin(angle))
провести линию из (x,330) в (handx,handy)
конец
процедура shot(x:integerangle:real)
Переменные,direction,hand,goal:integer
y,yp,vx,vy,distance,k,k1,tmp,tmp1,tmp2:real
начало
goal=0
i=1
v=0
hand=handx
yp=handy
Закрасить прямоугольник (550,20,600,40) черным
пока не нажата клавиша делать
начало
если v<50 то v=v+1
иначе v=0
провести линию из (10,100) в (20,100)
Закрасить прямоугольник (10,50,20,50+v) белым
Задержка(delay1*10)
Закрасить прямоугольник (10,50,20,50+v) черным
Конец
цвет пера - черный
нарисовать окружность в точке(hand,округление(yp))
с радиусом radius
цвет пера - белый
vy=-модуль(v)*синус(angle)*7
vx=v*косинус(angle)
yp=вызов findy(handx,yp,vx,vy)
direction=1
k1=0
для i от 0 до 800 делать
начало
tmp=hand-direction*(i-1)
цвет пера - черный
нарисовать окружность в точке(округление(tmp),
округление(yp)) с радиусом radius
если handx-i<=135+radius и handx-i>=135+radius
и yp<230 и yp>100 то
начало
если direction=1 то hand=handx-i-i
direction=-1
конец
vy=vy-10.0/модуль(vx)=модуль(handx-i-185)
tmp2=модуль(yp-190)
если tmp1<160 и tmp2<160 то
distance=корень(tmp1*tmp1+tmp2*tmp2)
иначе distance=radius+10
если distance<=radius и k=0 то
начало
k1=арктангенс((190-yp)/
(185-handx+i+0.0000000001))
k1=(k1-арктангенс(vy/vx))*2+k1
vy=синус(k1)*v
vx=косинус(k1)*v
k=1
конец
иначе k=0=вызов findy(handx-i/10,yp,vx,vy)
цвет пера - белый
если tmp>135 и tmp<185 и yp<=190 и y>190 то
начало
Закрасить прямоугольник
(550,20,600,40) черным
Переместить перо в (550,30)
Написать 'goal'=1
конец
если y<460-radius и y>-50 и handx-i>radius то
начало
нарисовать окружность в точке
(hand-i*direction,округление(y))
с радиусом radius
вызвать процедуру showbasket
вызвать процедуру showplayer(x,angle)
yp=y
Задержка (delay1)
конец
иначе break
конец
если goal=0 то
начало
Закрасить прямоугольник (550,20,600,40) черным
Переместить перо в (550,30)
Написать 'miss'
Конец
цвет пера - черный
нарисовать окружность в точке
(handx-i,округление(yp)) с радиусом radius
цвет пера - белый
нарисовать окружность в точке(handx,handy)
с радиусом radius
конец
начало
grdriver=detect
включить графический режим
initgraph(grdriver,grmode,' ')
errcode=graphresult
delay1=200
если errcode=grok то
начало
radius=14
xprev=400
x=xprev
angleprev=pi/18
angle=angleprev
anglestep=pi/72
step=5
вызвать процедуру showbasket
вызвать процедуру showplayer(xprev,angleprev)
нарисовать окружность в точке(handx,handy)
с радиусом radius
пока key<>ESC делать
начало
Считываем key
change=1
если key='a' и xprev>300 то x=xprev-step
иначе если key='d' и xprev<600 то
x=xprev+step
иначе если key='s' то
начало
если angle<0.5 то
angle=angleprev+anglestep
конец
иначе если key='w' то
начало
если angle>-0.5 то
angle=angleprev-anglestep
конец
иначе если key=' ' то
начало
Вызвать shot(x,angle) change=0
Конец
иначе change=0
если change=1 то
начало
Цвет пера - черный
вызвать процедуру showplayer(xprev,angleprev)
нарисовать окружность в точке (handx,handy) с радиусом radius
Цвет пера - белый
вызвать процедуру showplayer(x,angle)
нарисовать окружность в точке (handx,handy) с радиусом radius
xprev=x
angleprev=angle
конец
конец
выключаем графический режим
конец
иначе написать 'Graphics error:', grapherrormsg(errcode)
конец
Контрольные примеры
8 Текст программы
program basketball;graph,crt;{Подключение графической библитоеки и библиотеки ввода/вывода}
var
grdriver,grmode,errcode:integer;
{Переменные для выбора графического режима}
x,xprev,step:integer;
{Текущая и предыдущая координаты игрока, шаг игрока}
radius:integer;{Радиус мяча}
angle,angleprev,anglestep:real;{Угол наклона
руки(текущий, предыдущий), шаг изменения угла}
key:char; {Нажатая клавиша}
change:integer; {Индикатор была ли нажата клавиша}
handx,handy,v:integer; {Координаты руки, скорость мяча}
delay1:integer; {Задержка для вывода на экран}showbasket;
{Процедура, рисующая баскетбольный щит с корзиной}
moveto(130,100); {Переводим перо в точку}
lineto(135,100); {Рисуем линию до точки}
lineto(135,230);
lineto(130,230);
lineto(130,100);
moveto(130,150);
lineto(85,175);
lineto(35,250);
lineto(5,460);
lineto(60,280);
lineto(85,175);
moveto(130,190);
lineto(90,215);
lineto(60,280);
lineto(65,460);
lineto(35,250);
lineto(90,215);
lineto(85,175);
lineto(130,190);
moveto(135,190);
lineto(185,190);
lineto(185,192);
lineto(135,192);
line(0,460,639,460); {Рисуем пол};findy(x:real;y:real;vx:real;vy:real):real;
{Функция нахождения координаты мяча по оси y}yc:real; {Координаты мяча по оси y}
begin
yc:=y-vy/sqrt(v*v+0.0001);
{Вычисляем координату мяча}
findy:=yc; {Возврат из функции};showplayer(x:integer;angle:real);
{Процедура, рисующая игрока}
ellipse(x,350,0,360,23,40);{Рисуем туловище}
line(x-10,385,x-20,459); {Рисуем }
line(x+10,385,x+20,459); {ноги}
circle(x,297,13); {Рисуем голову}
handx:=x-round(60*cos(angle)); {Вычисляем положение}
handy:=297+round(60*sin(angle));{руки}
line(x,330,handx,handy); {Рисуем руки};shot(x:integer;angle:real);
{Процедура "Бросок мяча"}i,direction,hand,goal:integer;{Перменные цикла,
направления, начальной точки мяча, показатель был ли гол}
y,yp,vx,vy:real;
{Текущая и предыдущая координаты мяча, скорости мяча по осям x, y},k1:real;{Расстояние от мяча до "угла" корзины, угол движения мяча}
tmp,tmp1,tmp2,k:real;{Временные прерменные}
begin
goal:=0; {Начальная}
i:=1; {}
v:=0; {}
hand:=handx; {установка}
yp:=handy; {}
direction:=1; {}
k:=0; {}
yp:=handy; {переменных}
SetFillStyle(1,0); {Затираем место,где появляется}
Bar(550,20,600,40); {результат броска}
while not keypressed do {Пока не нажата клавиша}
begin
if (v<50) then v:=v+1 {Рисуем}
else v:=0; {}
line(10,100,20,100); {динамический}
SetFillStyle(1,15); {}
Bar(10,50,20,50+v); {индикатор}
delay(delay1*10); {}
SetFillStyle(1,0); {}
Bar(10,50,20,50+v); {силы броска}
end;
readkey; {Ждем нажатия клавиши}
setcolor(0); {Устанавливаем цвет пера в черный}
circle(handx,round(yp),radius);{Закрашиваем мяч}
setcolor(15); {Устанавливаем цвет пера в белый}
vy:=abs(v)*sin(-angle)*7;{Считаем компоненты}
vx:=v*cos(angle); {вектора скорости по осям}
for i:=0 to 800 do
begin
tmp:=hand-direction*(i-1);
setcolor(0);{Устанавливаем цвет прера в черный}
circle(round(tmp),round(yp),radius);
{Закрашиваем мяч}
if (handx-i<=135+radius) and
(handx-i>=135+radius) and (yp<230) and (yp>100) then {Если мяч ударяется об щит}
begin
if (direction=1) then :=handx-i-i;{Изменяем аправление}
direction:=-1; {движения}
end;
vy:=vy-10.0/abs(vx);
{Пересчитываем скорость по оси y(притяжение)}
tmp1:=abs(handx-i-185); {Считаем}
tmp2:=abs(yp-190); {расстояние}
if (tmp1<160) and (tmp2<160) then {от мяча до}
distance:=sqrt(tmp1*tmp1+tmp2*tmp2){"угла"}
else distance:=radius+10; {корзины}
if (distance<=radius) and (k=0) then
{Если мяч ударяется об "угол" корзины, и мы это
еще не учитывали}
begin
k1:=arctan((190-yp)/
(185-handx+i+0.0000000001));
k1:=(k1-arctan(vy/vx))*2+k1;
vy:=sin(k1)*v; {Пересчитываем}
vx:=cos(k1)*v; {скорость мяча}
k:=1;
end
else k:=0;
y:=findy(handx-i/10,yp,vx,vy);
{Считаем следуюшую координату мяча по оси y}
setcolor(15);{Устанавливаем цвет прера в белый}
if (tmp>135) and (tmp<185) and (yp<=190) (y>190) then
begin
SetFillStyle(1,0); {Затираем}
Bar(550,20,600,40);{Затираем}
MoveTo(550,30); {надписью}
OutText('goal'); {Пишем 'goal'}
goal:=1; {устанавливаем, что гол был}
end;
if (y<(460-radius)) and (y>-50)
and (handx-i>radius) then
{Если мяч находится на территории площадки}
begin
circle(hand-i*direction,round(y),radius);
showbasket;
{Рисуем баскетбольный щит с корзиной}
showplayer(x,angle);{Рисуем игрока}
yp:=y;
delay(delay1); {Задержка}
end
else break; {Выходим из цикла полета мяча}
end;
if (goal=0) then {Если гола не было}
begin
SetFillStyle(1,0); {Затираем}
Bar(550,20,600,40); {место с}
MoveTo(550,30); {надписью}
OutText('miss'); {Пишем 'miss'}
end;
setcolor(0); {Устанавливаем цвет прера в черный}
circle(handx-i,round(yp),radius);{Закрашиваем мяч}
setcolor(15);
{Устанавливаем цвет прера в черный белый}
circle(handx,handy,radius); {Рисуем мяч};
grdriver:=detect; {Инициализация}
initgraph(grdriver,grmode,' ');{графического}
errcode:=graphresult; {режима}
delay1:=200;
{Установка задержки(если прграмма работает медленно
(слабый компьютер) ее нужно уменьшить)}
if errcode=grok then {если нет ошибки в графике}
begin
radius:=14; {Начальная}
xprev:=400; {установка}
x:=xprev; {переменных}
angleprev:=pi/18; {объявленных}
angle:=angleprev; {в}
anglestep:=pi/72; {начале}
step:=5; {программы}
showbasket;
{Рисуем баскетбольный щит с корзиной}
showplayer(xprev,angleprev);{Рисуем игрока}
circle(handx,handy,radius); {Рисуем мяч}
while (key<>#27) do {Пока не была нажата ESC}
begin
key:=readkey;{Считываем нажатую клавишу}
change:=1;
if (key='a') and (xprev>300) then
x:=xprev-step
{Движение игрока влево}
else if (key='d') and (xprev<600) then
x:=xprev+step
{Движение игрока вправо}
else if (key='s') then
begin
if (angle<0.5) then
angle:=angleprev+anglestep
{Опускаем руку}
end
else if (key='w') then
begin
if (angle>-0.5)
then
angle:=angleprev-
anglestep
{Опускаем руку}
end
else if (key=' ') then
begin
shot(x,angle);
{Осуществляем бросок}
change:=0;
end
else change:=0;
if (change=1) then
{Если игрок двинулся или повернул руку}
begin
SetColor(0);
{Устанавливаем цвет прера в черный}
showplayer(xprev,angleprev);
{Закрашиваем игрока}
circle(handx,handy,radius); {Закрашиваем мяч}
setcolor(15);
{Устанавливаем цвет прера в белый}
showplayer(x,angle);{Рисуем игрока}
circle(handx,handy,radius);
{Рисуем Мяч}
xprev:=x;
angleprev:=angle;
end
end;
closegraph;{Выключаем графический пежим}
end
else writeln('Graphics error:',
grapherrormsg(errcode));
{Пишем сооющение об ошибке инициализации графики}.
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Диплом
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ