18. príklady


Posledná zmena: 26.11.2002

Banner Text 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