uses crt, graph; var x1, x2, y1, y2, r1, r2, dx1, dy1, dx2, dy2, bgC: integer; Gd, Gm : integer; choise : integer; h : integer; procedure draw (x, y, r, c : integer); begin setfillstyle(solidfill, c); fillellipse(x, y, r, r); Setcolor (c); circle (x, y, r); end; procedure escape (x, y, r, bgC : integer); begin setfillstyle(solidfill, bgC); fillellipse(x, y, r, r); Setcolor (bgC); circle (x, y, r); end; procedure move (var x, y: integer; dx, dy : integer); begin x := x + dx; y := y + dy; end; procedure charge_on_oppositeX (var x, dx : integer); begin dx := -dx; x := x + dx; end; procedure charge_on_oppositeY (var y, dy : integer); begin dy := -dy; y := y + dy; end; Procedure border (var x, y: integer; r : integer; var dx, dy: integer); begin if (x + r >= GetMaxX-1) or (x - r <= 1) then charge_on_oppositeX(x, dx); if (y + r >= GetMaxY-1) or (y - r <= 1) then charge_on_oppositeY(y, dy); end; function ygol:real; var a : real; begin randomize; a := 3.14*(random(90))/180; ygol := a; end; function balls_hit (const r1,r2 : integer; x1,y1,x2,y2 : integer) : boolean; var dist : integer; flag : boolean; begin dist := round(sqrt(sqr(abs(x2-x1)) + sqr(abs(y2-y1)))); if dist < (r1+r2) then flag := true; balls_hit := flag; end; procedure balls_hit_2(dx, dy : integer; var x,y : integer); begin if not balls_hit(r1,r2,x1,y1,x2,y2) then begin dx := -dx; dy := -dy; x := round( x + dx*cos(ygol)); y := round( y + dy*sin(ygol)); end; end; function Menu(Params: string): integer; var Count: integer; Strings: array [0 .. 15] of string [127]; i: integer; Ch: char; X, Y, H: integer; begin Count := 1; Strings[0] := ''; for i := 1 to Length(Params) do begin if Params[i] = #13 then begin Inc(Count); Strings[Count - 1] := ''; end else begin Strings[Count - 1] := Strings[Count - 1] + Params[i]; end; end; SetTextJustify(CenterText, CenterText); H := TextHeight('A') + 10; ClearDevice; SetColor(WHITE); for i := 0 to Count - 1 do OutTextXY( GetMaxX div 2, GetMaxY div 2 - (Count - 1) * H div 2 - H div 4 + i * H, Strings[i] ); i := 0; repeat SetColor(GREEN); X := TextWidth(Strings[i]) + 10; Y := TextHeight(Strings[i]) + 10; Rectangle(GetMaxX div 2 - X div 2, GetMaxY div 2 - (Count - 1) * H div 2 + i * H - Y div 2, GetMaxX div 2 + X div 2, GetMaxY div 2 - (Count - 1) * H div 2 + i * H + Y div 2); ch := readkey; SetColor(BLACK); X := TextWidth(Strings[i]) + 10; Y := TextHeight(Strings[i]) + 10; Rectangle(GetMaxX div 2 - X div 2, GetMaxY div 2 - (Count - 1) * H div 2 + i * H - Y div 2, GetMaxX div 2 + X div 2, GetMaxY div 2 - (Count - 1) * H div 2 + i * H + Y div 2); case ch of #0: case ReadKey of #72: begin Dec(i); if i < 0 then i := Count - 1; end; #80: begin Inc(i); if i >= Count then i := 0; end; end; end; until ch = #13; Menu := i; end; begin Gd := Detect; InitGraph (Gd, Gm, ''); If GraphResult <> grOk then halt(1); settextStyle(4,0,7); Choise := Menu ('INFO'#13'Ypravlenie'#13'Moving Balls'#13'Exit'); case Choise of 0 : begin cleardevice; setcolor(3); settextstyle(4,0,3); settextjustify ( CenterText, CenterText); outTextxY ( getmaxx div 2, getmaxy div 4, 'MOVING CIRCLES'); h := Textheight('A') + 10; outtextxy( getmaxx div 2, getmaxy div 4 + h, 'Podgotovila:'); outtextxy ( getmaxx div 2, getmaxy div 4 + 2*h, 'Stydentka gr.**-11'); outtextxy(getmaxx div 2, getmaxy div 4 + h*3, '******** Marina'); outtextxy( getmaxx div 2, getmaxy div 4 + 5*h, 'Thanks for attention!'); end; 1: begin cleardevice; setcolor (3); settextstyle(4,0,3); h := textheight('A') + 10; Settextjustify(centertext, centertext); outtextxy(getmaxx div 2 - 100, getmaxy div 4, 'Red Circle:'); outtextxy(getmaxx div 2+ 100, getmaxy div 4, 'White Circle:'); end; 2: begin x1 := 50; y1 := 150; x2 := 400; y2 := 300; r1 := 40; r2 := 40; dx1 := 20; dy1 := 15; dx2 := 20; dy2 := 15; bgC := 0; Setcolor(0); rectangle (1,1, getMaxX - 1, getMaxY - 1); repeat begin draw (x1, y1, r1, white); draw (x2, y2, r2, red ); delay(15100); escape (x1, y1, r1, bgC); escape (x2, y2, r2, bgC); move (x1, y1, dx1, dy1); move (x2, y2, dx2, dy2); border (x1, y1, r1, dx1, dy1); border (x2, y2, r2, dx2, dy2); balls_hit_2(dx1, dy1, x1, y1); balls_hit_2(dx2, dy2, x2, y2); end; until keypressed; end; 3 : halt(1); else begin writeln ('FATAL ERROR! PRESS ANY KEY!'); keypressed; end; end; readkey; closegraph; end.