Magazyn Enter, listopad 1994, strona 158

Adam Ryba

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ść).