program pall; { Palli liikumine } uses Crt, Graph; var Seade : integer; { Graafika seade } Laad : integer; { Graafikalaad } MaxX, MaxY : word; { Maksimaalkoordinaadid ekraanil } Veakood : integer; { Graafikavea kood } MaxVarv : word; { Suurim varvinumber (valge) } VanaExitProc : Pointer; { Katkestusprotseduuri aadressi salvestamiseks } Xasp,Yasp: word; PX0, PY0, PX1, PY1 : integer; {Pohiakna koordinaadid} {$F+} procedure erilopp; {Ootamatu katkestuse korral} begin ExitProc := VanaExitProc; { Taastada katkestusprotseduuri aadress } CloseGraph; { Sulgeda graafikarezhiim } end; { erilopp } {$F-} procedure Minna_graafikasse; { Graafikarezhiimi algatamine } begin DirectVideo := False; {Keelata vahetu write/read} VanaExitProc := ExitProc;{ salvestada jooksva katkestusprots. aadress } ExitProc := @erilopp;{ seada oma katkestusprotseduur } Seade := Detect; { automaatne uuring } InitGraph(Seade, Laad, 'd:\tp\bgi'); {tee graafikafailideni} Veakood := GraphResult; { salvestada vea kood } if Veakood <> grOK then { viga? } begin Writeln('Ei saa graafikasse: ', GraphErrorMsg(Veakood)); Halt(1); end; MaxVarv := GetMaxColor; { valge } MaxX := GetMaxX; MaxY := GetMaxY; {ekraani mootmed} {et 'circle' oleks ikka ring:} getaspectratio(Xasp,Yasp); setaspectratio(Xasp,Yasp); end; { Minna_graafikasse } function juhuvarv : word; { Tagastab juhusliku lubatud varvi > 0 , st. mitte tagaplaani varvi} begin juhuvarv := Random(MaxVarv)+1; end; { juhuvarv } procedure joonistusvarv; { Valida joonistusvarv } begin SetColor(MaxVarv-1); end; { joonistusvarv } procedure aknaraam; var Aken : ViewPortType; begin joonistusvarv; SetLineStyle(SolidLn, 0, ThickWidth); GetViewSettings(Aken); with Aken do Rectangle(0, 0, x2-x1, y2-y1); SetLineStyle(SolidLn, 0, NormWidth); end; { aknaraam } procedure MaxAken; { Aknaks kogu ekraan } begin SetViewPort(0, 0, MaxX, MaxY, ClipOn); end; { MaxAken } function TextH:integer; begin TextH := TextHeight('M'); end; function TextW:integer; begin TextW := TextWidth('M'); end; procedure pohiekraan(Pealdis : string); { Teha pohiaken ja selle pealdis } begin joonistusvarv; ClearDevice; SetTextStyle(DefaultFont, HorizDir, 1); { Vaikimisi kiri } SetTextJustify(CenterText, TopText); { Pealdise paiknemine } MaxAken; { Kogu ekraan } OutTextXY(MaxX div 2, 2, Pealdis); { Valjastada pealdis } { Pohiaken } SetViewPort(0, TextH+4, MaxX, MaxY-(TextH+15), ClipOn); aknaraam; { Va"hendada pohiakent raami vorra } PX0 := 1; PY0 := TextH+5; PX1 := MaxX-1; PY1 := MaxY-(TextH+16); SetViewPort(PX0, PY0, PX1, PY1, ClipOn); end; { pohiekraan } procedure olekurida(Opetus : string); { Ekraani alumine rida } begin MaxAken; joonistusvarv; SetTextStyle(SansserifFont, HorizDir, 1); SetTextJustify(CenterText, TopText); SetLineStyle(SolidLn, 0, 3{joone paksus}); SetFillStyle(EmptyFill, 0); Bar(0, MaxY-(TextH+4), MaxX, MaxY); { Kustutada vana olekurida } Rectangle(0, MaxY-(TextH+4), MaxX, MaxY); SetLineStyle(SolidLn, 0, NormWidth); OutTextXY(MaxX div 2, MaxY-(TextH+4), Opetus); { pohiaken uuesti } SetViewPort(PX0, PY0, PX1, PY1, ClipOn); end; { olekurida } procedure kas_katkestada; { Oodata kasutaja vastust (katkestamiseks voi jatkamiseks) } const Esc = #27; var Ch : char; begin olekurida('Katkestamiseks Esc, jatkamiseks suvaline klahv '); repeat until KeyPressed; Ch := ReadKey; if ch = #0 then ch := readkey; { funktsionaalklahvi tuvastamiseks } if Ch = Esc then Halt(0) { lopetada programmi taitmine } end; { kas_katkestada } procedure Liikumine; { Liikuva kujundi naitamine } label L; const r = 20; {Palli raadius} s = 3; {samm} k = 3; {kiirus} StartX = 100; StartY = 50; var SammX, SammY : integer; AknaInfo : ViewPortType; procedure juhusamm; { Muuta SammX ja SammY juhuslikult } var x:integer; begin {eelmine samm *1 voi *(-1)} SammY := SammY*(Random(2)*2-1); SammX := SammX*(Random(2)*2-1); end; {juhusamm} procedure PalliKoht(var X, Y : integer; Laius, Korgus : integer); {arvutab uued X,Y } begin X := X + SammX*k; Y := Y + SammY*k; { Panna Pall porkuma aknaraamist } GetViewSettings(AknaInfo); with AknaInfo do begin if (x1 + X + Laius - 1 > x2) then begin X := x2-x1 - Laius + 1; juhusamm; end else if (X < 0) then begin X := 0; juhusamm end; if (y1 + Y + Korgus - 1 > y2) then begin Y := y2-y1 - Korgus + 1; juhusamm end else if (Y < 0) then begin Y := 0; juhusamm end; end; end; { PalliKoht } var Paus : word; Pall : pointer; X, Y : integer; ulx, uly : word; lrx, lry : word; Maht : word; I : word; begin ClearDevice; MaxAken; ClearDevice; pohiekraan('Liikuv pall'); olekurida('Vajuta suvalist klahvi (Esc katkestab) '); GetViewSettings(AknaInfo); { Joonistada pall } juhuvarv; Circle(StartX, StartY, r); SetFillStyle(SolidFill, juhuvarv); FloodFill(StartX+1, StartY+4, GetColor); { Lugeda palli kujutis mallu } ulx := StartX-r; uly := StartY-r; lrx := StartX+r; lry := StartY+r; Maht := ImageSize(ulx, uly, lrx, lry); GetMem(Pall, Maht); GetImage(ulx, uly, lrx, lry, Pall^); kas_katkestada; { demonstreerida palli } {kustutada palli kujutis:} PutImage(ulx, uly, Pall^, XORput); { Teha taevata"hed } for I := 1 to 1000 do PutPixel(Random(MaxX), Random(MaxY), juhuvarv); X := StartX; Y := StartY; Paus := 27; { palli liikumine } Sammx := s; SammY := s; repeat PutImage(X, Y, Pall^, XORput); { manada pall } Delay(Paus); PutImage(X, Y, Pall^, XORput); { kustutada pall } PalliKoht(X, Y, lrx - ulx + 1{laius}, lry - uly + 1{korgus}); until KeyPressed; FreeMem(Pall, Maht); kas_katkestada; end; { Liikumine } procedure Lopukaader; var AknaInfo : ViewPortType; begin pohiekraan(''); GetViewSettings(AknaInfo); SetTextStyle(GothicFont, HorizDir, 4); SetTextJustify(CenterText, CenterText); with AknaInfo do begin SetWriteMode(NormalPut); OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'Kogu lugu!'); SetTextStyle(TriplexFont, VertDir, 4); OutTextXY(x1+12, (y2-y1) div 2, 'Kogu lugu!'); SetTextStyle(SmallFont, VertDir, 4); OutTextXY(x2-TextH-3, (y2-y1) div 2, 'Kogu lugu!'); end; olekurida('Vajuta suvalist klahvi '); repeat until KeyPressed; end; { Lopukaader } begin { program } Minna_graafikasse; Randomize; Liikumine; Lopukaader; CloseGraph; end.