Листинг файла 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.