Реферат Технология программирования
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Федеральное агентство по образованию
САМАРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ имени академика С.П. КОРОЛЕВА
Факультет заочного обучения
Кафедра динамики полета и систем управления
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по предмету
«Технология программирования»
Выполнил студент 9651 группы: Матвеев О. В.
Руководитель проекта: Фадеенков П. В.
Самара 2009
Содержание
Введение. 3
Постановка задачи. 5
1 Анализ. 6
1.1 Объектная декомпозиция. 7
1.2 Описание абстракций. 10
1.3 Структурная схема программного продукта. 11
2 Проектирование. 12
2.1 Логическое проектирование. 13
2.2 Физическое проектирование. 14
3 Эволюция. 15
4 Модификация. 16
Заключение. 17
Список использованных источников. 18
Приложение А. Исходные тексты проекта. 19
Модуль cards.pas. 20
Модуль player.pas. 22
Модуль game.pas. 24
Модуль main.pas. 27
Введение
На заре компьютерной эры очень трудно было написать большую программу, потому что возможности компьютеров были ограничены. Ограничения проистекали из объема оперативной памяти, скорости считывания информации с вторичных носителей и быстродействия процессоров. В 60-70-е годы прошлого века эффективность применения компьютеров резко возросла, цены на них стали падать, а возможности ЭВМ увеличились. В результате стало выгодно, да и необходимо создавать все больше прикладных программ повышенной сложности. В качестве основных инструментов создания программных продуктов начали применяться алгоритмические языки высокого уровня. Эти языки расширили возможности отдельных программистов и групп разработчиков, что в свою очередь привело к увеличению уровня сложности программных систем.
Было разработано много методов, помогающих справиться с растущей сложностью программ. Наибольшее распространение получило структурное проектирование по методу сверху вниз. Метод был непосредственно основан на топологии традиционных языков высокого уровня типа FORTRAN или COBOL. В этих языках основной базовой единицей является подпрограмма, и программа в целом принимает форму дерева, в котором одни подпрограммы в процессе работы вызывают другие подпрограммы. Структурное проектирование использует именно такой подход: алгоритмическая декомпозиция применяется для разбиения большой задачи на более мелкие.
Тогда же стали появляться компьютеры еще больших, поистине гигантских возможностей. Значение структурного подхода осталось прежним, но оказалось, что структурный подход не работает, если объем программы превышает приблизительно 100000 строк. В последнее время появились десятки методов, в большинстве которых устранены очевидные недостатки структурного проектирования. Большинство этих методов представляют собой вариации на одни и те же темы и их можно разделить на три основные группы:
· метод структурного проектирования сверху вниз;
· метод потоков данных;
· объектно-ориентированное проектирование.
Структурный подход не позволяет выделить абстракции и обеспечить ограничение доступа к данным; он также не предоставляет достаточных средств для организации параллелизма. Структурный метод не может обеспечить создание предельно сложных систем, и он, как правило, неэффективен в объектных и объектно-ориентированных языках программирования.
В методе потоков данных программная система рассматривается как преобразователь входных потоков в выходные. Метод потоков данных, как и структурный метод, с успехом применялся при решении ряда сложных задач, в частности, в системах информационного обеспечения, где существуют прямые связи между входными и выходными потоками системы и где не требуется уделять особого внимания быстродействию.
В основе объектно-ориентированного проектирования (ООП) лежит представление о том, что программную систему необходимо проектировать как совокупность взаимодействующих друг с другом объектов, рассматривая каждый объект как экземпляр определенного класса, причем классы образуют иерархию. Объектно-ориентированный подход отражает топологию новейших языков высокого уровня, таких как Object Pascal, C++, Java, C# и др.
Постановка задачи
Разработать программу на произвольную тему с использованием принципов объектно-ориентированного программирования. Отразить следующие этапы проектирования: анализ, проектирование, эволюция, модификация.
В качестве программы была выбрана компьютерная реализация азартной игры «Поймай палкой мячик!».
1 Анализ
Цель этапа анализа - максимально полное описание задачи. На этом этапе выполняется анализ предметной области задачи, объектная декомпозиция разрабатываемой системы и определяются важнейшие особенности поведения объектов (описание абстракций).
Для анализа задачи рассмотрим правила игры:
· Игра идет летающей полкой.
· Цель игры: не дать упасть мячику и разбить все кирпичи.
· В начале игры игроку запускается мячик.
· После удара мячика об кирпич, кирпич исчезает, а мячик отскакивает и летит согласно законам отражения физики.
· Если игрок не успевает поймать мячик полкой, он проигрывает.
· Если разбиты все кирпичи, игрок выигрывает.
1.1 Объектная декомпозиция
На основе полученного анализа выполним объектную декомпозицию программы «XPBall».
Игровой процесс можно смоделировать, используя два объекта: «Интерфейс» (блок управления, который получает и интерпретирует команды пользователя) и объекта – «Игра» (реализация игрового процесса), каждый со своими параметрами (рис. 1).
Рисунок 1. Объектная декомпозиция игрового процесса
Далее выполним дальнейшую декомпозицию объектов. Объект «Интерфейс» реализуется из объекта «Форма» (управляющий объект), объекта «Кнопка» и движения мыши получающих команды от пользователя (рис. 2).
Рисунок 2. Объектная декомпозиция объекта «Интерфейс»
Выполним декомпозицию объекта «Игра». Объект состоит из управляющего объекта «Движок» и объекта-потока «Поток» (рис. 3).
Рисунок 3. Декомпозиция объекта «Игра»
Выполним декомпозицию объекта «Движок». Объект состоит из объектов «Мяч», «Кирпичи» и «Планка» (рис 4).
Рисунок 4. Декомпозиция объекта «Движок»
На этом объектную декомпозицию можно закончить. В результате поэтапной декомпозиции получился набор объектов с простым поведением.
1.2 Описание абстракций
В результате объектной декомпозиции можно выделить следующие абстракции:
Объект «Мяч»: содержит свои координаты, градус полета, скорость полета, диаметр, получает сообщение «Передвинуть», «Отобразить»;
Объект «Кирпичи»: содержит массив кирпичей с цветами, ширину и высоту одного кирпича, получает сообщение «Отобразить»;
Объект «Планка»: содержит свои координаты, высоту, ширину, получает сообщения «Передвинуть» и «Отобразить»;
Объект «Движок»: содержит объекты «Мяч», «Кирпичи», «Планка», получает сообщения «Движение мышью» и «Отобразить»;
Объект «Игра»: содержит объекты «Движок» и «Поток», получает сообщения «Начать игру», «Движение мышью», «Конец игры», «Отобразить».
Объект «Форма»: содержит объекты «Кнопка» получает сообщение «Кнопка нажата».
Объект «Кнопка»: передает сообщение «Кнопка нажата» (нажатие пользователем).
1.3 Структурная схема программного продукта
Структурная схема программного продукта приведена на рис. 6.
Рисунок 6. Структрурная схема программного продукта
2 Проектирование
Проектирование различают:
· логическое проектирование, при котором принимаемые решения практически не зависят от условий эксплуатации (операционной системы и используемого оборудования);
· физическое проектирование, при котором приходится принимать во внимание указанные факторы.
Логическое проектирование заключается в разработке структуры Объектов: определяются поля для хранения составляющих состояния объектов и алгоритмы методов, реализующих аспекты поведения объектов. При этом используются рассмотренные выше приемы разработки Объектов (наследование, композиция, наполнение, полиморфизм и т.д.). Результатом является иерархия или диаграмма Объектов, отражающие взаимосвязь Объектов, и описание Объектов.
Физическое проектирование включает объединение описаний Объектов в модули, выбор схемы их подключения (статическая или динамическая компоновка), определение способов взаимодействия с оборудованием, с операционной системой и/или другим программным обеспечением (например, базами данных, сетевыми программами), обеспечение синхронизации процессов для систем параллельной обработки и т.д.
2.1 Логическое проектирование
Из-за простоты проекта основные структуры объектов уже были подробно описаны в разделе описания абстракций.
Опишем реализацию основных алгоритмов:
Алгоритм полета мяча: мяч летит до тех пор, пока не встретится с препятствием, при этом его полет просчитывается заранее. Если мяч встречается с кирпичом, то кирпич уничтожается, а мяч отражается, также как и от планки или стенки. Если же мяч долетает до самого низа, не встретив планки, то игра считается проигранной. Игра считается выигранной, если разбиты все кирпичи.
Для равномерного полета мяча вместо использования таймера реализован поток.
2.2 Физическое проектирование
Проект реализован в среде Borland Delphi 7 и предназаначена для выполнения в ОС семейства Microsoft Windows.
В проект входят следующие модули:
· uObj.pas – модуль содержит объекты «мяч», «планка» и «кирпичи»;
· uEngine.pas – модуль содержит объект «Движок»;
· uMainThread.pas – модуль содержит объект «Поток»;
· uGame.pas – модуль содержит объект «Форма»;
· uMenu.pas – модуль содержит объект «Меню игры»;
· XPBall.dpr – основной файл проекта.
Исходные тексты модулей приведены в приложении А.
3 Эволюция
Это процесс поэтапной реализации и подключения классов к проекту. Процесс начинается с создания основной программы или проекта будущего программного продукта. Затем реализуются и подключаются классы, так чтобы создать грубый, но, по возможности, работающий прототип будущей системы. Он тестируется и отлаживается. Например, таким прототипом может служить система, включающая реализацию основного интерфейса программного продукта (передача сообщений в отсутствующую пока часть системы не выполняется). В результате мы получаем работоспособный прототип продукта, который может быть, например, показан заказчику для уточнения требований. Затем к системе подключается следующая группа классов, например, связанная с реализацией некоторого пункта меню. Полученный вариант также тестируется и отлаживается, и так далее, до реализации всех возможностей системы.
В данном проекте в процессе эволюции реализуем новое состояние для объекта «Игра» - «Инициализация». Данное состояние будет установлено при первом создании объекта «Движок».
4 Модификация
Это процесс добавления новых функциональных возможностей или изменение существующих свойств системы. Как правило, изменения затрагивают реализацию класса, оставляя без изменения его интерфейс, что при использовании ООП обычно обходится без особых неприятностей, так как процесс изменений затрагивает локальную область. Изменение интерфейса - также не очень сложная задача, но ее решение может повлечь за собой необходимость согласования процессов взаимодействия объектов, что потребует изменений в других классах программы. Однако сокращение количества параметров в интерфейсной части по сравнению с модульным программированием существенно облегчает и этот процесс.
Простота модификации позволяет сравнительно легко адаптировать программные системы к изменяющимся условиям эксплуатации, что увеличивает время жизни систем, на разработку которых затрачиваются огромные временные и материальные ресурсы.
Для данного проекта реализуем изменения, описанные в эволюции.
Введем состояния игры для класса TEngine. Для этого вводим переменную TheEnd.
Изменим конструктор класса, чтобы при создании объекта у него устанавливалось состояние TheEnd в False.
Как видно, изменения затронули только только внутреннюю реализацию класса TEngine, не затронув его внешний интерфейс.
Заключение
В ходе работы над курсовым проектом были изучены основные принципы объектно-ориентированного проектирования ПО. С помощью объектно-ориентированного подхода был создан проект азартной игры «XPBall»
Список использованных источников
1. Буч Г. Объектно-ориентированный анализ и проектирование. М.: 1996.
2. Фёдоров А. Особенности программирования на Borland Pascal. Киев: “Диалектика”, 1994.
3. Гайсарян С.С. Объектно-ориентированные технологии проектирования прикладных программных систем. М.: ЦИТ. 1998.
Приложение А. Исходные тексты проекта
Модуль
XPBall
.
dpr
program XPBall;
uses
Forms,
uMenu in 'uMenu.pas' {fmMenu},
uGame in 'uGame.pas' {fmGame},
uMainThread in 'uMainThread.pas',
uObj in 'uObj.pas',
uEngine in 'uEngine.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfmMenu, fmMenu);
Application.CreateForm(TfmGame, fmGame);
Application.Run;
end.
Модуль uObj.pas
unit uObj;
interface
Uses Graphics;
Const kkx = 10; kky = 10;
type
TPlanka = class
private
x, y, h, w: Word;
canvas: TCanvas;
Procedure Draw(x, y: Word; sh: Boolean);
public
property widthPl: Word read w;
function BallinP(xk, yk: Word): Boolean;
Procedure Move(nx, ny: Word);
Constructor Create(c: TCanvas; xp, yp, hp, wp: Word);
end;
TKirpichi = class
private
h, w: Byte;
ar: Array[1..kkx, 1..kky] of Byte;
canvas: TCanvas;
procedure Draw(x, y: Word; sh: Boolean);
public
klkr: Integer;
function BallinK(x, y: Word): Boolean;
procedure DrawAll;
Constructor Create(c: TCanvas; pH, pW: Word);
end;
TBall = class
private
canvas: TCanvas;
public
x, y, dgr: Word;
spd, d: Byte;
procedure Move(xn, yn: Word);
Constructor Create(c: TCanvas; xb, yb, dgrb : Word; spdb, db: Byte);
end;
implementation
// Планка
Constructor TPlanka.Create(c: TCanvas; xp, yp, hp, wp: Word);
Begin
canvas := c; x := xp; y := yp; h := hp; w := wp;
Draw(x, y, True);
End;
Procedure TPlanka.Draw(x, y: Word; sh: Boolean);
Begin
If sh then begin
canvas.pen.Color := clBlack;
canvas.Brush.Color := clDkGray;
end
else begin
canvas.pen.Color := clBtnFace;
canvas.Brush.Color := clBtnFace;
end;
canvas.Rectangle(x, y, x + w, y + h);
end;
function TPlanka.BallinP(xk, yk: Word): Boolean;
Begin
If (xk >= x) and (xk <= x + w) and (yk >= y) then Result := True
else Result := False;
End;
Procedure TPlanka.Move(nx, ny: Word);
Begin
Draw(x, y, False); x := nx; {y := ny;} Draw(x, y, True);
End;
// Кирпичи
Constructor TKirpichi.Create(c: TCanvas; pH, pW: Word);
Var n, m: Byte;
Begin
canvas := c; h := pH; w := pW; klkr := kkx * kky;
For n := 1 to kkx do For m := 1 to kky do ar[n, m] := Random(7) + 1;
DrawAll;
End;
procedure TKirpichi.Draw(x, y: Word; sh: Boolean);
Begin
If sh then begin
canvas.pen.Color := clBlack;
Case ar[x, y] of
1: canvas.Brush.Color := clGreen;
2: canvas.Brush.Color := clBlue;
3: canvas.Brush.Color := clAqua;
4: canvas.Brush.Color := clFuchsia;
5: canvas.Brush.Color := clOlive;
6: canvas.Brush.Color := clTeal;
7: canvas.Brush.Color := clSkyBlue;
end;
canvas.Rectangle((x - 1) * w + 1, (y - 1) * h + 1, x * w, y * h);
end
else begin
canvas.pen.Color := clBtnFace;
canvas.Brush.Color := clBtnFace;
canvas.Rectangle((x - 1) * w + 1, (y - 1) * h + 1, x * w, y * h);
ar[x, y] := 0;
end;
End;
procedure TKirpichi.DrawAll;
Var n, m: Integer;
Begin
For n := 1 to kkx do For m := 1 to kky do If (ar[n, m] > 0) then Draw(n, m, True);
end;
function TKirpichi.BallinK(x, y: Word): Boolean;
Var n, m: Word;
Begin
Result := False;
n := x div w + 1; m := y div h + 1;
If (n <= kkx) and (m <= kky) then
If ar[n, m] > 0 then begin
ar[n, m] := 0; Draw(n, m, False); klkr := klkr - 1;
Result := True;
end;
End;
// Мяч
Constructor TBall.Create(c: TCanvas; xb, yb, dgrb : Word; spdb, db: Byte);
Begin
canvas := c; x := xb; y := yb; dgr := dgrb; spd := spdb; d := db;
Move(x, y);
End;
procedure TBall.Move(xn, yn: Word);
Begin
canvas.pen.Color := clBlack; canvas.Brush.Color := clBlack;
canvas.Ellipse(xn, yn, xn + d, yn + d);
canvas.pen.Color := clBtnFace; canvas.Brush.Color := clBtnFace;
canvas.Ellipse(x, y, x + d, y + d);
canvas.pen.Color := clBlack; canvas.Brush.Color := clBlack;
canvas.Ellipse(xn, yn, xn + d, yn + d);
x := xn; y := yn;
End;
end.
Модуль uEngine.pas
unit uEngine;
interface
Uses uObj, uMainThread, Graphics;
Type
TEngine = class
private
kr: TKirpichi;
bl: TBall;
pl: TPlanka;
MainThread: TMainThread;
TheEnd: Boolean;
procedure Victory;
procedure Defeat;
function MoveBall: boolean;
public
constructor Create(c: TCanvas);
procedure Move;
procedure ShowAll;
procedure MovePl(nx, ny: Integer);
procedure Free;
end;
implementation
Uses Forms, Windows;
constructor TEngine.Create(c: TCanvas);
Begin
ShowCursor(False);
Randomize;
kr := TKirpichi.Create(c, (Screen.Height div 2) div 10, Screen.Width div 10);
bl := TBall.Create(c, 300, Screen.Height - 200, 215, 15, 20);
pl := TPlanka.Create(c, Screen.Width div 2 - 75, Screen.Height - 25, 15, 150);
TheEnd := False;
MainThread := TMainThread.Create(False);
MainThread.tm := 10;
MainThread.FreeOnTerminate := True;
End;
function TEngine.MoveBall: boolean;
Var nx, ny, px, py: Word;
n, n1, n2: Byte;
rad: Extended;
// Отражение от вертикали
Procedure OtX;
Begin
px := px + Round((n1 - 1) * cos(rad));
If (bl.dgr < 180) then bl.dgr := 180 - bl.dgr else bl.dgr := 180 + (360 - bl.dgr);
rad := Pi / (180 / bl.dgr); n1 := 1;
nx := px + Round(n1 * cos(rad));
End;
// Отражение от горизонтали
Procedure OtY;
Begin
py := py + Round((n2 - 1) * sin(rad));
If (bl.dgr < 180) then bl.dgr := 360 - bl.dgr else bl.dgr := 360 - bl.dgr;
rad := Pi / (180 / bl.dgr); n2 := 1;
ny := py + Round(n2 * sin(rad));
End;
Begin
Result := True;
n := 1; px := bl.x; py := bl.y; n1 := 1; n2 := 1;
rad := Pi / (180 / bl.dgr);
Repeat
nx := px + Round(n1 * cos(rad));
ny := py + Round(n2 * sin(rad));
If (nx + bl.d > Screen.Width) or (nx < 1) then OtX;
If (ny + bl.d > Screen.Height) then begin // GameOver!
Result := False; kr.klkr := -1;
end
else begin
If (ny < 1) then OtY;
Case bl.dgr of
1..90: begin
If pl.BallinP(nx + bl.d div 2, ny + bl.d) or
kr.BallinK(nx + bl.d div 2, ny + bl.d) then OtY;
If kr.BallinK(nx + bl.d, ny + bl.d div 2) then OtX;
end;
91..180: begin
If pl.BallinP(nx + bl.d div 2, ny + bl.d) or
kr.BallinK(nx + bl.d div 2, ny + bl.d) then OtY;
If kr.BallinK(nx, ny + bl.d div 2) then OtX;
end;
181..270: begin
If kr.BallinK(nx + bl.d div 2, ny) then OtY;
If kr.BallinK(nx, ny + bl.d div 2) then OtX;
end;
271..360: begin
If kr.BallinK(nx + bl.d div 2, ny) then OtY;
If kr.BallinK(nx + bl.d, ny + bl.d div 2) then OtX;
end;
end;
end;
n := n + 1; n1 := n1 + 1; n2 := n2 + 1;
Until (n > bl.spd) or (kr.klkr = -1);
bl.Move(nx, ny);
End;
procedure TEngine.Move;
Begin
If not MoveBall then Defeat
else If (kr.klkr = 0) then Victory;
End;
procedure TEngine.Victory;
Begin
MainThread.tm := -1; ShowCursor(True); TheEnd := True;
Application.MessageBox('Вы победили!', 'Игра закончена');
End;
procedure TEngine.Defeat;
Begin
MainThread.tm := -1; ShowCursor(True); TheEnd := True;
Application.MessageBox('Вы проиграли.', 'Игра закончена');
End;
procedure TEngine.ShowAll;
Begin
If not TheEnd then begin
kr.DrawAll; bl.Move(bl.x, bl.y);
end;
End;
Procedure TEngine.MovePl(nx, ny: Integer);
Begin
If not TheEnd then begin
If (nx > Screen.Width - pl.widthPl) then nx := Screen.Width - pl.widthPl;
pl.Move(nx, ny);
end;
End;
Procedure TEngine.Free;
Begin
MainThread.Terminate;
bl.Free; kr.Free; pl.Free;
End;
end.
Модуль uMainThread.pas
unit uMainThread;
interface
uses
Classes;
type
TMainThread = class(TThread)
private
{ Private declarations }
public
tm: ShortInt; // время обновления картинки
protected
procedure Execute; override;
end;
implementation
uses Windows, uGame;
{ TMainThread }
procedure TMainThread.Execute;
Var tmr, a: DWord;
begin
{ Place thread code here }
a := GetTickCount;
Repeat
tmr := GetTickCount;
If (tmr - a > tm) then begin
Synchronize(uGame.engine.Move);
If (tm = -1) then Synchronize(uGame.fmGame.Close);
a := GetTickCount;
end;
Until Terminated;
end;
end.
Модуль uGame.pas
unit uGame;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uMainThread, uEngine;
type
TfmGame = class(TForm)
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
procedure RunG;
end;
var
fmGame: TfmGame;
engine: TEngine;
implementation
uses uMenu;
{$R *.dfm}
procedure TfmGame.RunG;
Begin
engine := TEngine.Create(fmGame.Canvas);
End;
procedure TfmGame.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := False;
engine.Free;
fmMenu.BackInToMenu;
Hide;
end;
procedure TfmGame.FormCreate(Sender: TObject);
begin
Height := Screen.Height; Width := Screen.Width;
end;
procedure TfmGame.FormPaint(Sender: TObject);
begin
engine.ShowAll;
end;
procedure TfmGame.FormKeyPress(Sender: TObject; var Key: Char);
begin
If Key = #27 then begin
ShowCursor(True); Key := #0; Close;
end;
end;
procedure TfmGame.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
engine.MovePl(x, y);
end;
end.
Модуль uMenu.pas
unit uMenu;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfmMenu = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure BackInToMenu;
end;
var
fmMenu: TfmMenu;
implementation
uses uGame;
{$R *.dfm}
procedure TfmMenu.BackInToMenu;
Begin
Show;
End;
procedure TfmMenu.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TfmMenu.Button1Click(Sender: TObject);
begin
fmGame.Show;
Hide;
fmGame.RunG;
end;
end.