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