Wyszukiwanie przeciwnika
Najprostszym i chyba też najbardziej intuicyjnym sposobem
wyszukiwania wroga jest porównywanie kolejnych komórek rdzenia z komórką
zawierającą instrukcję DAT 0 0
. Jak pamiętamy, tą właśnie
instrukcją sędzia walki czyści arenę przed każdym pojedynkiem, więc
dopóki porównania nie będą wykazywać różnic, możemy mieć pewność, że
przeglądamy czystą (a więc nie zajętą przez przewnika) arenę.
wzór DAT 0 0
start CMP wzor -2
JMP alarm
JMP start <start
alarm ...
Tak właśnie działa powyższy wojownik. Przesuwa on po arenie wiązkę
skanującą tak długo, aż napotka jakąś komórkę różną od wzorca. Wtedy
przechodzi do wiersza alarm
, gdzie powinien znajdować się
kod odpowiedzialny za zaatakowanie podejrzanego obszaru. Po
przeprowadzonym ataku program powinien wrócić do wiersza
start
, aby kontynuować poszukiwania. Badanie wszystkich
komórek, jedna po drugiej, zajmuje dość dużo czasu, spróbujmy więc
zwiększyć szybkość przszukiwania kosztem, niestety, dokładności.
wzór DAT 0 0
start ADD #5 szukaj
szukaj CMP wzór 10
JMP alarm
JMP start
alarm ...
I rzeczywiście, program działa szybciej. Zauważmy teraz że właściwie
nie musimy komórek areny porównywać z naszym wzorcem. Wystarczy, jeśli
dwie dowolne komórki areny porównamy ze sobą. Gdy będą identyczne, to
najprawdopodobniej obie będą zawierać instrukcję DAT 0 0
(możliwość znalezienia dwóch identycznych komórek różnych od
DAT 0 0
możemy zaniedbać), więc nie będą nas interesować.
Znalezienie natomiast dwóch różnych komórek rodzi podejrzenie, że
przynajmniej jedna z nich należy do przeciwnika. Zapiszmy to w
Redcode:
start ADD krok szukaj
szukaj CMP -20 20
JMP alarm
JMP start
krok DAT -10 10
alarm ...
Ten skaner wyposażony jest w dwie wiązki przemiatające arenę w
przeciwnych kierunkach. Każda napotkana „nierówność” rdzenia natychmiast
uruchamia procedurę ataku zaczynającą się w linii alarm
.
Procedura ta może albo od razu ostrzelać obie podejrzane komórki, albo
najpierw zbadać, którą z nich warto zaatakować i dopiero wtedy ostrzelać
tę jedną. Inaczej będzie w tym, prawie identycznym programie:
start ADD krok szukaj
szukaj CMP 20 25
JMP alarm
JMP start
krok DAT 10 10
alarm ...
Tutaj arena przemiatana jest nie dwoma niezależnymi, ale jedną podwójną wiązką skanującą. W razie wykrycia przeciwnika nie trzeba dodatkowo sprawdzać, którą z dwóch komórek należy ostrzelać — atak zawsze będzie skierowany w okolice obu.
Opisane powyżej skanery wyszukują przeciwnika badając zawartość
całych komórek. Ponieważ wszystkie one używają w tym celu rozkazu
CMP
, często określa się je wspólnym mianem CMP-skanerów
(CMP-scanner). Oprócz nich istnieją także skanery, które
badanie poszczególnych komórek ograniczają wyłączeni do testowania ich
B-argumentów. Oczywiście tam, gdzie B-argumenty będą wyzerowane, arena
najprawdopodobniej będzie czysta, natomiast tam, gdzie ich wartości będą
różne od zera, zapewne coś będzie zapisane. Programy takie zwykle nazywa
się B-skanerami (B-field scanner, B-scanner). Oto
przykładowy, bardzo prosty B-skaner:
adres DAT 0 0
start JMZ start <adres
alarm ...
Jak widać, rozkaz JMZ
nie pozwala opuścić wiersza
start
, dopóki wiązka skanująca nie natknie się na niezerowe
pole B-argumentu. Wykorzystanie tu trybu adresowania pośredniogo
zmniejszanego do przesuwania wiązki skanera skara kod programu,
wymuszając jednocześnie bardzo dokładne (a więc powolne) badanie
rdzenia. W praktyce, podobnie, jak w przypadku CMP-skanerów, zazwyczaj
korzysta się z rozkazu ADD
lub SUB
.
start ADD #10 adres
adres JMZ start 10
alarm ...
Oczywiście wiązka skanująca nie musi przemiatać areny zawsze z tą samą dokładnością. Niektórzy wojownicy przeglądają arenę najpierw zgrubnie, a potem coraz dokładniej, zmniejszając za każdym razem skok wiązki np. o połowę. W ten sposób można przeciwnika namierzyć niemal natychmiast. Technika ta została opisana przy okazji omawiania finalistów ubiegłorocznych mistrzostw (ENTER-y 8/94, 9/94, 10/94).
O skuteczności danego skanera decyduje nie tylko sposób wyszukiwania
przeciwnika, ale również sposób prowadzenia ataku. Trzeba przecież
pamiętać, że sam fakt znalezienia jakiejś anomalii na arenie nie
świadczy jeszcze o tym, że jest to żywy kod przeciwnika. Może to być
równie dobrze rzucona przez niego bomba, jak też jego martwy kod (np.
ślad po skoczku lub robaku). Niestety, jednoznaczne określenie, czy daną
komórkę (oczywiście różną od DAT 0 0
) warto zaatakować,
jest niemożliwe. Możemy co najwyżej badać otoczenie tej komórki (jeśli
nie będzie to czysta arena, to być może trafiliśmy na coś wartego
ostrzelania) lub sprawdzić, czy zawiera ona wykonywalny rokaz. Tak można
w prosty sposób zbadać, czy zadana komórka zawiera rozkaz
DAT
:
wzór DAT 0 0
...
SUB @adres @adres
CMP wzór @adres
...