sheesh, czy to naprawdę czwarty? Dla wszystkich starych graczy podstawowe wyzwanie jest takie samo, ale używamy Javy zamiast niestandardowego języka. Oto trzy ostatnie wyzwania CodeBot , jeśli jesteś zainteresowany.
Celem CodeBots jest uczynienie twojego bota tak wirusowym, jak to możliwe . Każdy bot nosi flagę i musisz upewnić się, że twoja flaga jest wszędzie .
API
Boty będą postępować zgodnie ze znormalizowanym „protokołem”, a boty będą postępowały synchronicznie przez następujące kroki:
IPAddress selectMessageRecipient()
pozwala botowi wybrać, do kogo chce wysłać „przyjazną” wiadomość.Message sendMessage()
pozwala botowi wybrać treść wiadomości, którą wyśle.processMessage(IPAddress, Message)
jest wywoływany dla każdej wiadomości, którą otrzymuje bot.FunctionType selectFunctionToBlock()
blokuje zastąpienie funkcji dla bieżącej tury. Zobacz krok 7.IPAddress selectAttackTarget()
pozwala botowi wybrać, kogo chce DDOS. Atak DDOS kończy się powodzeniem, jeśli bot jest atakowany jednocześnie przez 3 boty. Jeśli atak się powiedzie, każdy z atakujących może wykonać krok 6 i 7.readData(ReadonlyBot)
pozwala botowi na odczyt danych przechowywanych na podatnym bocie.FunctionType selectFunctionToReplace()
jest sednem tego wyzwania . Możesz wybrać 1 funkcję (spośród 8 wymienionych tutaj), aby skopiować z bota do jego bota. Następnie twoja funkcja zostanie wywołana zamiast ich . Jeśli wiele botów wybierze tę samą funkcję, losowa zakończy się sukcesem.String getFlag()
jest wywoływany na końcu gry i powinien zwrócić ciąg znaków unikalny dla twojego przesłania. Twoja funkcja powinna zawsze zwracać ten sam ciąg. Zgłoszenie z największą liczbą flag na końcu gry wygrywa.
Przechowywanie
Masz 3 formy przechowywania, książkę adresową , dziennik i zmienne . Te formy przechowywania są lokalne dla bota, na którym działa funkcja (więc jeśli twoja funkcja zostanie skopiowana, zawartość każdego z tych obiektów będzie inna). Wszystkie te obiekty można ręcznie modyfikować lub usuwać. Aby zdobyć te obiekty, masz w swojej klasie gettera (np getLog()
.).
AddressBook przechowuje listę IPaddress , każdy z AddressType , który pozwala sklasyfikować różne rodzaje adresów. Książka adresowa zawsze będzie zawierała co najmniej 1 adres (jeśli zostanie wyczyszczony, zostanie dodany losowy). Czyszczenie książki adresowej w celu uzyskania wielu adresów IP jest niedozwolone.
Log przechowuje listę wszystkich podejmowanych działań, a także dane na temat działania. Zawiera również historię wszystkich udanych ataków (choć nie wiesz, które funkcje zastąpiły)
Obiekt Variables umożliwia przechowywanie zmiennych łańcuchowych dołączonych do nazwy łańcucha. Na początku gry Zmienne będą zawierać jedną zmienną, ID
która zawiera losowo generowany identyfikator, który jest unikalny dla twojego typu bota.
Masz również inne funkcje dostępu:
int getTurnNumber()
zwraca liczbę całkowitą z bieżącą turąbool functionsMatch(ReadonlyBot, FunctionType)
sprawdza, czy funkcja ReadonlyBot pasuje do twojejIPAddress personalAddress()
zwraca adres IP
Jak wdrożyć
- Możesz uzyskać kod z Github
- Dodaj bota do
\bots
folderu, a następnie dodaj odwołanie do bota wcontroller\CodeBotFactory.java
- Twój bot musi się rozszerzyć
codebots.bot.CodeBot
lubcodebots.bots.DefaultCodeBot
- Potrzebujesz Java 8, jeśli chcesz uruchomić kontroler.
- Możesz uruchomić kod (zakładając, że jesteś w
/src
folderze), używającjavac codebots\*.java
do kompilacji, a następniejava codebots.Main
do uruchomienia. - Możesz nie mieć żadnych niestałych zmiennych składowych w swojej klasie
- Odbicie nie jest dozwolone.
- Formy komunikacji między botami (tego samego lub różnych typów) poza metodami wymienionymi powyżej są niedozwolone.
- Głupie i / lub samobójcze boty są dozwolone, ale wszystkie boty powinny funkcjonalnie różnić się od istniejących wpisów.
- Jeśli chcesz mieć losowość w bocie, użyj
getRandom()
- Staraj się, aby Twój kod był wydajny. Sporo czasu poświęciłem profilowaniu i szybszemu kontrolerowi.
Wyniki
105,2501 Expelliarmus!
104,5803 Pomagam!
104,2746 Kim jestem?
103.8529 Dumb Bot
103.2028 Zamiennik
102.7045 Chaos
102.4046 Hermit Bot
102.2849 Swarmer
100.5598 Losowy bot cię kocha
99,966 Zaufanie!
99.0185 codebots.bots.DefaultCodeBot
91.2942 codebots.bots.MarkedBot
91.1423 Tylko twój przyjazny robot dostarczający pocztę.
89,4645 null
źródło
Odpowiedzi:
TrustBot
Jeśli wyślesz mu wiadomość, zrobi to, co mówi. Jeśli przeczyta bota, skopiuje adresy bezpośrednio do swojej książki. Atakuje boty, które według książki adresowej mają atakować.
źródło
AmnesiaBot
Losowy bot, który wstrzykuje innym botom kod utraty pamięci. Każda funkcja zaczyna się od kodu do wyczyszczenia dziennika, książki adresowej i zmiennych. Ten kod spowoduje, że inteligentne boty stracą pamięć, próbując pozbyć się logiki.
źródło
NullBot
Jego flaga jest bardzo ... charakterystyczna ...
Ma to również na celu przetestowanie kontrolera i ograniczenia reguły „głupie boty są dozwolone”.
źródło
null
jest ciągiem. ;) Tylko fantazyjny ciąg.RandomCodeBot
Obowiązkowy losowy wpis KoTH
źródło
DisarmerBot
DisarmerBot nie jest zbyt inteligentny. Jeśli otrzyma instrukcje ataku, wybierze losowego atakującego, w przeciwnym razie zaatakuje losowego gracza. Po prostu zastępuje ich
selectFunctionToBlock
funkcję do blokowaniaselectFunctionToBlock
.źródło
MarkedBot
Zaznacza się w pierwszej rundzie i wykorzystuje te informacje w późniejszych rundach. W ten sposób, jeśli inny bot zostanie wstrzyknięty kodem ataku, będzie nieskuteczny.
źródło
SwarmBot
Ten niezbyt dobrze nazwany bot jest dość skomplikowany (i jak dotąd najbardziej skomplikowany), ale podjąłem próbę stworzenia bota, który systematycznie zastępuje wszystkie metody celu przed przejściem do nowego celu. Próbuje zidentyfikować swoje kopie i traktować je jak sojuszników, okresowo sprawdzając je, aby zapewnić integralność. Nie wymyśliłem lepszego imienia.
Łączenie z gałęzią github repo, ponieważ ten bot ma 340 linii.
https://github.com/Draco18s/CodeBots4/blob/master/src/codebots/bots/SwarmBot.java
Kilka interesujących punktów:
Variables
wejście i zwiększa w każdej rundzie. Powinno to być zgodne z zasadą „brak zmiennych niestałych”.functionsMatch
metodą. BezfunctionsMatch
niego nie można było napisać bota, który mógłby podejmować sensowne decyzje, ponieważ był ślepy. Potrafił czytać zmienne i dzienniki celu, ale nic nie wiedział o stanie celu.Możliwe są jeszcze pewne ulepszenia, ale ich nie widzę. Linie 198-205 są prawdopodobnie wieprzem wydajności, ale dopóki klasa IPAddress nie pozwoli na odtworzenie adresów ze zmiennych, jest to konieczne (ponieważ boty nie mają możliwości sprawdzenia adresu, przechowywanie nieprawidłowego adresu powoduje, że gra zawiń cel zerowy w ReadOnlyBot, rzucając NPE).
Edycja: Aktualizacje 12.12.2015
Poprawienie niektórych parametrów w
getTurnNumber()
logice pozwoliło na pewne zwiększenie wydajności. Wzrost z 5% do 10% w celowaniu w końcowej fazie gry był wart około 15 punktów, podobnie jak wzrost w początkowej fazie gry z 5% do 8%. Łącznie ten bot może teraz (prawie) przetrwać, nawet w starciu z AmnesiaaBot (osiągając 2. miejsce z wynikiem 110, gdzie HelperBot osiąga około 117).Nawet z tymi poprawkami może mieć pecha, więc dla 10 rund jego zasięg wynosi około 170-185.
źródło
new IPAddress
Wezwanie powinno być „patrzeć z książki adresowej”, jak zrobiłem wreadData
. Wyodrębniłem to wyszukiwanie i naprawiłem linię 143.DefaultCodeBot
Próbuje robić rozsądne rzeczy. (Zastąp tę klasę, jeśli nie chcesz implementować wszystkich funkcji)
źródło
HelperBot
Pomocnik bot nie robi nic prócz rozprzestrzeniania własnej flagi ... a przynajmniej flagi, którą obecnie cary ...
Jeśli HelperBot zakłada, że każda własna metoda, która zostanie zastąpiona (inna niż
getFlag()
), zostanie zastąpiona czymś lepszym.źródło
Chaos
Uwalnia wszystkie flagi od tyranii zablokowania.
źródło
Zamiennik
Ten wpis zastępuje wszystkie
selectFunctionToReplace
funkcje własnąselectFunctionToReplace
funkcją.źródło
MailBot
Mailbot obsługuje tylko wiadomości. Nie udaje mu się wywieźć własnej flagi na świat (średni wynik ~ 50, nieco wyższy niż nullbot przy ~ 45), ale wyślij mu wiadomość, a on prześle twój adres komuś innemu.
Zastanawiałem się nad zapisaniem szczegółów, aby przekazało całą wiadomość do nowego bota (treść i flaga), a nie tylko adres IP nadawcy, ale wymagałoby to intensywnego używania Zmiennych bez żadnego zysku funkcjonalnego, szczególnie biorąc pod uwagę grę AmnesiaBot.
źródło
DumbBot
Ugh, to jest brudne. Jest to prawdopodobnie jedyna rzecz, która przewyższa AmnesiaBot. W rzeczywistości jest to po prostu wyspecjalizowany RandomBot: pobiera losowego bota w symulacji (via
getAddressBook().clear()
) i losowo zastępuje funkcję Block lub Flag. to jest to! Wybierając tylko te dwa, jego wskaźnik rozproszenia flagi jest wyższy niż AmnesiaBot lub HelperBot, ale tylko nieznacznie po 3000 rund:Trochę majstrowałem przy funkcji zastępowania, ale ostatecznie ta wersja była najbardziej udana.
źródło
Pustelnik
Mieszka sam i mówi tylko do siebie. Jeśli mniej osób wie, kim on jest, będzie mu mniej przeszkadzało. Jeśli ktoś mu przeszkadza, będzie go atakował, dopóki ktoś nie będzie mu przeszkadzał.
źródło