Студопедия — КУРСОВОЙ ПРОЕКТ. по курсу “Объектно-ориентированное программирование”
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

КУРСОВОЙ ПРОЕКТ. по курсу “Объектно-ориентированное программирование”






ІНСТИТУТ ЕЛЕКТРОЕНЕРГЕТИКИ

ФАКУЛЬТЕТ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ

по курсу “Объектно-ориентированное программирование”

 

Вариант №11

 

 

Выполнила: ст. гр. ПИит-10-1 Соколик Е.А.  
  Проверил:   ст. пр. Шмаков Ю.Д.  

 

Днепропетровск

 

Содержание

 

Содержание _____________________________________________________ 2

Задание _________________________________________________________3

Выполнение _____________________________________________________4

Предметная область ________________________________________4

Диаграмма классов _________________________________________4

Описание классов __________________________________________5

Листинг файла Basketball.pas ________________________________ 6

Листинг файла Unit1.pas ____________________________________11

Результаты работы приложения ______________________________ 16

Выводы __________________________________________________ 17

Список литературы_______________________________________________ 18

 

 

ВАРИАНТ 11

Разработать программу, имитирующую бросок мяча игроком в баскетбольное кольцо. Мяч можно рассматривать как тело, брошенное под углом a, к горизонту со скоростью u.

При этом на тело действует сила притяжения, в случае чего вертикальная координата тела увеличивается до определенного значения, а потом начинает уменьшаться. Если пренебречь сопротивлением воздуха, то координаты тела в момент времени t определяются по формулам:

x(t)=utcosa

y(t)=utsina - gt2/2.

Игрока, мяч и кольцо изобразить стилизированными символами (по усмотрению программиста). Программа должна запрашивать рост игрока. Положение игрока на поле должно управлятся клавишами и ®, а величина угла a - клавишами ­­­ та ¯. Величина скорости u задается с клавиатуры, но при помощи датчика случайных чисел может при каждом броске менятся в пределах ±20% от заданного значения. В случае попадания мяча в щит имитировать отскок мяча.

 

 

Выполнение

 

Предметная область:

 

В качестве предметной области выступает игра в баскетбол. Необходимо разработать приложение, позволяющее имитировать бросок мяча игроком в баскетбольное кольцо. Цель игры – попасть в кольцо. Программа содержит такой набор графических элементов: игрок, мяч, кольцо, щит.

 

Диаграмма классов:

 

Для создания диаграмм классов использовался редактор Model Maker 6.20.

 

Рис.1. Диаграмма классов.

 

 

Описание классов:

 

TObject – класс-предок для всех классов. Содержит конструктор Create и деструктор Destroy.

 

TGElement - класс - графический элемент. Наследуется от TObject. Содержит три атрибута: Canvas –канва, на которой будут рисоваться элементы, x и y – координаты элемента на канве. В конструктор Create в качестве параметра передается канва, на которой будет отображаться элемент. Метод Draw – рисование элемента на канве, метод Erase – «стирание» элемента (прорисовка цветом фона), метод MoveTo – перемещение элемента по канве, в качестве параметров передаются новые координаты x и y.

 

· TPlayer - класс-игрок. Наследуется от TGElement. Содержит 1атрибут: Height - высота игрока (рост). Имеет собственный конструктор, методы – SetHeight – установить высоту, а также переопределенные методы Draw и Erase.

· TBall – класс-мяч. Наследуется от TGElement. Имеет собственный конструктор, а также переопределенные методы Draw и Erase.

· TBasket – класс-корзина. Наследуется от TGElement. Имеет собственный конструктор, а также переопределенные методы Draw и Erase.

· TBoard - класс - щит. Наследуется от TGElement. Имеет собственный конструктор, а также переопределенные методы Draw и Erase.

 

Листинг файла Basketball.pas:

Unit Basketball;

 

interface

 

uses

Graphics;

 

type

TGElement = class (TObject)

private

Canvas: TCanvas;

x: Word;

y: Word;

public

constructor Create(ACanvas: TCanvas);

procedure Draw; virtual;

procedure Erase; virtual;

function GetX: Word; virtual;

function GetY: Word; virtual;

procedure MoveTo(AX: word; AY: word); virtual;

end;

 

TPlayer = class (TGElement)

private

Height: byte;

public

constructor Create(ACanvas: TCanvas);

procedure SetHeight(AHeight: byte);

procedure Draw; override;

procedure Erase; override;

end;

 

TBall = class (TGElement)

constructor Create(ACanvas: TCanvas);

procedure Draw; override;

procedure Erase; override;

end;

 

TBasket = class (TGElement)

constructor Create(ACanvas: TCanvas);

procedure Draw; override;

procedure Erase; override;

end;

 

TBoard = class (TGElement)

constructor Create(ACanvas: TCanvas);

procedure Draw; override;

procedure Erase; override;

end;

 

implementation

 

{

********************************** TGElement ***********************************

}

constructor TGElement.Create(ACanvas: TCanvas);

begin

x:= 0;

y:= 0;

Canvas:= ACanvas;

end;

 

procedure TGElement.Draw;

begin

end;

 

procedure TGElement.Erase;

begin

end;

 

function TGElement.GetX: Word;

begin

result:= x;

end;

 

function TGElement.GetY: Word;

begin

result:= y;

end;

 

procedure TGElement.MoveTo(AX: word; AY: word);

begin

Erase;

x:= AX;

y:= AY;

Draw;

end;

 

{

*********************************** TPlayer ************************************

}

constructor TPlayer.Create(ACanvas: TCanvas);

begin

x:= 0;

y:= 0;

Canvas:= ACanvas;

Height:= 0;

end;

 

procedure TPlayer.SetHeight(AHeight: byte);

begin

Height:= AHeight;

end;

 

procedure TPlayer.Draw;

begin

With Canvas do

begin

Lock;

Pen.Color:= clblack;

Brush.Color:= clwhite;

MoveTo(x, y);

Ellipse(x+1, y, x+27, y+23);

Ellipse(x+17, y+6, x+20, y+9);

MoveTo(x+23, y+18);

LineTo(x+17, y+15);

Ellipse(x, y+23, x+28, y+86);

MoveTo(x+14, y+40);

LineTo(x+37, y+11);

LineTo(x+41, y+11);

LineTo(x+42, y+12);

LineTo(x+42, y+18);

LineTo(x+18, y+48);

 

MoveTo(x+27, y+41);

LineTo(x+49, y+15);

LineTo(x+49, y+10);

LineTo(x+48, y+9);

LineTo(x+45, y+9);

LineTo(x+42, y+12);

 

Rectangle(x+6, y+82, x+23, y+148+2*(Height));

MoveTo(x+18, y+82);

LineTo(x+18, y+148+2*(Height));

 

MoveTo(x+6, y+148+2*(Height));

LineTo(x+6, y+151+2*(Height));

LineTo(x+22, y+151+2*(Height));

LineTo(x+18, y+147+2*(Height));

 

Rectangle(x+6, y+150+2*(Height), x+26, y+153+2*(Height));

MoveTo(x+23, y+148+2*(Height));

LineTo(x+26, y+151+2*(Height));

MoveTo(x+21, y+151+2*(Height));

LineTo(x+21, y+153+2*(Height));

 

Pen.Color:= clwhite;

Rectangle(x+22, y+31, x+26, y+39);

Pen.Color:= clblack;

Unlock;

end;

end;

 

procedure TPlayer.Erase;

begin

With Canvas do

begin

Lock;

Pen.Color:= clwhite;

Brush.Color:= clwhite;

MoveTo(x, y);

Ellipse(x+1, y, x+27, y+23);

Ellipse(x+17, y+6, x+20, y+9);

MoveTo(x+23, y+18);

LineTo(x+17, y+15);

Ellipse(x, y+23, x+28, y+86);

MoveTo(x+14, y+40);

LineTo(x+37, y+11);

LineTo(x+41, y+11);

LineTo(x+42, y+12);

LineTo(x+42, y+18);

LineTo(x+18, y+48);

 

MoveTo(x+27, y+41);

LineTo(x+49, y+15);

LineTo(x+49, y+10);

LineTo(x+48, y+9);

LineTo(x+45, y+9);

LineTo(x+42, y+12);

 

Rectangle(x+6, y+82, x+23, y+148+2*(Height));

MoveTo(x+18, y+82);

LineTo(x+18, y+148+2*(Height));

 

MoveTo(x+6, y+148+2*(Height));

LineTo(x+6, y+151+2*(Height));

LineTo(x+22, y+151+2*(Height));

LineTo(x+18, y+147+2*(Height));

 

Rectangle(x+6, y+150+2*(Height), x+26, y+153+2*(Height));

MoveTo(x+23, y+148+2*(Height));

LineTo(x+26, y+151+2*(Height));

MoveTo(x+21, y+151+2*(Height));

LineTo(x+21, y+153+2*(Height));

 

Pen.Color:= clwhite;

Rectangle(x+22, y+31, x+26, y+39);

Pen.Color:= clblack;

Unlock;

end;

end;

 

{

************************************ TBall *************************************

}

constructor TBall.Create(ACanvas: TCanvas);

begin

x:= 0;

y:= 0;

Canvas:= ACanvas;

end;

 

procedure TBall.Draw;

begin

With Canvas do

begin

Lock;

Pen.Color:= clblack;

Brush.Color:= clred;

MoveTo(x, y);

Ellipse(x, y, x+25, y+25);

Brush.Color:= clwhite;

Unlock;

end;

end;

 

procedure TBall.Erase;

begin

With Canvas do

begin

Lock;

Pen.Color:= clwhite;

Brush.Color:= clwhite;

MoveTo(x, y);

Ellipse(x, y, x+25, y+25);

Unlock;

end;

end;

 

{

*********************************** TBasket ************************************

}

constructor TBasket.Create(ACanvas: TCanvas);

begin

x:= 0;

y:= 0;

Canvas:= ACanvas;

end;

 

procedure TBasket.Draw;

begin

With Canvas do

begin

Lock;

Pen.Color:= clblack;

Brush.Color:= clwhite;

MoveTo(x, y);

Rectangle(x, y, x+50, y+5);

MoveTo(x+50, y+2);

LineTo(x+55, y+2);

Unlock;

end;

end;

 

procedure TBasket.Erase;

begin

With Canvas do

begin

Lock;

Pen.Color:= clwhite;

Brush.Color:= clwhite;

MoveTo(x, y);

Rectangle(x, y, x+50, y+5);

MoveTo(x+50, y+2);

LineTo(x+55, y+2);

Unlock;

end;

end;

 

{

************************************ TBoard ************************************

}

constructor TBoard.Create(ACanvas: TCanvas);

begin

x:= 0;

y:= 0;

Canvas:= ACanvas;

end;

 

procedure TBoard.Draw;

begin

With Canvas do

begin

Lock;

Pen.Color:= clblack;

Brush.Color:= clwhite;

MoveTo(x, y);

Rectangle(x, y, x+5, y+100);

MoveTo(x+5, y+25);

LineTo(x+15, y+25);

MoveTo(x+5, y+75);

LineTo(x+15, y+75);

Rectangle(x+15, y+25, x+25, y+300);

Unlock;

end;

end;

 

procedure TBoard.Erase;

begin

With Canvas do

begin

Lock;

Pen.Color:= clwhite;

Brush.Color:= clwhite;

MoveTo(x, y);

Rectangle(x, y, x+5, y+100);

MoveTo(x+5, y+25);

LineTo(x+30, y+25);

MoveTo(x+5, y+75);

LineTo(x+30, y+75);

Rectangle(x+15, y+25, x+25, y+300);

Unlock;

end;

end;

 

 

end.

 

Листинг файла Unit1.pas:

 

 

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ComCtrls, jpeg, ExtCtrls, Basketball;

 

type

TFormMain = class(TForm)

TrackPos: TTrackBar;

TrackSize: TTrackBar;

TrackAngle: TTrackBar;

LabelAngle: TLabel;

LabelPos: TLabel;

LabelSize: TLabel;

TimerThrow: TTimer;

EditSpeed: TEdit;

PanelThrow: TPanel;

LabelSpeed: TLabel;

GroupStat: TGroupBox;

LabelThrow: TLabel;

LabelRes: TLabel;

MemoCom: TMemo;

PanelNew: TPanel;

GamePB: TPaintBox;

procedure TrackPosChange(Sender: TObject);

procedure TrackSizeChange(Sender: TObject);

procedure TimerThrowTimer(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure TrackAngleChange(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure PanelThrowClick(Sender: TObject);

procedure GamePBPaint(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

FormMain: TFormMain;

angle: byte;

t, v, cosinus, sinus, negsinus: real;

player: TPlayer;

ball: TBall;

basket: TBasket;

board: TBoard;

defx, defy, x, y, throw, resthrow: integer;

ricochet, score: boolean;

 

 

implementation

 

{$R *.dfm}

 

procedure TFormMain.TrackPosChange(Sender: TObject);

var

pos, size: byte;

begin

pos:= TrackPos.Position;

size:= TrackSize.Position;

LabelPos.Caption:= 'Положение:' + IntToStr(pos+1);

player.MoveTo(pos * 21 + 12, player.GetY);

ball.MoveTo(pos * 21 + 45, ball.GetY);

GamePB.OnPaint(self);

end;

 

procedure TFormMain.TrackSizeChange(Sender: TObject);

var

pos, size, pheight: byte;

begin

pos:= TrackPos.Position;

size:= TrackSize.Position;

pheight:= 160 + (10 - size) * 5;

LabelSize.Caption:= 'Рост: ' + IntToStr(pheight);

player.SetHeight(10 - size);

player.MoveTo(player.GetX, 202 - 2*(10 - size));

ball.MoveTo(pos * 21 + 45, 200 - 2*(10 - size));

GamePB.OnPaint(self);

end;

 

procedure TFormMain.TimerThrowTimer(Sender: TObject);

begin

t:= t+ 0.01;

if not ((y > 354) or (x > 580)) then

begin

if ((x >= board.GetX-25) and (x <= 505)) and ((y >= 30) and (y < 125)) then

ricochet:= true;

v:= abs(v - v/50);

if ricochet then

begin

x:= x - round(v*t* cosinus);

y:= y - round(v*t* negsinus - 4.95* t*t);

end

else

begin

x:= x + round(v*t*cosinus);

y:= y - round(v*t*sinus - 4.95* t*t);

end;

if ((x >= basket.GetX+2) and (x <= basket.GetX+25)) and ((y+20 >= basket.GetY) and (y+20 <= basket.GetY+5)) then

score:= true;

ball.MoveTo(x, y);

end

else

begin

TimerThrow.Enabled:= false;

ball.MoveTo(defx, defy);

t:= 0;

if score then

inc(resthrow);

LabelRes.Caption:= 'Попаданий: ' + IntToStr(resthrow);

end;

GamePB.OnPaint(self);

end;

 

procedure TFormMain.FormCreate(Sender: TObject);

var

pos, size, pheight: byte;

begin

Randomize;

player:= TPlayer.Create(GamePB.Canvas);

ball:= TBall.Create(GamePB.Canvas);

basket:= TBasket.Create(GamePB.Canvas);

board:= TBoard.Create(GamePB.Canvas);

 

player.MoveTo(12, 202);

ball.MoveTo(45, 200);

basket.MoveTo(465, 125);

board.MoveTo(520, 55);

GamePB.Canvas.Brush.Color:= clwhite;

 

TrackAngle.Position:= 1;

angle:= TrackAngle.Position;

LabelAngle.Caption:= 'Угол: ' + IntToStr(angle);

TrackPos.Position:= 0;

pos:= TrackPos.Position;

LabelPos.Caption:= 'Положение:' + IntToStr(pos+1);

TrackSize.Position:= 10;

pheight:= 160 + (10 - TrackSize.Position) * 5;

LabelSize.Caption:= 'Рост: ' + IntToStr(pheight);

throw:= 0;

resthrow:= 0;

LabelThrow.Caption:= 'Бросков: ' + IntToStr(throw);

LabelRes.Caption:= 'Попаданий: ' + IntToStr(resthrow);

EditSpeed.Text:= '';

 

end;

 

procedure TFormMain.TrackAngleChange(Sender: TObject);

begin

angle:= TrackAngle.Position;

LabelAngle.Caption:= 'Угол: '+ IntToStr(angle);

end;

 

 

procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if key = 37 then

TrackPos.Position:= TrackPos.Position - 1;

if key = 39 then

TrackPos.Position:= TrackPos.Position + 1;

if ssShift in Shift then

begin

if key = 38 then

TrackSize.Position:= TrackSize.Position - 1;

if key = 40 then

TrackSize.Position:= TrackSize.Position + 1;

if key = 78 then

begin

FormMain.OnCreate(self);

GamePB.OnPaint(self);

end

end

else

begin

if key = 38 then

TrackAngle.Position:= TrackAngle.Position + 1;

if key = 40 then

TrackAngle.Position:= TrackAngle.Position - 1;

end;

if (key = 13) and not TimerThrow.Enabled then

PanelThrow.OnClick(self);

if key in [48..57] then

EditSpeed.Text:= EditSpeed.Text + chr(key);

if key = 188 then

EditSpeed.Text:= EditSpeed.Text + ',';

if key = 46 then

EditSpeed.Text:= '';

end;

 

procedure TFormMain.PanelThrowClick(Sender: TObject);

var

value: real;

sign: byte;

begin

try

v:= StrToFloat(EditSpeed.text);

except

on EConvertError do

begin

showmessage('Введите значение скорости');

exit;

end;

end;

TimerThrow.Enabled:= true;

x:= ball.GetX;

y:= ball.GetY;

defx:= x;

defy:= y;

t:= 0;

ricochet:= false;

inc(throw);

labelthrow.Caption:= 'Бросков: ' + IntToStr(throw);

score:=false;

cosinus:= cos(Pi/180 * angle);

sinus:= sin(Pi/180 * angle);

negsinus:= sin(Pi/180 * -angle);

value:= random(21);

sign:= random(2);

value:= v*0.01*value;

if sign = 0 then

v:= v + value

else

v:= v - value;

end;

 

procedure TFormMain.GamePBPaint(Sender: TObject);

begin

with GamePB.Canvas do

begin

Pen.Color:= clwhite;

Rectangle(0, 0, 580, 375);

Pen.Color:= clblack;

MoveTo(0, 354);

LineTo(580, 354);

end;

player.Draw;

ball.Draw;

basket.Draw;

board.Draw;

end;

 

end.

 

Результат работы приложения:

Рис.2. Окно приложения после запуска.

 

Рис.3. Окно приложения во время игры.

 

 

Выводы:

 

Разработанное приложение имитирует игру в баскетбол. Мною успешно были выполнены все поставленные задачи.

Выполнив этот курсовой проект, я закрепила и углублила теоретические знания по дисциплине "Объектно-ориентированное программирование", ознакомилась с основными методами объектной декомпозиции предметной области для задач разработки объектно-ориентированных программных средств, приобрела опыт практической разработки объектно-ориентированного программного обеспечения.

 

 

Список литературы:

 

1. Методичні рекомендації до виконання лабораторних робіт з дисципліни «Об’єктно-орієнтоване програмування (Ч. І)» для студентів напряму 6.050101 «Комп’ютерні науки» та 6.050103 «Програмна інженерія» / Ю. Д. шмаков – Д.: Національний гірничий університет, 2008.– 143 с.

2. Кармайкл Э., Хэйвуд Д. Быстрая и качественная разработка программного обеспечения – М.: Вильямс, 2003. – 400 с.

3. Буч Г., Рамбо Дж., Джекобсон А. UML. Руководство пользователя - М.: ДМК, 2000. - 432 с. (Серия: Для программистов)

4. Орлов С. А. Технологии разработки программного обеспечения: Учебник - СПб.: Питер, 2002. - 464 с.







Дата добавления: 2015-06-15; просмотров: 370. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Типовые ситуационные задачи. Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт Задача 1.У больного А., 20 лет, с детства отмечается повышенное АД, уровень которого в настоящее время составляет 180-200/110-120 мм рт. ст. Влияние психоэмоциональных факторов отсутствует. Колебаний АД практически нет. Головной боли нет. Нормализовать...

Эндоскопическая диагностика язвенной болезни желудка, гастрита, опухоли Хронический гастрит - понятие клинико-анатомическое, характеризующееся определенными патоморфологическими изменениями слизистой оболочки желудка - неспецифическим воспалительным процессом...

Признаки классификации безопасности Можно выделить следующие признаки классификации безопасности. 1. По признаку масштабности принято различать следующие относительно самостоятельные геополитические уровни и виды безопасности. 1.1. Международная безопасность (глобальная и...

Этапы и алгоритм решения педагогической задачи Технология решения педагогической задачи, так же как и любая другая педагогическая технология должна соответствовать критериям концептуальности, системности, эффективности и воспроизводимости...

Понятие и структура педагогической техники Педагогическая техника представляет собой важнейший инструмент педагогической технологии, поскольку обеспечивает учителю и воспитателю возможность добиться гармонии между содержанием профессиональной деятельности и ее внешним проявлением...

Репродуктивное здоровье, как составляющая часть здоровья человека и общества   Репродуктивное здоровье – это состояние полного физического, умственного и социального благополучия при отсутствии заболеваний репродуктивной системы на всех этапах жизни человека...

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия