| Posledná zmena: 26.11.2002

TVelaKor

### nové korytnačky klikaním myšou

klikanie:
Na každé kliknutie do plochy sa na tomto mieste vytvorí nová korytnačka s náhodným uhlom, hrúbky 3 a náhodnej farby. Uvedomte si, že k práve vytvorenej korytnačke máme prístup cez v.k[v.pk-1]. |
    var
      v:TVelaKor;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      v:=TVelaKor.Create; zmaz;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      v.Free;
    end;

    procedure TForm1.Image1MouseDown(...);
    begin
      v.UrobKor(X,Y,random(360));
      with v.k[v.pk-1] do begin
        HP:=3; FP:=random(256*256*256);
      end;
    end;
časovač:
Všetky korytnačky sa pomaly hýbu. |
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      v.Dopredu(3);
      v.Vpravo(6);
    end;

### Náhodná prechádzka

TKor0:
Inštancie triedy TKor0 si budú pamätať miesto kde sa "narodili" - stred a tiež pomocnú premennú r - polomer kruhu. Pri každom Dopredu korytnačka zistí, či sa od svojho stredu nevzdialila viac ako r a ak áno, vráti sa o prejdenú vzdialenosť. |
    type
      TKor0 = class(TKor)
        x0,y0,r0:real;
        constructor Create(xx,yy,rr:real);
        procedure Dopredu(d:real); override;
      end;

    constructor TKor0.Create(xx, yy, rr: real);
    begin
      inherited Create(xx,yy);
      x0:=xx; y0:=yy; r0:=rr;
    end;

    procedure TKor0.Dopredu(d: real);
    begin
      inherited;
      if vzd(x0,y0)>r0 then inherited Dopredu(-d);
    end;
vytvorenie korytnačiek:
Pomocou TVelaKor na náhodných miestach vytvorte 5 korytnačiek triedy TKor0. Potom im zadefinujte náhodné farby a hrúbku pera 3. Pozar na to, aby nemali všetky rovnakú náhodnú farbu. |
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i:integer;
    begin
      randomize; zmaz;
      v:=TVelaKor.Create;
      for i:=1 to 5 do
        v.UrobKor(TKor0.Create(random(sirka-100)+50,
                               random(vyska-100)+50,
                               random(100)+50));
      for i:=0 to v.pk-1 do
        v.k[i].FP:=random(256*256*256);
      v.HP:=3;
    end;
časovač:
V časovači sa všetky náhodne hýbu. Zamyslite sa nad tým, čo sa zmení, ak Smer budeme meniť pomocou:
      v.ZmenSmer(random(360));
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:integer;
    begin
      for i:=0 to v.pk-1 do
        v.k[i].Smer:=random(360);
      v.Dopredu(5);
    end;

### interpretovanie textového súboru korytnačkou

- v textovom súbore kresli.txt je popísaný nejaký obrázok, ktorý bude treba nakresliť niekoľkými korytnačkami
- každý riadok popisuje nejakú časť obrázka pre jednu korytnačku a má nasledovnú štruktúru (všetky čísla v súbore sú celé):

- začína tromi číslami x, y a u, ktoré pre túto korytnačku definujú počiatočnú polohu a smer natočenia v rovine;
- za tým nasleduje postupnosť čísel, ktorá popisuje postupnosť volaní metód dopredu a vpravo (budú volané striedavo – najprv dopredu a potom vpravo);
- táto postupnosť môže byť párnej aj nepárnej dĺžky;
- takto sú popísané všetky riadky – každý pre jednu korytnačku

- program najprv zadefinuje triedu TMojaKor (potomok TKor), ktorá bude obsahovať stavovú premennú 1000-prvkové celočíselné pole pre postupnosť a nejaké stavové premenné pre dĺžku a index do tejto postupnosti
- ďalej zadefinujete metódu rob, ktorá, ak sa dá, zrealizuje jeden "krok" postupnosti, t.j. jednu dvojicu Dopredu a Vpravo - ak sa krok už vykonať nedá (už sa nakreslili všetky príkazy), funkcia rob vráti false
- program najprv načíta daný súbor, vytvorí príslušný počet korytnačiek na definovaných pozíciách; pri stláčaní nejakého tlačidla vykoná jeden "krok" pre každú existujúcu korytnačku; ak niektorá korytnačka už vykonala všetky svoje príkazy, zanikne-zruší sa

definícia triedy TMojaKor:
stavové premenné:

- pole p - parametre príkazov
- pp - počet príkazov
- ix - index momentálneho príkazu

    type
      TMojaKor = class(TKor)
        p:array[1..1000] of integer;
        pp,ix:integer;
        constructor Create(var t:TextFile);
        function rob:boolean;
      end;

    constructor TMojaKor.Create(var t:TextFile);
    var
      x,y,u:integer;
    begin
      read(t,x,y,u);
      inherited Create(x,y,u);
      pp:=0; ix:=1;
      while not SeekEoln(t) do begin
        inc(pp); read(t,p[pp]);
      end;
      readln(t);
    end;

    function TMojaKor.rob:boolean;
    begin
      Result:=ix<=pp;
      if Result then begin
        Dopredu(p[ix]); inc(ix);
        if ix<=pp then begin
          Vpravo(p[ix]); inc(ix);
        end;
      end;
    end;

samotný program:
úlohu najprv vyriešime pomocou TVelaKor:

- FormCreate: do TVeleKor sa vytvorí toľko korytnačiek, koľko riadkov má vstupný súbor - každá korytnačka si pripraví svoj zoznam kresliacich povelov
- Button1Click: každá korytnačka vykoná jeden krok (metóda rob) - tie, ktoré dokreslia sa zrušia
- po dokreslení celého obrázka sa zruší aj inštancia triedy TVelaKor

    var
      v:TVelaKor;

    procedure TForm1.FormCreate(Sender: TObject);
    var
      t:TextFile;
    begin
      AssignFile(t,'kresli.txt'); Reset(t);
      v:=TVelaKor.Create;
      while not seekeof(t) do
        v.UrobKor(TMojaKor.Create(t));
      CloseFile(t);
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      with v do begin
        for i:=0 to pk-1 do
          if not TMojaKor(k[i]).rob then
            ZrusKor(i);
        Uprac;
        if pk=0 then begin
          Button1.Enabled:=false;
          Free;
          Image1.Repaint;
        end;
      end;
    end;

trieda TMojVelaKor:
teraz ju preprogramujeme pomocou TMojVelaKor:

- je to odvodená trieda od TVelaKor
- má metódu Nacitaj - načíta súbor a vytvorí korytnačky
- má metódu Rob - každá korytnačka urobí jeden krok (ak sa dá), alebo sa zruší

    type
      TMojVelaKor=class(TVelaKor)
        procedure Nacitaj(meno:string);
        procedure Rob;
      end;

    procedure TMojVelaKor.Nacitaj(meno:string);
    var
      t:TextFile;
    begin
      AssignFile(t,meno); Reset(t);
      while not seekeof(t) do
        UrobKor(TMojaKor.Create(t));
      CloseFile(t);
    end;

    procedure TMojVelaKor.Rob;
    var
      i:integer;
    begin
      for i:=0 to pk-1 do
        if not TMojaKor(k[i]).rob then
          ZrusKor(i);
      Uprac;
    end;

program:
program pre TmojVelaKor - FormCreate a Button1Click volajú metódy Nacitaj a Rob |
    var
      v:TMojVelaKor;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      v:=TMojVelaKor.Create;
      v.Nacitaj('kresli.txt');
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with v do begin
        Rob;
        if pk=0 then begin
          Button1.Enabled:=false;
          Free;
          Image1.Repaint;
        end;
      end;
    end;

© 2002 AB, KVI
blaho@fmph.uniba.sk