Показать сообщение отдельно
Старый 06.06.2012, 12:23   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от 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.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070