Skoczki, skoczki, skoczki
Dzisiaj wrócimy do przeglądania podstawowych technik walki, a w centrum naszego zainteresowania znajdzie się Skoczek, nazywany również Impem.
; Skoczek
start MOV 0 1
END start
Jak widać, jest to program niesłychanie prosty. Jego jedyna
instrukcja przepisuje samą siebie do następnej komórki (pod adres
start + 1
), podsuwając sędziemy swoją kopię do wykonania w
następnym cyklu. Sędzie robiąc to, przepisuje ją o jedną komórkę dalej,
znów ją wykonuje… i tak w nieskończoność. W rezultacie Skoczek
porusza się po arenie pozostawiając za sobą ślad w postaci rozkazów
MOV
. Jeśli teraz napotka na swej drodze wrogi program, bez
skrupułów błyskawicznie wdepcze go w arenę i zamieni w skoczka.
Skoczek najczęście osiąga remis. Nieczęsto się zdarza mu wygrać walkę, ale i rzadko kiedy przegrywa. Jest on w końcu, z racji swej ruchliwości i niewielkich rozmiarów, przeciwnikiem dość trudnym, choć nie niemożliwym do pokonania.
Klasyczny skoczek liczy sobie jedną instrukcję. Nic nie stoi jednak na przeszkodzie, aby go nieco wydłużyć, powiedzmy do dwóch rozkazów:
; Skoczek-2
start MOV 0 2
MOV 0 2
END start
Albo nawet trzech:
; Skoczek-3
start MOV 0 3
MOV 0 3
MOV 0 3
END start
Te kilkuogniwowe gąsienice zachowują się na arenie dokłądnie tak samo, jak „zwykłe” skoczki, tzn. starają się przeciwnika zadeptać. Wyniki zazwyczaj mają jednak nieco gorsze, gdyż są po prostu większe i łatwiej je trafić.
Ciekawą odmianą skoczka jest Torpeda:
; Torpeda
start MOV 0 <2
END start
Wojownik ten zmniejsza B-argument komórki o adresie 2 i kopiuje się
pod uzyskany w ten sposób adres. Jeśli więc rdzeń przed Torpedą
jest czysty, w komórce tej będzie DAT 0 0
(po zmniejszeniu
DAT 0 -1
) i w konsekwencji rozkaz MOV
przepisze siebie pod adres 1 (bo 2 - 1 = 1). Po czystej arenie
Torpeda porusza się tak samo, jak Skoczek, jednak
zwykle ginie, gdy tylko natknie się na jakąkolwiek komórkę z niezerowym
B-argumentem (może to być zarówno kod przeciwnika, jak i np. rzucona
bomba).
Torpeda jako samodzielny żołnierz nie jest groźnym przeciwnikiem, może się jednak przydać jako dodatkowy proces z jednego względu. Otóż, gdy Torpeda natknie się na kod przeciwnika, to zanim zginie zmniejszy B-argument jego pierwszego rozkazu, czy może zakłócić jego pracę. Po odpaleniu torpedy procesu możemy mieć pewność, że w końcu zginie, i że przy tym nam samym nie zaszkodzi, czego nie da się powiedzieć o skoczku. Poza tym zawsze można rozrzucać torpedy po rdzeniu jako bomby-pułapki. Do obrony przed storpedowaniem całkowicie wystacza poniższa sekwencja umieszczona na początku programu:
DAT 0 0
DAT 0 500
Wszystkie przedstawione do tej pory skoczki działały w pojedynkę, tzn. same sobie podsuwały rozkazy do wykonania. Wyobraźmy sobie teraz kilka skoczków ustawionych w różnych punktach areny (odległości między nimi muszą być równe), z których każdy podsuwa swój kod następnemu. Tak właśnie działają spirale skoczków (imp-spiral). W każdym punkcie spirali może działać jeden lub więcej procesów. Dla przykładu, trzypunktowa spirala z sześciowa procesami (po dwa w każdym punkcie) będzie pracować według poniższej sekwencji:
A MOV 0 d ;kopiuj się pod B
B MOV 0 d ;kopiuj się pod C
C MOV 0 d ;kopiuj się pod A+1
A+1 MOV 0 d ;kopiuj się pod B+1
B+1 MOV 0 d ;kopiuj się pod C+1
C+1 MOV 0 d ;kopiuj się pod A+2
A
, B
i C
to adresy trzeba
punktów spirali, d
zaś to odległość między nimi. W
trzypunktowej spirali d=(rozmiar_rdzenia/3)+1
. Najprostszą
formą spirali, posiadającą po jednym procesie w każdym punkcie, jest
pierścień skoczków (imp-ring). Program tworzący mały,
dwupunktowy pierścień może wyglądać np. tak:
; Pierścień
rdzeń = 5000
krok = (rdzeń/2) + 1
start MOV skoczek skoczek+krok-1
SPL skoczek+krok-1
skoczek MOV skoczek krok
END start
Na koniec klasyczny generator skoczków, Imp-gun. Funkcjonuje on inaczej niż np. Zaraza. Imp-gun nie trudzie się z rozrzucaniem skoczków po arenie, po prostu trzyma sobie jednego i co chwila go ożywia.
; Imp-gun
start SPL imp
JMP start
imp MOV 0 1
END start
Aby zmienić intensywność wysyłania skoczków można po linii
start
wstawić kilka instrukcji SPL imp
(większa intensywność) lub JMP 1
(mniejsza
intensywność).