Разработка программной игры "баскетбол"
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
-direction*(i-1)
цвет пера - черный
нарисовать окружность в точке(округление(tmp),
округление(yp)) с радиусом radius
если handx-i=135+radius
и yp100 то
начало
если 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 и tmp190 то
начало
Закрасить прямоугольник
(550,20,600,40) черным
Переместить перо в (550,30)
Написать 'goal'=1
конец
если yradius то
начало
нарисовать окружность в точке
(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 (yp100) 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 {от мяч