Tutorißl k vytvß°enφ organism∙

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.

Obsah

1. Φßst

2. Φßst

Co je to organismus?

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φ).

Zalo₧enφ projektu

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.

Postup

  1. Spus¥te Delphi.
  2. Zvolte File|Open... a vyberte soubor Default.dpr v podadresß°i Org.
  3. Zvolte File|Save Project As... a napiÜte jmΘno svΘho organismu. To smφ obsahovat jen pφsmena, Φφsla a podtr₧φtko ("_"), p°iΦem₧ prvnφ znak smφ b²t jen pφsmeno nebo podtr₧φtko (pravidla jsou tedy shodnß jako pravidla pro identifikßtor v Object Pascalu). Pro zaΦßtek zvolte jmΘno Organismus1.

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

  1. Je to knihovna DLL. Na tom nenφ nic p°ekvapivΘho, proto₧e jak bylo °eΦeno v ·vodu, organismy jsou tvo°eny knihovnami DLL.
  2. Pou₧φvß se unita 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.
  3. Nachßzφ se tu procedura OrgRun. Ano, sprßvn∞, jsme u toho — toto je ona kontrolnφ procedura, nejd∙le₧it∞jÜφ v∞c na celΘm organismu.
  4. Krom∞ 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.

Prost°edφ

Ka₧d² organismus ₧ije v prost°edφ. To si lze p°edstavit jako Φtvercovou sφ¥ s rozm∞ry NN Φ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φ".

Vlastnosti a p°φkazy

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.

╚φm zaΦφt? Jφdlem!

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:

Postup

  1. Naje∩te na °ßdek s komentß°em v procedu°e OrgRun.
  2. Komentß° sma₧te a mφsto n∞j napiÜte:
if Mass < 5 then Eat(1);
  1. Stiskn∞te F9. Tφm se organismus zkompiluje a spustφ se The Life!
  2. Klikn∞te lev²m tlaΦφtkem myÜi na tlaΦφtku P°idat organismus. Objevφ se seznam, ze kterΘho vyberte jmΘno vaÜeho organismu (pokud jste se d∙sledn∞ dr₧eli tutorißlu, m∞lo by to b²t Organismus1).
  3. Klikn∞te kdekoli na ₧lutohn∞dΘ "Üachovnici". Tφm se organismus, kter² jste p°edtφm vybrali v menu, p°idß do prost°edφ.

EnergetickΘ pot°eby

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.

Postup

  1. UkonΦete The Life! — objevφ se zas editor Delphi.
  2. V procedu°e 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;
  1. Stiskn∞te F9 a opakovßnφm p°edeÜlΘho postupu p°idejte organismus do prost°edφ.

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.

Pohybem ku zdravφ

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.

V∞d∞t o potrav∞ je skoro stejn∞ d∙le₧itΘ jako ji mφt

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:

Organismus a relativnφ sou°adnice

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.

Sou°adnice + kam a₧ m∙₧u?

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.

BarviΦky

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.

Stß°φ a mlßdφ

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!).

Bun∞ΦnΘ harakiri

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

Pßr drobnostφ

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


NejlepÜφ obrana je ·tok

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!

Kdo jsem a kdo je to pode mnou?

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.

Pßr drobnostφ podruhΘ

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.

Bun∞Φnß pam∞¥

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.

Cizφ pam∞¥ taky pam∞¥

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.

Zßv∞r

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:

SchΘma energetick²ch a potravnφch p°esun∙ v organismu