Цитата:
Сообщение от 11Angelav
Помогите, пожалуйста! Как сделать, чтобы шар не заходил за границы? Я суть понимаю, а как сделать - нет.
|
Да, Анжелика, задачка-то оказалось - ой! Отладил, конечно, но в итоге какой-то монстр получился, а как иначе - не ведаю. Но уж что есть:
Код:
uses Graph, Crt;
const
r=10;
Xmin=80;
Xmax=560;
Ymin=90;
Ymax=390;
function Ball_in(Xb,Yb:Word):Boolean;
begin
Ball_in:=(Xb>=Xmin+r) and (Xb<=Xmax-r) and
(Yb>=Ymin+r) and (Yb<=Ymax-r);
end;
function Corner(Xc,Yc:Word):Boolean;
begin
Corner:=(((Xc-r)=Xmin) and ((Yc+r)=Ymax)) or
(((Xc-r)=Xmin) and ((Yc-r)=Ymin)) or
(((Xc+r)=Xmax) and ((Yc+r)=Ymax)) or
(((Xc+r)=Xmax) and ((Yc-r)=Ymin));
end;
var
x,y:Word;
dx,dy,dx1,dy1,s:Integer ;
grDriver:integer;
grMode:integer;
grPath:string;
ErrCode:integer;
begin
grDriver := VGA;
grMode:=VGAHi;
grPath:='c:\bp\bgi';
InitGraph(grDriver, grMode,grPath);
ErrCode := GraphResult;
if ErrCode <> grOk then
begin
writeln('Ошибка инициализации графического режима');
writeln('Для завершения работы нажмите <Enter>');
readln;
Halt;
end;
randomize;
x:=Xmin+r+random(Xmax-Xmin-2*r);
y:=Ymin+r+random(Ymax-Ymin-2*r);
dx:=1+random(7);
s:=random(2);
If s=0 then s:=s-1;
dx:=dx*s;
dy:=Round(Sqrt(100-Sqr(dx)));
s:=random(2);
If s=0 then s:=s-1;
dy:=dy*s;
SetBkColor(0);
Setfillstyle(1,2);
bar(Xmin,Ymin,Xmax,Ymax);
repeat
x:=x+dx;
y:=y+dy;
If Not(Ball_in(x,y)) then
begin
x:=x-dx;
y:=y-dy;
if (dx>0) and ((x+dx+r)>Xmax) then
begin
dx1:=Xmax-x-r;
dy1:=Round(dy*dx1/dx);
x:=x+dx1;
y:=y+dy1;
If Not(Ball_in(x,y)) then
repeat
x:=x-dx1;
y:=y-dy1;
dx1:=dx1-1;
dy1:=Round(dy*dx1/dx);
x:=x+dx1;
y:=y+dy1;
until Ball_in(x,y);
dx:=-dx;
end;
if (dx<0) and ((x+dx-r)<Xmin) then
begin
dx1:=Xmin-x+r;
dy1:=Round(dy*dx1/dx);
x:=x+dx1;
y:=y+dy1;
If Not(Ball_in(x,y)) then
repeat
x:=x-dx1;
y:=y-dy1;
dx1:=dx1+1;
dy1:=Round(dy*dx1/dx);
x:=x+dx1;
y:=y+dy1;
until Ball_in(x,y);
dx:=-dx;
end;
if (dy>0) and ((y+dy+r)>Ymax) then
begin
dy1:=Ymax-y-r;
dx1:=Round(dx*dy1/dy);
x:=x+dx1;
y:=y+dy1;
If Not(Ball_in(x,y)) then
repeat
x:=x-dx1;
y:=y-dy1;
dy1:=dy1-1;
dx1:=Round(dx*dy1/dy);
x:=x+dx1;
y:=y+dy1;
until Ball_in(x,y);
dy:=-dy;
end;
if (dy<0) and ((y+dy-r)<Ymin) then
begin
dy1:=Ymin-y+r;
dx1:=Round(dx*dy1/dy);
x:=x+dx1;
y:=y+dy1;
If Not(Ball_in(x,y)) then
repeat
x:=x-dx1;
y:=y-dy1;
dy1:=dy1+1;
dx1:=Round(dx*dy1/dy);
x:=x+dx1;
y:=y+dy1;
until Ball_in(x,y);
dy:=-dy;
end;
end;
SetColor(15);
SetFillStyle(1,15);
FillEllipse(x,y,r,r);
Delay(50);
SetColor(2);
SetFillStyle(1,2);
FillEllipse(x,y,r,r);
until keypressed or Corner(x,y);
If KeyPressed then ReadKey;
SetColor(15);
SetFillStyle(1,15);
FillEllipse(x,y,r,r);
delay(1000);
CloseGraph;
end.