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

Создание программы "компьютерная игра "баскетбол", с упрощенным изображением баскетбольного щита и игрока, с возможностью изменять положение игрока, направление броска и его силу. Построение алгоритма, описание процедур и функций, таблица идентификаторов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.