Traper
Drugie miejsce na II Mistrzostwach Polski w Wojnach Rzedniowych zdobył wojownik Traper autorstwa Waldemara Bartolika z Warszawy. Traper jest sprawnym programem wyposażonym w skaner przeszukujący arenę ze zmienną częstotliwością.
Głos ma autor: Pierwsze cztery linie Trapera odpowiedzialne są za jak najszybsze zlokalizowanie przeciwnika.
1. proces CMP $-55 $55
2. JMP sprawdź
3. szukaj ADD krok proces
4. JMP proces
Poszukiwanie odbywa się z krokiem zapisanym w linii 27. Punkty rozpoczęcia poszukiwania (linia 1) są tak dobrane, aby „siatka” pokrywająca arenę miała „oczko” zbliżone do połowy kroku. Po stwierdzeniu zmian na arenie następuje sprawdzenie, czy wojownik nie zlokalizował samego siebie, jeżeli tak, następuje krok do modułu odpowiedzialnego za rozpoczęcie nowych poszukiwań z mniejszym krokiem.
5. sprawdź SLT proces wzór
6. wzór JMP trop $4970
Następnie Traper zapamiętuje adresy podejrzanych komórek w linii ślad.
7. MOV proces ślad
W linii 8 sprawdzany jest rodzaj zmiany areny: prawdopodobnie bez zmian, pojedyncza bomba przeciwnika, kod przeciwnika lub więcej niż jedna bomba. W ostatnim przypadku następuje atak.
8. JMN atak <proces
Jeżeli atak nie nastąpił, celownik ustawiany jest na drugi adres.
9. SUB proces proces
10. SUB ślad proces
Tutaj ponownie następuje sprawdzenie zmian na arenie i ewentualnie atak.
11. JMN dalej <proces
Poniższy moduł odpowiedzialny jest za unieszkodliwienie przeciwnika
(przesunięcie ceilownika o 10 i rzucenie 10 podwójnych bomb
SPL/JMP
)
12. atak ADD #10 proces
13. MOV arkan <proces
14. MOV sznury <proces
15. DJN $-2 #10
16. MOV #10 $-1
17. dalej MOV ślad proces
18. JMP szukaj
Ten fragment odpowiada za trzykrotne przeszukanie areny z różnym krokiem:
19. trop MOV znów proces
20. ADD zmiana krok
21. DJN proces #3
Na tym etapie wszystkie procesy przeciwnika powinny być
unieruchomione lub bardzo spowolnione. Traper zaczyna ostrzał
areny bombami DAT
, zaczynając od nie używanej już części
swojego kodu, na wypadek, gdyby któryś z procesów przeciwnika wbudował
się w niego.
22. MOV bomba <-1
23. DJN -1 #4495
Gdyby po kasowaniu rdzenia przeciwnik nie został zniszczony, Traper wiąże się i skulony czeka na wyczerpanie limitu ciosów.
24. sznury SPL $0
25. arkan JMP $-1
Ostatnich pięć linii programu zawiera wartości pomocnicze.
26. znów CMP $-47 $47
27. krok DAT $-60 $60
28. zmiana DAT $25 $-25
29. ślad DAT $0 $0
30. bomba DAT $0 $0
Wartości liczbowe w liniach 1 i 26 były dobierane do aktualnego kroku. Rozmiar areny określił wartości w liniach 6 i 23. Wielkość kroku dobrałem biorąc pod uwagę długość Trapera oraz domniemaną długość przeciwników.
Traper, podobnie jak omówiona miesiąc temu Gisela2, ma możliwość przeszukiwania areny ze zmiennym krokiem. Nie robi tego jednak tak samo.
Jak pamiętamy, Gisela2 zmieniała krok poszukiwań przez odczytanie jego nowej wartości z wcześniej przygotowanej tablicy.
Traper natomiat po każdym przeszukaniu rdzenia zmniejsza krok o określoną stałą wartość (linia 20). Rozwiązanie to, z racji braku wydłużającej kod wojownika tablicy, jest krótsze, choć wielkość kroku nie może być ustalana tak dowolnie, jak w Giseli2.
Przyjrzyjmy się traz w jaki sposób Traper bada wykryte
zmiany rdzenia. Do sprawdzenia ma dwa adresy zapisane w linii 1 (rozkaz
CMP
). Aby stwierdzić, czy pod którymś z nich znajduje się
kod oponenta, Traper zagląda kolejno do obu podejrzanych
komórek i sprawdza, czy ich `B-argumenty są różne od zera.
Jeśli w jednej z nich B-argument będzie niezerowy, będzie to oznaczać, że coś w tym obszarze znajduje i zapewne jest to warte ostrzelania. Warto przy tym zauważyć, że owymi podejrzanymi komórkami nie są te porównywane w linii 1, lecz te położone zaraz obok. Pozwala to Traperowi na wykrywanie i nie ostrzeliwanie pojedynczych bomb.
Działanie bomb SPL $0/JMP $-1
, które Traper
miota w podejrzane rejony rdzenia, jest raczej oczywiste: trafiony
pojedynczy proces przeciwnika dzieli się na wiele procesów potomnych,
uwięzonych w dwukomórkowej przestrzeni. Uwięzione procesy poważnie
spowalniają działanie pozostałych, czyniąc z nich łatwy łup dla
Trapera, a same mogą już jedynie czekać na ostateczną
klęskę.