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

 

Министерство образования Российской Федерации

КРАСНОЯРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ

УНИВЕРСИТЕТ

Кафедра










КУРСОВАЯ РАБОТА















Красноярск 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 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ