Разработка программной игры "баскетбол"
Создание программы "компьютерная игра "баскетбол", с упрощенным изображением баскетбольного щита и игрока, с возможностью изменять положение игрока, направление броска и его силу. Построение алгоритма, описание процедур и функций, таблица идентификаторов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 29.11.2011 |
Размер файла | 72,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
22
Министерство образования Российской Федерации
КРАСНОЯРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
Кафедра
КУРСОВАЯ РАБОТА
Красноярск 2002
Содержание
1 Задание к проекту
2 Описание программы
3 Укрупненный алгоритм
4 Таблица идентификаторов
5 Описание процедур и функций
6 Алгоритм
7 Контрольные примеры
8 Текст программы
1 Задание к проекту
Необходимо написать программу - игру “баскетбол”. Должены быть упрощенно изображены баскетбольный щит и игрок. Необходимо, чтобы можно было изменять положение игрока, направление бросока и его силу.
программа компьютерная игра алгоритм
2 Описание программы
Так как программа использует графический режим, то для ее корректной работы в папке, где находится basket.exe должен находиться и файл egavga.bgi, иначе будет выводиться сообщение об ошибке инициализации графики.
При помощи клавиатуры играющий может перемещать игрока вправо или влево, изменять направление броска.
Управление:
A - движение игрока влево
D - движение игрока вправо
W - увеличение угла броска
S - уменьшение угла броска
SPACE - режим броска, бросок
После нажатия на SPACE включается режим броска. В левом верхнем углу экрана появится прямоугольник, показывающий силу броска. Сила броска будет циклически изменяться от 0 до максимума. Чем больше высота прямоугольника, тем сильнее получится бросок. Максимальная сила отмечена чертой. Для совершения броска необходимо в нужный момент еще раз нажать SPACE. Затем можно увидеть полет мяча. Только после этого режим броска выключается.
В этом режиме нельзя передвигать игрока или изменять направление броска.
3 Укрупненный алгоритм
4 Таблица идентификаторов
Имя переменной |
Тип |
Назначение |
|
grdriver |
integer |
Служебные переменные для включения и настройки графического режима |
|
grmode |
integer |
||
errcode |
integer |
||
x |
integer |
Положение игрока |
|
xprev |
integer |
Предыдущее положение игрока |
|
step |
integer |
Шаг игрока |
|
radius |
integer |
Радиус мяча |
|
handx |
integer |
Координата мяча и руки по оси x |
|
handy |
integer |
Координата мяча и руки по оси y |
|
v |
integer |
Скорость мяча |
|
delay1 |
integer |
Задержка |
|
change |
integer |
Была ли нажата клавиша |
|
angle |
Real |
Направление руки (броска) |
|
angleprev |
Real |
Предыдущее Направление руки |
|
anglestep |
Real |
Изменение направления руки |
|
key |
Char |
Введенная клавиша |
|
yc |
real |
Координата мяча по оси y |
|
i |
integer |
Счетчик |
|
direction |
integer |
Направление полета мяча |
|
hand |
integer |
Временная переменная |
|
goal |
integer |
Был ли гол |
|
y |
real |
Координата мяча по оси y |
|
yp |
real |
Предыдущая координата мяча по оси y |
|
vx |
real |
Скокость мяча по оси x |
|
vy |
real |
Скокость мяча по оси y |
|
distance |
real |
Расстояние от мяча до “угла” кольца |
|
k |
real |
Был ли удар мяча об кольцо |
|
k1 |
real |
Временные переменные |
|
tmp |
Real |
||
tmp1 |
Real |
||
tmp2 |
Real |
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)
Переменные
i,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)
tmp1=модуль(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
y=вызов findy(handx-i/10,yp,vx,vy)
цвет пера - белый
если tmp>135 и tmp<185 и yp<=190 и y>190 то
начало
Закрасить прямоугольник
(550,20,600,40) черным
Переместить перо в (550,30)
Написать 'goal'
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)
конец
7 Контрольные примеры
8 Текст программы
program basketball;
uses 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; {Задержка для вывода на экран}
procedure showbasket;
{Процедура, рисующая баскетбольный щит с корзиной}
begin
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); {Рисуем пол}
end;
function findy(x:real;y:real;vx:real;vy:real):real;
{Функция нахождения координаты мяча по оси y}
var yc:real; {Координаты мяча по оси y}
begin
yc:=y-vy/sqrt(v*v+0.0001);
{Вычисляем координату мяча}
findy:=yc; {Возврат из функции}
end;
procedure showplayer(x:integer;angle:real);
{Процедура, рисующая игрока}
begin
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); {Рисуем руки}
end;
procedure shot(x:integer;angle:real);
{Процедура "Бросок мяча"}
var i,direction,hand,goal:integer;{Перменные цикла,
направления, начальной точки мяча, показатель был ли гол}
y,yp,vx,vy:real;
{Текущая и предыдущая координаты мяча, скорости мяча по осям x, y}
distance,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
hand:=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)
and (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); {Рисуем мяч}
end;
begin
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));
{Пишем сооющение об ошибке инициализации графики}
end.
Размещено на Allbest.ru
Подобные документы
Анализ и постановка задач дисциплины "Компьютерная графика". Разработка структуры, функциональной схемы и программной документации. Руководство программисту и оператору. Выбор и обоснование языка программирования. Описание процедур, функций, оценок.
дипломная работа [3,6 M], добавлен 16.11.2011Разработка программы, моделирующей игру "Кости". Использование в программе генератора псевдослучайных чисел. Схема иерархии модулей. Описание работы программы. Регистрация игрока, окно программы. Определение языка программирования, основные операторы.
курсовая работа [3,2 M], добавлен 29.07.2010Разработка игровой программы "Frag the monster", которая осуществляет вывод на экран случайным образом врагов, основного игрока и дополнительных объектов (оружия). Обоснование выбора языка программирования - С++. Интерфейс и принцип работы программы.
курсовая работа [3,2 M], добавлен 27.12.2011Описание предметной области. Компоненты и палитра компонентов. Выбор архитектуры приложения. Структурные и функциональные схемы. Описание разрабатываемых процедур и функций, таблица идентификаторов. Выбор стратегии тестирования и разработка тестов.
дипломная работа [8,2 M], добавлен 18.06.2014Требования к техническим, программным средствам разработки и функционированию программы. Обоснование выбранного языка программирования. Описание алгоритма решения задачи, тестирование ее основных функций. Понятие дружелюбного пользовательского интерфейса.
курсовая работа [85,9 K], добавлен 31.10.2014Список переменных и типов данных. Программное и аппаратное обеспечение программы. Программирование игры в среде C# про чемпионат Европы по баскетболу среди мужских команд с определением места в группах по наибольшему числу трехочковых попаданий в группе.
курсовая работа [35,9 K], добавлен 29.10.2012Методика разработки алгоритма, по которому компьютер сможет играть в "Морской бой" с максимальным качеством, и при этом не подглядывая расположение флота игрока. Математические и алгоритмические основы решения задачи, составление программы решения.
курсовая работа [365,4 K], добавлен 20.01.2010Создание приложения для вычисления значений функций и определение суммы этих функций: эскиз формы, таблица свойств объекта, список идентификаторов и непосредственные коды процедур. Результаты вычислений и выводы, проверка работы данной программы.
лабораторная работа [19,9 K], добавлен 20.10.2009Разработка программы-игры "Keyboard Racer". Главная особенность игры - визуализация простого и скучного набора текста гоночной игрой. Интуитивно понятный и эргономичный интерфейс программы, схема ее работы. Синхронизация между клиентом и сервером.
курсовая работа [200,6 K], добавлен 25.05.2014Анализ и описание алгоритма. Основные характеристики выбранного компьютера, программных сред (операционная система и среда программирования). Описание компонентов и интерфейса программы, а также модулей, процедур и функций. Вызов и загрузка программы.
курсовая работа [1,3 M], добавлен 26.04.2015