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

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

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






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

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

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

 

Вариант №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; просмотров: 375. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

Практические расчеты на срез и смятие При изучении темы обратите внимание на основные расчетные предпосылки и условности расчета...

Функция спроса населения на данный товар Функция спроса населения на данный товар: Qd=7-Р. Функция предложения: Qs= -5+2Р,где...

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

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

Мотивационная сфера личности, ее структура. Потребности и мотивы. Потребности и мотивы, их роль в организации деятельности...

Классификация ИС по признаку структурированности задач Так как основное назначение ИС – автоматизировать информационные процессы для решения определенных задач, то одна из основных классификаций – это классификация ИС по степени структурированности задач...

Влияние первой русской революции 1905-1907 гг. на Казахстан. Революция в России (1905-1907 гг.), дала первый толчок политическому пробуждению трудящихся Казахстана, развитию национально-освободительного рабочего движения против гнета. В Казахстане, находившемся далеко от политических центров Российской империи...

Виды сухожильных швов После выделения культи сухожилия и эвакуации гематомы приступают к восстановлению целостности сухожилия...

КОНСТРУКЦИЯ КОЛЕСНОЙ ПАРЫ ВАГОНА Тип колёсной пары определяется типом оси и диаметром колес. Согласно ГОСТ 4835-2006* устанавливаются типы колесных пар для грузовых вагонов с осями РУ1Ш и РВ2Ш и колесами диаметром по кругу катания 957 мм. Номинальный диаметр колеса – 950 мм...

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