Tento tutorißl by m∞l zaΦßteΦnφka nauΦit vytvß°et organismy v The Life!. P°edpoklßdß se, ₧e Φtenß° umφ zßklady Pascalu a Delphi, nepo₧adujφ se ₧ßdnΘ dalÜφ specißlnφ programßtorskΘ znalosti. Tutorißl doporuΦuji prochßzet krok za krokem a opravdu d∞lat to, co se v n∞m °φkß — je to nejlepÜφ metoda, jak se nauΦit organismy efektivn∞ vytvß°et.
V zßjmu srozumitelnosti v²kladu jsou mφsty n∞kterΘ v∞ci zjednoduÜeny; pokud chcete znßt p°esn∞jÜφ technick² popis, podφvejte se do ReferenΦnφ p°φruΦky k unit∞ OrgInterface.
Organismus je ve The Life! chßpßn jako objekt, existujφcφ v n∞jakΘm
prost°edφ, kter² mß (mimo jinΘ) kontrolnφ proceduru, kterß
je spuÜt∞na v₧dy jedou b∞hem ka₧dΘho kroku simulace. V kontrolnφ procedu°e
je popsßno, co mß organismus b∞hem jednoho kroku simulace d∞lat. Procedura
je ulo₧ena v knihovn∞ DLL, kterß je umφst∞na v podadresß°i
Org
. Pokud je The Life! nap°. nainstalovßn v adresß°i
C:\Program Files\The Life!
, pak budou knihovny organism∙
nainstalovßny v adresß°i C:\Program Files\The Life!\Org
. JmΘno
souboru knihovny DLL urΦuje jmΘno druhu organismu. Pokud se organismus
jmenuje nap°. NovyOrg, pak jeho knihovna bude mφt nßzev
NovyOrg.dll.
Organismus lze technicky vzato vtvo°it v libovolnΘm programovacφm jazyce, kter² umφ kompilovat knihovny DLL. V tomto nßvodu se vÜak budu zab²vat jen tvorbou v Delphi (tφm je myÜleno Delphi 6.0, postupy by ale m∞ly fungovat s drobn²mi obm∞nami ve vÜech 32-bitov²ch verzφch tohoto v²vojovΘho prost°edφ).
K vytvo°enφ organismu musφte nejd°φve zalo₧it nov² projekt Delphi, kter²
musφ b²t ulo₧en v podadresß°i Org
. NejjednoduÜÜφm zp∙sobem,
jak to ud∞lat, je naΦtenφ p°edem p°ipravenΘ standardnφ Üablony a jejφ
ulo₧enφ pod jin²m jmΘnem.
Default.dpr
v podadresß°i Org
.Pokud dodr₧φte v²Üe uveden² postup, zobrazφ se vßm v editoru nßsledujφcφ ·sek k≤du:
library Default; uses OrgInterface; procedure OrgRun(Organism: IVLFOrganism); stdcall; begin with Organism do begin { Sem napiÜte k≤d kontrolnφ procedury. } end; end; exports OrgRequiredVersion, OrgRun; end.
Pokud si ho dob°e prohlΘdnete, zjistφte n∞kolik v∞cφ:
OrgInterface
. Tato unita
zajiÜ¥uje komunikaci mezi knihovnou a samotn²m programem
Life.exe
. Jsou v nφ deklarovßny vÜechny pot°ebnΘ konstanty,
datovΘ typy a funkce/procedury pot°ebnΘ pro b∞h kontrolnφ procedury.
P°esn² popis vÜeho, co v nφ je, najdete v Referenci.OrgRun
. Ano, sprßvn∞, jsme
u toho — toto je ona kontrolnφ procedura, nejd∙le₧it∞jÜφ v∞c na celΘm
organismu.OrgRun
knihovna exportuje jeÜt∞ proceduru
OrgRequiedVersion
. To je
internφ procedura deklarovanß v unit∞ OrgInterface
. Slou₧φ
ke zajiÜt∞nφ kompatibility verzφ Life.exe
a organismu. Jejφ
existencφ se nemusφte nijak zat∞₧ovat, pro vßs jako by tam nebyla.Ka₧d² organismus ₧ije v prost°edφ. To si lze p°edstavit jako Φtvercovou sφ¥ s rozm∞ry N╫N ΦtvereΦk∙, kde N je Φφslo od 1 do 255. Na ka₧dΘm ΦtvereΦku je n∞jakΘ (zpoΦßtku nßhodnΘ) mno₧stvφ potravy v rozsahu 0-255 a m∙₧e (ale nemusφ a zpoΦßtku tam v∙bec nenφ) tam b²t i jedna z 255 chemikßliφ. Organismy se v tomto prost°edφ pohybujφ a "₧ijφ".
Organismus mß svΘ vlastnosti a p°φkazy. Vlastnosti jsou n∞co jako prom∞nnΘ a p°φkazy jsou procedury Φi funkce. SkuteΦnß technickß implementace tohoto mechanismu do The Life! je pon∞kud slo₧it∞jÜφ, a proto to ponechßme takto trochu zjednoduÜenΘ. Vlastnosti organismu nelze m∞nit p°φmo (tzn. p°i°azenφm), ale jen nep°φmo p°es p°φkazy. Jsou tedy "read-only". Seznam vÜech vlastnostφ a p°φkaz∙ najdete v referenci. Nynφ u₧ se vrhn∞me do psanφ kontrolnφ procedury.
Zkusφme nejprve vytvo°it jednoduch² organismus. Tento organismus nebude
d∞lat nic jinΘho, ne₧ ₧e bude jφst, pokud bude jeho hmotnost menÜφ ne₧ 5
jednotek. P°φkaz na jedenφ se jmenuje Eat
a jako parametr se
zadßvß poΦet jednotek potravy, kterΘ mß organismus snφst, tj. p°emφstit z
venkovnφho prost°edφ do svΘ trßvicφ vakuoly. V tΘ m∙₧e b²t maximßln∞ 255
jednotek potravy. V programu budeme tΘ₧ pot°ebovat zjistit hmotnost
organismu, k Φemu₧ je urΦena vlastnost Mass
. Maximßlnφ
hmotnost organismu je 255 jednotek. Organismus mß takΘ energii
(Energy
). TΘ m∙₧e b²t takΘ maximßln∞ 255 jednotek (jak Φasem
zjistφte, 255 je v The Life! dost d∙le₧itΘ Φφslo). Ob∞ hodnoty mß
organismus ve chvφli svΘho vzniku nastaveny na hodnotu 0. Ale zaΦn∞me u₧ s
programem:
OrgRun
.if Mass < 5 then Eat(1);
Ale ouha, zdßnliv∞ se skoro nic nestalo. A¥ budete klikat sebevφc,
organismus v nejbli₧Üφm kroku simulace zmizφ. D∙vod je prost². Organismus
je sice najeden² (p°φkaz Eat
), ale potravu nemß organismus
p°em∞n∞nou na energii a takΘ nemß ₧ßdnou hmotnost. Obojφ je d∙vodem, proΦ
hned po prvnφm kroku simulace zahyne. Tuto chybu musφme napravit.
OrgRun
a p°epiÜte k≤d na nßsledujφcφ:if Mass < 5 then begin Eat(1); Build(1) end; if Energy < 5 then begin Eat(1); Digest(1); end;
Organismus se opravdu umφstφ do prost°edφ, a trochu povyroste. P°φkaz
Build
toti₧ zp∙sobφ ₧e se potrava, kterou mß organismus ve
vakuole, se zm∞nφ na t∞lesnou hmotu. Mno₧stvφ potravy p°edßvßme p°φkazu
jako parametr. Obdobn∞ funguje i p°φkaz Digest
, akorßt ₧e
potravu "strßvφ" a tφm p°em∞nφ na energii.
Docela d∙le₧itß v∞c, o kterΘ jsem se zatφm nezmφnil, je, ₧e p°i ka₧dΘm kroku simulace ub²vß organismu jedna jednotka energie. je to proto, ₧e jinak by se mohl jednou za ₧ivot najφst a pak u₧ jen stßt na mφst∞ a nic ned∞lat. Ub²vajφcφ energie nutφ organismus se pohybovat za potravou.
Z p°edchozφho odstavce vypl²vß, ₧e stßnφ na mφst∞ organismu k u₧itku
p°φliÜ nenφ. Organismus se pot°ebuje pohybovat, co₧ zajiÜ¥uje p°φkaz
Move
. Prvnφm parametrem je sm∞r (Direction
). Ten
se zadßvß jako prvnφ pφsmeno anglickΘho nßzvu sv∞tovΘ strany (N
= north = sever, S
= south = jih, E
= east = v²chod, W
= west = zßpad). Druh²m parametrem
je poΦet polφΦek, o kterΘ se organismus pohne. Maximßlnφ dΘlku pohybu v
jednom kroku simulace m∙₧ete zjistit pomocφ vlastnosti
MaxMoveDist
. V souΦasnΘ verzi je to 5 polφΦek. Za ka₧dΘ
polφΦko, o kterΘ se organismus pohne, se odeΦte jedna jednotka energie.
Postup bude tentokrßt jednoduch²: P°idejte k existujφcφmu k≤du nßsledujφcφ sekci:
Eat(1); Digest(1); Move(E, 1);
Pokud organismus spustφte, uvidφte, jak se pomalu pohybuje sm∞rem doprava.
Organismus by (ve svΘm vlastnφm zßjmu) m∞l mφt p°ehled o mno₧stvφ
potravy ve svΘm okolφ. Od toho je tu funkce FoodAt
. Jako
parametry si bere sou°adnice polφΦka, vzta₧enΘ relativn∞ k organismu. Pokud
je nap°. organismus na sou°adnicφch [150, 80] a organismus zavolß funkci
FoodAt
s parametry X
= -1 a Y
= 1,
je vrßcena hodnota potravy na polφΦku se sou°adnicemi [149, 81]. Ob∞
sou°adnice musφ mφt hodnotu -1, 0 nebo 1, tj. musφ to b²t polφΦko pod
organismem nebo v t∞snΘm okolφ. NejlΘpe to vyjßd°φ obrßzek:
Nynφ poupravφme Φßst k≤du, kterou jsme do procedury p°idali posledn∞. Tato Φßst bude vypadat takto:
if FoodAt(1, 0) > FoodAt(0, 0) then begin Eat(1); Digest(1); Move(E, 1); end;
Organismus se tedy bude pohybovat vpravo jen tehdy, bude-li se na polφΦku vpravo od n∞j nachßzet vφce potravy, ne₧ na polφΦku pod nφm.
Organismus mß mo₧nost zjistit svΘ sou°adnice pomocφ sv²ch vlastnostφ
X
, Y
. TaktΘ₧ si m∙₧e zjistit, jak velkΘ je
prost°edφ, v n∞m₧ se pohybuje. Vlastnosti pro zjiÜt∞nφ rozm∞r∙ se jmenujφ
MaxX
a MaxY
, a udßvajφ nejvyÜÜφ mo₧nou hodnotu
p°φsluÜn²ch sou°adnic. Nejni₧Üφ mo₧nß hodnota je udßvßna pomocφ vlastnostφ
MinX
a MinY
, kterΘ v souΦasnΘ verzi majφ v₧dy
hodnotu 0. Nynφ nßsleduje p°φklad na toto tΘma. Je jφm organismus, kter² se
p°esune do pravΘho hornφho rohu. P°ed opsßnφm uvedenΘho k≤du sma₧te vÜechen
k≤d z minul²ch p°φklad∙, kter² je v procedu°e OrgRun
.
Eat(4); Digest(3); Build(1); if X < MaxX then Move(E, 1); if Y < MaxY then Move(S, 1);
Pokud organismus spustφte, nem∙₧ete si nevÜimnout, ₧e krom∞ jinΘho nekontroluje svoji hmotnost, tak₧e Φasem naroste do podoby sluÜnΘho tlouÜtφka.
Organismus mß jako jednu ze sv²ch zßkladnφch vlastnostφ i barvu. Tu lze
zjistit vlastnostφ Color
, kterß vracφ Delphßck² typ
TColor
, a nastavit ji lze p°φkazem SetColor
.
Tento p°φkaz mß 3 parametry: hodnotu ΦervenΘ, zelenΘ a modrΘ bary, kterΘ se
smφchajφ a dajφ dohromady v²slednou barvu (je to tedy klasickΘ RGB schΘma).
Ka₧dß z t∞chto barev m∙₧e nab²vat hodnoty 0-255. TypickΘ vyu₧itφ tΘto
funkce je signalizace urΦitΘho stavu organismu. My si ukß₧eme postupn²
p°eliv z ΦernΘ do ΦervenΘ, kter² bude zßvisl² na x-ovΘ sou°adnici. K
p°edchßzejφcφmu p°φkladu p°ipojte nßsledujφcφ °ßdek k≤du:
SetColor(X, 0, 0);
V²sledek se dostavφ po spuÜt∞nφ programu. P°edpoklßdßm, ₧e p°i tvorb∞ vlastnφch organism∙ najdete i smyslupln∞jÜφ vyu₧itφ barev, ne₧ je signalizace polohy.
DalÜφ z v∞cφ, kterΘ je mo₧no o organismu zjiÜ¥ovat, je jeho stß°φ. Je to
vlastn∞ poΦet krok∙ simulace ub∞hl²ch od vzniku organismu. Vlastnost, kterß
ho udßvß se jmenuje Age
. P°i prvnφm b∞hu kontrolnφ procedury
je Age
= 0, p°i dalÜφm Age
= 1 atd. Maximßlnφ
v∞k, kterΘho mohou organismy dosßhnout najdete ve vlastnosti
MaxAge
. Pokud organismus dosßhne stß°φ MaxAge
,
umφrß. MaxAge
je nynφ nastaven na pevn∞ danou hodnotu
MaxInt
, tj. 2147483647. To je v∞k tΘm∞° neomezen², proto₧e
nap°. p°i frekvenci 1 okΘnko za sekundu by organismus zahynul stß°φm za 68
let! V budoucφch verzφch The Life! ale m∙₧e b²t vÜechno jinak a
MaxAge
m∙₧e b²t nastavitelnß u₧ivatelem.
Funkce Age
se velmi Φasto vyu₧φvß p°i kontrole
rozmno₧ovßnφ. Jedinß mo₧nß forma rozmno₧ovßnφ organism∙ v The Life!je
bun∞ΦnΘ d∞lenφ, kterΘ se vyvolßvß funkcφ DivCell
. Ob∞ bu≥ky
majφ poloviΦnφ hmotnost p∙vodnφ bu≥ky (Mass
), poloviΦnφ
mno₧stvφ potravy v trßvicφ vakuole (FoodIn
) a poloviΦnφ
energii (Energy
).
P°φklad na tyto dv∞ funkce zaΦneme tφm, ₧e sma₧eme p°φkazy v kontrolnφ procedu°e. Pak napφÜeme n∞kolik nßsledujφcφch °ßdk∙ k≤du, kterΘ zp∙sobφ nßhodn² pohyb organismu:
Eat(5); if Mass < 5 then Build(1); Digest(2); case Random(4) of 0: Move(N, 1); 1: Move(S, 1); 2: Move(W, 1); 3: Move(E, 1); end;
K tomu p°idßme k≤d, kter² zp∙sobφ rozmno₧enφ organismu, pokud je jeho v∞k 10.
if Age = 10 then DivCell;
Pokud program spustφte, velmi rychle zjistφte, ₧e organismus se za chvφli p°emno₧φ (A¥ ₧ije populaΦnφ exploze!).
P°emno₧enφ zabrßnφ jednoduch² p°φkaz Die
, kter² zp∙sobφ
·hyn organismu. P°idßme proto jeden °ßdek, kter² zp∙sobφ smrt organismu ve
v∞ku 35:
if Age = 35 then Die;
Nynφ se organismus bude udr₧ovat v poΦtu 3-4 jedinc∙.
ObΦas je pro dobrou ₧ivotosprßvu organismu nutnΘ v∞d∞t, kolik potravy se
nachßzφ v jeho trßvicφ vakuole. Od toho je funkce FoodIn
.
Potravy ve vakuole m∙₧e klasicky b²t 0-255 jednotek.
P°φkaz Spread
je opakem p°φkazu Build
, m∞nφ
toti₧ t∞lesnou hmotu zp∞t na potravu ve vakuole. P°φkaz
Secrete
je zas opΦn² p°φkaz k p°φkazu Eat
- jak
jste ji₧ jist∞ uhodli, provßdφ cosi jako "zvracenφ", tedy vyluΦovßnφ
potravy z vakuoly ven do prost°edφ. P°φklad na tyto dva p°φkazy si tady
uvßd∞t nebudeme, proto₧e jsou tΘm∞° nepou₧φvanΘ a existujφ spφÜ kv∙li
pocitu autora The Life!, ₧e vÜechny operace by m∞ly b²t vratnΘ.
Nynφ u₧ znßte celkem dost p°φkaz∙ na to, abyste mohli zaΦφt experimentovat se sv²mi vlastnφmi organismy. Tak₧e, pokud chcete, p°eruÜte te∩ Φetbu tohoto manußlu a v∞nujte se programovßnφ.
P°estßvka na aktivnφ Φinnost vyvφjenou Φtenß°em...
Pokud jste se opravdu v∞novali vlastnφm experiment∙m s The Life!, asi
jste velmi brzo zjistili, ₧e je sice hezkΘ, ₧e organismy m∙₧ou jφst,
trßvit, pohybovat se, m∞nit barvu Φi umφrat, ale co je to platnΘ, kdy₧
neum∞jφ reagovat na sebe navzßjem. A reakcφ, kterß ka₧dΘho napadne jist∞
jako prvnφ, je ·tok. Ten se realizuje p°φkazem Attack
. P°φkaz
zjistφ, jestli se pod organismem (tj. na stejnΘm polφΦku) nachßzφ jin²
organismus, a pokud ano, tak zahßjφ boj. S trochou nep°esnosti se dß °φct,
₧e vyhrßvß ten, jeho₧ souΦet hmotnosti a energie je vyÜÜφ. Pora₧en² zahyne.
P°esnΘ podmφnky v²hry a prohry se dajφ nastavit p°φmo v The Life! (dialog
Nßstroje|Mo₧nosti...). N∞kdy je mo₧nΘ, ₧e zahynou oba
organismy, proto₧e i tomu vφt∞znΘmu se sni₧uje hmotnost a energie, co₧ m∙₧e
znamenat i smrt.
Nynφ m∙₧ete p°idat na konec k≤du °φdφcφ procedury p°idat magickΘ sl∙vko
Attack;
a organismus spustit. Organismy — perte se a ₧erte se!
Po spuÜt∞nφ velmi rychle zjistφte, ₧e organismus je p∞kn² kanibal. On se
toti₧ pokusφ za·toΦit na svΘho potomka t∞sn∞ po jeho zrodu. OvÜem proto₧e
oba dva jsou stejn∞ hmotnφ a majφ stejn∞ energie, oba dva pravd∞podobn∞
zahynou. Takhle bychom to daleko nedopracovali. Nabφzφ se dv∞ °eÜenφ. Bu∩
p°φkaz Attack
p°esunout n∞kam na zaΦßtek programu, jeÜt∞ p°ed
narozenφ potomka, nebo pou₧φt funkce Species
a
OrgAt
. Funkce Species
vracφ nßzev druhu organismu
jako °et∞zec. V naÜem p°φpad∞ to bude 'Organismus1'
. Funkce
OrgAt
je obdobnß funkci FoodAt
v tom, ₧e si za
parametry bere sou°adnice vzta₧enΘ relativn∞ k organismu, akorßt ₧e mφsto
potravy vracφ °et∞zec s druhem organismu na danΘm polφΦku. V p°φpad∞, ₧e se
na polφΦku ₧ßdn² organismus nenachßzφ, vracφ prßzdn² °et∞zec. Tak, a te∩ u₧
nßle₧it∞ vybaveni znalostmi m∙₧eme p°epsat °ßdek s p°φkazem
Attack
na nßsledujφcφ:
if OrgAt(0, 0) <> Species then Attack;
Teto °ßdek ·tok podmφnφ tφm, ₧e ko°ist nenφ stejnΘho druhu, jako ·toΦφcφ organismus. Tφm jsme efektivn∞ vy°eÜili problΘm kanibalismu. Jakmile se ale naÜemu organismu p°iplete do cesty jin² organismus, bude na n∞j nemilosrdn∞ za·toΦeno.
Organismus mß mo₧nost si zjistit, kolikßtΘ je generace. D∞lß se pomocφ
vlastnosti GenCount.
Pokud p°idßte do prost°edφ nov²
organismus, bude mφt GenCount
= 0, jeho potomci
GenCount
= 1, jejich potomci GenCount
= 2
atd.
Dßle je zde mo₧nost, aby organismus vyluΦoval chemikßlie. Od toho je tu
p°φkaz Exclude
. Mß dva parametry: polom∞r kruhu, ve kterΘm mß
chemikßlii kolem sebe vylouΦit, a druh chemikßlie. Za ka₧dΘ "poskvrn∞nΘ"
polφΦko se odebφrß 1 jednotka energie. Pokud je jφ nedostatek na pokrytφ
kruhu o danΘm polom∞ru, polom∞r se zmenÜφ tak, aby mno₧stvφ energie bylo
dostaΦujφcφ. Chemikßliφ je celkem 254 (hodnoty 1-255), 0 se chßpe tak, jako
by na polφΦku ₧ßdnß chemikßlie nebyla. Pro chemikßlie existuje obdobnß
mapa, jako pro potravu, a takΘ obdobnß funkce na zjiÜ¥ovßnφ druhu
chemikßlie na danΘm polφΦku. Ta se jmenuje ChemAt
a jejφ
princip je navlas stejn² jako u FoodAt
.
Tak a te∩ n∞jak² p°φklad na GenCount
a
Exclude
. Jeliko₧ m∞ nic lepÜφho nenapadß, bude to organismus
zanechßvajφcφ za sebou chemickou stopu, p°iΦem₧ druh chemikßlie bude
vyjad°ovat Φφslo jeho generace. Samoz°ejm∞ nesmφme zapomenout na zajiÜt∞nφ
p°φsunu potravy a energie na tuto Φinnost. Proto na konec k≤du kontrolnφ
procedury p°idejte toto:
Eat(10); Digest(10); Exclude(1, GenCount);
Organismus spus¥te a uvidφte (pokud v The Life! zapnete vrstvu chemikßliφ — klßvesa C), jak se kolem organism∙ tvo°φ polφΦka r∙zn²ch barev — to jsou ony chemikßlie.
DalÜφ drobnostφ je mo₧nost zφskat nastavenφ simulace pomocφ p°φkazu
GetOptions
. Proto₧e to b∞₧n∞ nenφ pot°eba, odkß₧u vßs na jejφ
popis v referenci.
Pokud zaΦnete tvo°it slo₧it∞jÜφ organismy, p°ijdete brzy na to, ₧e je
t°eba je vybavit pam∞tφ, aby si mezi jednotliv²mi okΘnky pamatovaly r∙znΘ
veliΦiny. Tuto pam∞¥ p°edstavuje pole UR
(odvozeno od
"u₧ivatelsk² registr"). Pole mß maximßlnφ rozsah 0-255 (jako obvykle) a
jeho prvky jsou typu Integer
. Pam∞¥ je tedy urΦena k
zapamatovßnφ Φφsel (I kdy₧ p°i troÜe programßtorskΘho umu se do nφ dajφ
nacpat i pointery na r∙znΘ struktury apod. Ale to nenφ ΦistΘ, proto₧e
organismus nemß v₧dy mo₧nost p°φpadn∞ alokovanou pam∞¥ uvolnit. To ale jen
tak na okraj.). Hodnoty prvk∙ se nastavujφ p°φkazem SetUR
.,
kde jako prvnφ parametr zadßvßme index prvku pole (tj. do kterΘho z 256ti
hodnotu zapsat) a druh² parametr (typu Integer
) je hodnota
onoho prvku, kterou mu chceme p°i°adit. ZvlßÜtnostφ pole UR
je
to, ₧e se p°i p°φstupu k n∞mu pou₧φvajφ kulatΘ zßvorky ("()")mφsto
hranat²ch ("[]"), proto₧e technicky vzato je to vlastn∞ funkce.
N∞kdy na zaΦßtku ₧ivota organismu je pot°eba deklarovat, kolik
u₧ivatelsk²ch registr∙ organismus bude pou₧φvat. D∞lß se to pomocφ p°φkazu
AllocUR
, kterΘmu za parametr p°edßme poΦet registr∙. Tento
poΦet m∙₧eme kdykoliv b∞hem ₧ivota organismu zm∞nit. Proto₧e potomek
organismu d∞dφ od rodiΦe i poΦet alokovan²ch registr∙, staΦφ typicky
AllocUR
zavolat jen u "hlavnφ matky" (organismu s hodnotou
GenCount
rovnou 0).
Nynφ sma₧te k≤d kontrolnφ procedury a napiÜte mφsto n∞j tento:
if GenCount = 0 then AllocUR(2);if (Age = 0) or ((X = UR(0)) and (Y = UR(1))) then begin SetUR(0, Random(MaxX)); SetUR(1, Random(MaxY)); end; Eat(4); if Mass < 5 then Build(1); Digest(3); if X < UR(0) then Move(E, 1); if X > UR(0) then Move(W, 1); if Y < UR(1) then Move(S, 1); if Y > UR(1) then Move(N, 1); if OrgAt(0, 0) <> Species then Attack;
V²Üe uveden² k≤d h²be organismem na nastavenΘ sou°adnice. Ty nastavuje t∞sn∞ po narozenφ, nebo kdy₧ na n∞ dojede, tak nastavφ novΘ. P°idßna je i ·toΦnß Φßst. Mno₧enφ je pro jednoduchost vynechßno. Po spuÜt∞nφ bude organismus pobφhat po obrazovce sem tam.
Poslednφ specialitkou je nastavovßnφ UR
cizφch organism∙.
D∞je se tak pomocφ p°φkazu SetForeignUR
, kter² mß parametry
shodnΘ s p°φkazem SetUR
, akorßt nastavuje u₧ivatelskΘ registry
organismu, kter² je pod organismem, jeho₧ procedura te∩ b∞₧φ. Pokud tento
organismus pod sebou ₧ßdn² jin² nemß, nenastavφ se samoz°ejm∞ nic. Funkce
se pou₧φvß p°evß₧n∞ ve dvou p°φpadech: Bu∩ pro nastavovßnφ inicializaΦnφch
hodnot UR
potomk∙ nebo pro "rozhßzenφ" hodnot nep°ßtelskΘho
organismu. My si ukß₧eme prvnφ zp∙sob. JednoduÜe modifikujeme k≤d
p°edchozφho organismu tak, aby potomek dostal cφlovΘ sou°adnice u₧ urΦeny
od svΘho rodiΦe. Samoz°ejm∞ musφme pamatovat na p°φpad, ₧e organismus byl
p°idßn do prost°edφ u₧ivatelem, tudφ₧ ₧ßdnΘ rodiΦe nemß
(GenCount
= 0)
if (GenCount = 0) or ((X = UR(0)) and (Y = UR(1))) then begin SetUR(0, Random(MaxX)); SetUR(1, Random(MaxY)); end; Eat(4); if Mass < 5 then Build(1); Digest(3); if X < UR(0) then Move(E, 1); if X > UR(0) then Move(W, 1); if Y < UR(1) then Move(S, 1); if Y > UR(1) then Move(N, 1); if OrgAt(0, 0) <> Species then Attack; if Age = 10 then begin DivCell; SetForeignUR(0, Random(MaxX)); SetForeignUR(1, Random(MaxY)); end;
Cizφ registry se dajφ i Φφst pomocφ ForeignUR
(funguje
obdobn∞ jako UR
), ale tato funkce neb²vß p°φliÜ vyu₧φvßna. Ale
kdy₧ nap°φklad vφte, ₧e organismus urΦitΘho druhu si n∞kterΘm registru
pamatuje sou°adnice svΘho rodiΦe, nenφ problΘm je p°eΦφst a pak jet jeho
rodiΦe zt°eba zabφt.
PoΦet cizφch alokovan²ch registr∙ zjistφte pomocφ funkce
ForeignAllocedURCount
.
Tak to by bylo z tutorißlu vÜe. NauΦili jste se zßklady psanφ organism∙
v The Life!. TuÜφm, ₧e u₧ te∩ Vßs napadajφ desφtky nßpad∙, co ud∞lat za
"brouka". M∙₧u vßm jen pop°ßt hodn∞ Üt∞stφ do tvorby a doporuΦit vßm
prostudovßnφ si zdrojov²ch text∙ p°φklad∙ organism∙ v adresß°i Org
.
Na konec jeÜt∞ mal² bonus — kompletnφ schΘma energetick²ch a potravnφch p°esun∙ v organismu. DoporuΦuji vytisknout a p°ilepit p°ed monitor, ne₧ se s The Life! trochu nauΦφte pracovat: