pascalabcnet/TestSuite/CompilationSamples/Bill.pas
Бондарев Иван e6e67c193c initial commit
2015-05-14 21:35:07 +02:00

146 lines
2.4 KiB
ObjectPascal

// Îòðàæåíèå øàðèêà îò ñòåíîê. Êîíñîëüíûé ðåæèì
// Äëÿ çàïóñêà ïðîãðàììû èñïîëüçóéòå Shift+F9 !!!
uses CRT;
const
// Øèðèíà ïîëÿ
w = 80;
// Âûñîòà ïîëÿ
h = 24;
var
/// Êîîðäèíàòû øàðèêà
ax,ay: integer;
/// Âåêòîð ïåðåìåùåíèÿ øàðèêà
vx,vy: integer;
/// Ìàññèâ êëåòîê ïîëÿ
a: array [1..w,1..h] of char;
/// Î÷èñòêà ìàññèâà a
procedure CleanA;
begin
for var j := 1 to h do
for var i := 1 to w do
A[i,j] := ' '
end;
/// Ñîçäàíèå ãîðèçîíòàëüíîé ñòåíû
procedure HorizWall(x,y,L: integer);
begin
for var i := x to x+L-1 do
A[i,y] := '*'
end;
/// Ñîçäàíèå âåðòèêàëüíîé ñòåíû
procedure VertWall(x,y,L: integer);
begin
for var j := y to y+L-1 do
A[x,j] := '*'
end;
/// Çàïîëíåíèå ïîëÿ ñòåíàìè
procedure Fill;
begin
CleanA;
HorizWall(1,1,w);
HorizWall(1,h,w);
VertWall(1,1,h);
VertWall(w,1,h);
HorizWall(49,9,31);
HorizWall(49,14,31);
end;
/// Ïåðåðèñîâêà ýêðàíà
procedure DrawScreen;
begin
TextColor(White);
ClrScr;
for var j := 1 to h do
for var i := 1 to w do
write(A[i,j])
end;
/// Âîçâðàùàåò True, åñëè íà ïóòè øàðèêà ïðåïÿòñòâèå
function FilledInFront: boolean;
begin
Result := (A[ax+vx,ay]<>' ') or (A[ax,ay+vy]<>' ') or (A[ax+vx,ay+vy]<>' ')
end;
/// Ìåíÿåò íàïðàâëåíèå øàðèêà
procedure ChangeDirection;
begin
if A[ax+vx,ay]<>' ' then
vx := -vx;
if A[ax,ay+vy]<>' ' then
vy := -vy;
if (A[ax+vx,ay]=' ') and (A[ax,ay+vy]=' ') and (A[ax+vx,ay+vy]<>' ') then
begin
vx := -vx;
vy := -vy
end;
Sleep(10);
end;
/// Ðèñóåò øàðèê
procedure ShowBall;
begin
GotoXY(ax,ay);
write('B');
end;
/// Ñòèðàåò øàðèê
procedure HideBall;
begin
GotoXY(ax,ay);
write(' ');
end;
/// Óñòàíàâëèâàåò âåêòîð äâèæåíèå øàðèêà
procedure SetBallCoords(x,y: integer);
begin
ax := x;
ay := y
end;
/// Óñòàíàâëèâàåò êîîðäèíàòû øàðèêà
procedure SetBallVeloc(vx0,vy0: integer);
begin
vx := vx0;
vy := vy0
end;
/// Ïåðåìåùàåò øàðèê ê ïîçèöèè (x,y)
procedure MoveTo(x,y: integer);
begin
HideBall;
SetBallCoords(x,y);
ShowBall
end;
/// Ïåðåìåùàåò øàðèê íà âåêòîð (dx,dy)
procedure MoveOn(dx,dy: integer);
begin
MoveTo(ax+dx,ay+dy);
end;
BEGIN
SetWindowTitle('Áèëëèàðä (íîñòàëüãèÿ ïî CRT)');
HideCursor;
Fill;
DrawScreen;
SetBallCoords(70,13);
SetBallVeloc(1,1);
TextColor(Yellow);
ShowBall;
repeat
Delay(20);
if FilledInFront then
ChangeDirection;
MoveOn(vx,vy);
until KeyPressed;
END.