{$N+} uses graph,crt; type Txy = record x,y:double; end; const rabbit_vector_set_type = 2; { 1: use rabbit_angel and rabbit_speed, 2: use rabbit_run_vector} rabbit_start : Txy = ( x:50; y:100); rabbit_angel = -20; rabbit_speed = 0.2; rabbit_run_vector : Txy = ( x:0.2; y:0.05); dog_start : Txy = ( x:100; y:450); dog_speed=0.25; _delay=100; type TPixel=object public trace:boolean; procedure init(vcoords, vvector:Txy;vcolor:byte); procedure setvector(vvector:Txy); procedure move; procedure show; procedure hide; function x:double; function y:double; private visible:boolean; coords, vector:Txy; color,bgcolor:byte; end; procedure TPixel.init(vcoords, vvector:Txy;vcolor:byte); begin coords:=vcoords; vector:=vvector; bgcolor:=getpixel(round(coords.x),round(coords.y)); trace:=false; color:=vcolor; visible:=false; end; procedure TPixel.move; var lx, ly : word; begin lx:=round(coords.x); ly:=round(coords.y); coords.x := coords.x + vector.x; coords.y := coords.y + vector.y; bgcolor := getpixel(round(coords.x), round(coords.y)); if visible then if trace then begin setcolor(color); line(lx,ly,round(coords.x),round(coords.y)); end else begin putpixel(lx, ly, bgcolor); putpixel(round(coords.x), round(coords.y), color); end; end; procedure TPixel.show; begin if not visible then begin visible:=true; bgcolor := getpixel(round(coords.x), round(coords.y)); putpixel(round(coords.x), round(coords.y), color); end; end; procedure TPixel.hide; begin if visible then begin visible:=false; putpixel(round(coords.x), round(coords.y), bgcolor); end; end; procedure TPixel.setvector(vvector:Txy); begin vector:=vvector; end; function TPixel.x:double; begin x:=coords.x; end; function TPixel.y:double; begin y:=coords.y; end; var gd,gm:integer; exit:boolean; c:char; rabbit_vector, dog_vector:Txy; rabbit, dog: TPixel; function get_dog_vector(var dog_vector:Txy):boolean; var vector:Txy; len:double; begin vector.x := rabbit.x - dog.x; vector.y := rabbit.y - dog.y; len:= sqrt( sqr(vector.x) + sqr(vector.y) ); if len > dog_speed then begin vector.x := vector.x / len; vector.y := vector.y / len; vector.x := vector.x * dog_speed; vector.y := vector.y * dog_speed; get_dog_vector:=true; end else get_dog_vector:=false; dog_vector := vector; end; begin gd:=detect; initgraph(gd,gm,'d:\install\bpw'); if rabbit_vector_set_type = 1 then begin rabbit_vector.x := rabbit_speed*sin(rabbit_angel*2*pi/360+pi/2); rabbit_vector.y := rabbit_speed*cos(rabbit_angel*2*pi/360+pi/2); end else if rabbit_vector_set_type = 2 then begin rabbit_vector := rabbit_run_vector; end else halt; rabbit.init(rabbit_start, rabbit_vector, 10); dog_vector.x:=0; dog_vector.y:=0; dog.init(dog_start, dog_vector, 11); outtextxy(8,8,'Peass any key...'); repeat until keypressed; setfillstyle(0,0); bar(0,0,getmaxx,getmaxy); rabbit.show; dog.show; dog.trace:=true; repeat delay(_delay); rabbit.move; exit := not get_dog_vector(dog_vector); dog.setvector(dog_vector); dog.move; if (rabbit.x>640) or (rabbit.x<0) or (rabbit.y>480) or (rabbit.y<0) then exit:=true; if keypressed then begin c:=readkey; if (c=#17) or (c=#27) then exit:=true; end; until exit; outtextxy(8,8,'Done!'); repeat until keypressed; end.