Введение. по курсу “Объектно-ориентированное программирование”
по курсу “Объектно-ориентированное программирование”
Вариант №11
Днепропетровск
Содержание
Содержание _____________________________________________________ 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 с. Содержание Введение…………………………………………………………………………...3 1. Страховой рынок……………………………………………………………….4 1.1 Понятие страхового рынка и условия его существования…………………4 1.2 Структура страхового рынка и его виды…………………………………….5 2. Государственное регулирование страховой деятельности…………………5 2.1 Государственное регулирование страховой деятельности: понятие и направления………………………………………………………………………..6 2.2 Прямое участие государства в становлении страховой системы защиты имущественных интересов……………………………………………………….6 2.3 Законодательное обеспечение становления и защиты национального страхового рынка………………………………………………………………….7 2.4 Государственный надзор за страховой деятельностью…………………….7 2.5 Пресечение монополистической деятельности и недобросовестной конкуренции на страховом рынке………………………………………………11 2.6 Лицензирование страховой деятельности………………………………….17 Заключение……………………………………………………………………….20 Список использованной литературы…………………………………………...21
Введение Важнейшим условием нормальной жизнедеятельности человека является непрерывность и бесперебойность. Но многовековой опыт человечества показывает, что процесс общественного производства прерывается или нарушается в результате разрушительного воздействия стихийных сил природы или негативных последствий других чрезвычайных ситуаций. В данной ситуации объективно действует рискованный характер, а фактор риска вызывает потребность в страховании. Благодаря страхованию любой вид человеческой деятельности защищен от случайностей. Из вышеперечисленного можно сделать вывод, что риск служит предпосылкой возникновения страховых отношений. Своеобразие этих отношений как экономической категории, заключается в том, что страхование является категорией, находящейся в подчиненной связи с категорией финансов. Страхование, как и финансы, обусловлено движением денежной формы стоимости при формировании и использовании соответствующих целевых фондов денежных средств в процессе распределения и перераспределения денежных доходов и накоплений. В настоящее время тема страхования является весьма актуальной.
|