Za jídlo, šaty a vzduch otročíme na programech z temných světů

Programujeme v BASICu: Mravce

Kdybych si měl vybrat jediný programovací jazyk a ostatní byly hned druhý den zrušeny, byl by to rozhodně BASIC (pokud by to tedy nebyl BASIC z C64) – to už je ale asi z článků nazvaných „Programujeme v BASICu“ patrné. Kdykoliv mě totiž napadne něco, co bych si chtěl naprogramovat, napadne mě to nejdříve v BASICu. Nejinak tomu bylo, když jsem na webu 2dcurves.com přečetl o Langtonově mravenci.

Langtonův mravenec je dvojrozměrný Turingův stroj, který velmi dobře demostruje dynamickou komplexitu a emergenci u zdánlivě jednotlivých systémů. Mravenec se pohybuje po matici bodů a pro svůj pohyb používá následující dvě pravidla:

  • stojí-li mravenec na svítícím bodu, zhasne jej, otočí se doprava a udělá jeden krok
  • stojí-li mravenec na nesvítícím bodu, rozsvítí jej, otočí se doleva a udělá jeden krok

Toť vše, více toho není. Necháme-li ale mravence pohybovat se dostatečně dlouho, začnou se na obrazovce dít věci, jak se ostatně můžete dočíst na výše odkazované stránce na Wikipedii. Jelikož jsem chtěl mravence sám sledovat, naprogramoval jsem jej nejdříve na ZX Spectru. Po kompilaci BASICu kompilátorem ToBoS-FP byl výsledek dostatečně rychlý, abych mohl pozorovat několik tisíc kroků v přijatelném čase. Chvilku jsem se na pobíhajícího mravence díval a napadlo mě, jak by to asi vypadalo, kdyby jich na obrazovce bylo více.


DuinoMite Mini

Jelikož jsem chtěl i celé mraveniště v BASICu, ZX Spectrum jsem raději odložil a vytáhl po několika měsících z krabičky DuinoMite Mini. Na 32-bitovém jednočipu už by BASIC mohl být dostatečně rychlý, řekněme pro deset mravenců. I když je dialekt BASICu na DuinoMite odvozen od microsoftího, dá se na něm naprogramovat prakticky cokoliv. Převod zdrojáku ze Spectra byl otázkou záměny několika málo funkcí a za pár desítek minut už to jelo.

Vzhledem k tomu, že i jednotlivé obrazovky jsem ukládal přímo BASICem (tento kus kódu v níže umístěném příkladu není) a DuinoMite je při ukládání na SD kartu opravdu pomalé, ukládal jsem jen každý dvacátý snímek. I přesto vzniklo více než 6700 snímků a generování trvalo několik hodin. Z těchto snímků jsem nakonec vzal jen každý třetí a z nich poskládal video rychlostí 25fps. Dá se tak říct, že video je více než stokrát zrychlené, protože spád a střih dělají hollywoodský trhák.


10 Cls
20 xmax=479: ymax=431
40 Dim x(10): Dim y(10): Dim dir(10): Dim old(10): Dim o(10)
50 For i=0 To 9
60 x(i)=Int(Rnd()*xmax): y(i)=Int(Rnd()*ymax)
70 dir(i)=1-Int(Rnd()*2): old(i)=1-Int(Rnd()*2): o(i)=Int(Rnd()*3)
80 Next i
90 f=0
100 For i=0 To 9
110 old(i)=dir(i)
120 dir(i)=Pixel(x(i),y(i))
130 Pixel(x(i),y(i))=-1
210 If o(i)=0 Then x(i)=x(i)+1
220 If o(i)=1 Then y(i)=y(i)+1
230 If o(i)=2 Then x(i)=x(i)-1
240 If o(i)=3 Then y(i)=y(i)-1
250 If old(i)+dir(i)=2 Then o(i)=o(i)+1
260 If old(i)+dir(i)=0 Then o(i)=o(i)-1
270 If old(i)<>dir(i) And dir(i)=1 Then o(i)=o(i)-1
280 If old(i)<>dir(i) And dir(i)=0 Then o(i)=o(i)+1
290 If o(i)>3 Then o(i)=0
300 If o(i)<0 Then o(i)=3
310 If x(i)>xmax Then x(i)=0
320 If x(i)<0 Then x(i)=xmax
330 If y(i)>ymax Then y(i)=0
340 If y(i)<0 Then y(i)=ymax
350 Next i
400 GoTo 100

Zdrojový kód by mohl určitě být více optimalizován s přihlédnutím ke specifikům MMBasicu. Jde mi ale stejně jako v minulých článcích zejména o srozumitelnost principu, efektivita kódu je až na druhém místě. Takto napsaný program by měl být snadno použitelný na ostatních počítačích, jejichž BASIC podporuje grafické příkazy - dnes si tedy commodoristé a majitelé Apple I dají pauzu.

A pokud má váš počítač grafický režim umožňující barvit jednotlivé pixely, můžete zkusit přidat do chování mravenců více stavů. Nový návrh pravidel takto změněného stroje je jen na vás. Výsledek by měl stát za to.