Разработка программной игры "баскетбол"

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



-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 {от мяч