Автор работы: Пользователь скрыл имя, 23 Января 2011 в 12:52, курсовая работа
На заре компьютерной эры очень трудно было написать большую программу, потому что возможности компьютеров были ограничены. Ограничения проистекали из объема оперативной памяти, скорости считывания информации с вторичных носителей и быстродействия процессоров. В 60-70-е годы прошлого века эффективность применения компьютеров резко возросла, цены на них стали падать, а возможности ЭВМ увеличились. В результате стало выгодно, да и необходимо создавать все больше прикладных программ повышенной сложности. В качестве основных инструментов создания программных продуктов начали применяться алгоритмические языки высокого уровня. Эти языки расширили возможности отдельных программистов и групп разработчиков, что в свою очередь привело к увеличению уровня сложности программных систем.
Простота
модификации позволяет
Для
данного проекта реализуем
Введем состояния игры для класса TEngine. Для этого вводим переменную TheEnd.
Изменим конструктор класса, чтобы при создании объекта у него устанавливалось состояние TheEnd в False.
Как
видно, изменения затронули только только
внутреннюю реализацию класса TEngine, не
затронув его внешний интерфейс.
В ходе работы над курсовым проектом были изучены основные принципы объектно-ориентированного проектирования ПО. С помощью объектно-ориентированного подхода был создан проект азартной игры «XPBall»
Модуль 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(
Application.CreateForm(
Application.Run;
end.
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.
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