W opustoszałym, rozdartym wojną świecie, w którym miasta zostały opanowane przez bandytów i złodziei, cywilizacja odkryła się na nowo w formie małych, odizolowanych spółdzielni przemysłowych, rozproszonych po wcześniej niezamieszkanym krajobrazie. Istnienie tych społeczności zależy od zespołów najemników zwanych „złomowcami”, którzy przeszukują nieokiełznane terytorium w poszukiwaniu cennych materiałów, które mogą sprzedać spółdzielni. Ponieważ tych materiałów jest coraz mniej, złomowanie staje się coraz trudniejszym i niebezpiecznym zawodem. Kruchych pracowników ludzkich zastąpiono w większości zdalnymi robotami, zwanymi „botami”, a typowy najemnik jest bardziej doświadczonym programistą niż uzbrojonym spawaczem. Wraz ze spadkiem ludzkiej obecności podczas złomowania, również szacunek między grupami najemników względem siebie. Boty są wyposażone nie tylko w zbieranie złomu, ale także w jego obronę, aw niektórych przypadkach siłą. Programiści botów niestrudzenie pracują nad nowymi strategiami, aby przechytrzyć rywali złomowcami, co skutkuje coraz bardziej agresywnymi botami i jeszcze innym niebezpieczeństwem dla ludzi, którzy zapuszczają się poza mury swoich społeczności.
(tak, logo jest przezabawnie przycięte)
Witamy w Skrobaczkach!
Jest to wczesna wersja skrobaczek, w której nie wdrożono zbiórki złomu i fabryk. Zasadniczo jest to „strzelanie do nich”.
Jesteś programistą najemników, którego zadaniem jest tworzenie programu do zdalnego prowadzenia botów do zwycięstwa nad rywalizującymi grupami zgarniaczy. Twoje boty to pająkowate maszyny składające się z generatorów mocy i tarcz w ich rdzeniu, otoczone wieloma dodatkami wyposażonymi w narzędzia do chwytania, cięcia i atakowania. Generator mocy jest w stanie wyprodukować 12 jednostek mocy (pu) na tik (jednostka czasu zgarniacza). Masz kontrolę nad rozkładem tej mocy pomiędzy trzy podstawowe potrzeby bota: ruch, tarcze i siłę ognia.
Boty Scrapper są wyjątkowo zwinnymi maszynami i mogą łatwo przemieszczać się nad, pod i wokół przeszkód, które napotkają. Tak więc kolizja nie jest czymś, co powinien wziąć pod uwagę twój program. Możesz dowolnie przydzielić wszystkie, niektóre lub żadne z 12pu dostępnych botowi do ruchu, pod warunkiem, że zajmujesz się liczbami całkowitymi. Przypisanie 0pu funkcjom ruchu bota unieruchomiłoby go. Przydzielenie 2pu umożliwi botowi przesunięcie 2 jednostek odległości (du) na tik, 5pu spowoduje 5du / tik, 11pu spowoduje 11du / tik i tak dalej.
Generatory tarcz twoich botów emitują bąbel energii odbijającej wokół ciała. Tarcza może odbić do 1 obrażeń przed pęknięciem, pozostawiając twojego bota odsłoniętego, dopóki jego generator tarcz nie zgromadzi wystarczającej mocy, aby zatrzasnąć tarczę z powrotem na swoje miejsce. Możesz przydzielić wszystkie, niektóre lub żadne 12pu dostępne dla twojego bota w kierunku jego tarczy. Przydzielenie 0pu tarczy bota oznacza, że nigdy nie wygeneruje tarczy. Przydzielenie 2pu pozwoliłoby botowi wygenerować nową tarczę 2 z 12 tyknięć lub raz na 6 tyknięć. 5pu spowoduje regenerację tarczy 5 na każde 12 tyknięć i tak dalej.
Tworząc ładunek w swoich laserach spawalniczych, boty mogą wystrzelić szkodliwe wiązki na krótkich dystansach z dość dokładną dokładnością. Podobnie jak generowanie tarcz, szybkość ostrzału twoich botów zależy od mocy przydzielonej ich laserom. Przydzielenie 0pu laserom bota oznacza, że nigdy nie będzie strzelał. Przydzielenie 2pu pozwoliłoby botowi wystrzelić 2 z każdych 12 tyknięć i tak dalej. Laser bota będzie podróżował, dopóki nie napotka przedmiotu lub nie rozproszy się w bezużyteczności, więc miej na uwadze przyjazny ogień. Chociaż twoje boty są dość dokładne, nie są idealne. Powinieneś spodziewać się +/- 2,5 stopnia wariancji dokładności. W miarę przemieszczania się wiązki laserowej jej cząstki są stopniowo odginane przez atmosferę, aż wiązka stanie się skutecznie nieszkodliwa przy wystarczającej odległości. Laser zadaje 1 obrażenia w punkcie zerowym i 2,5% mniej obrażeń na każdej długości bota, którą pokonuje.
Boty Scrapper są wystarczająco autonomiczne, aby obsłużyć podstawowe funkcje, ale możesz polegać na tobie, ich programiście, aby uczynić je użytecznymi jako grupa. Jako programista możesz wydać następujące polecenia dla każdego bota:
- PRZESUŃ: Określ współrzędne, w stronę których porusza się bot.
- CEL: Zidentyfikuj bota, do którego chcesz celować i strzelać, gdy pozwala na to przydział mocy.
- MOC: Rozdziel siłę między ruch, tarcze i siłę ognia.
Techniczne szczegóły gry
Istnieją trzy programy, które musisz znać. Gra Silnik jest ciężki podnośnik i dostarcza API TCP że programy odtwarzacz połączyć. Program odtwarzacza jest tym, co napiszesz. Podałem tutaj kilka przykładów z plikami binarnymi . Na koniec Renderer przetwarza dane wyjściowe z silnika gry w celu wygenerowania pliku GIF bitwy.
Silnik gry
Możesz pobrać silnik gry stąd . Gdy gra zostanie uruchomiona, zacznie nasłuchiwać na porcie 50000 (obecnie nie można go konfigurować) dla połączeń graczy. Po otrzymaniu połączenia z dwoma graczami wysyła wiadomość GOTOWĄ do graczy i rozpoczyna grę. Programy odtwarzające wysyłają polecenia do gry za pośrednictwem interfejsu API TCP. Po zakończeniu gry tworzony jest plik JSON o nazwie scrappers.json (również obecnie nie można go konfigurować). Tego używa renderer do stworzenia GIF-a gry.
Interfejs API TCP
Programy odtwarzacza i silnik gry komunikują się, przekazując ciągi JSON zakończone znakiem nowej linii z powrotem i czwartą przez połączenie TCP. Istnieje tylko pięć różnych komunikatów JSON, które można wysyłać lub odbierać.
Gotowa wiadomość
Komunikat GOTOWY jest wysyłany z gry do programów gracza i jest wysyłany tylko raz. Ten komunikat informuje program gracza o jego identyfikatorze (PID) i zawiera listę wszystkich botów w grze. PID to jedyny sposób na określenie, które boty są przyjazne przeciwko wrogom. Więcej informacji na temat pól botów poniżej.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Wiadomość Bot
Wiadomość BOT jest wysyłana z gry do programów gracza i wysyłana, gdy zmieniają się atrybuty bota. Na przykład, gdy wyświetlane są tarcze lub zmiany stanu zdrowia, wysyłany jest komunikat BOT. Bot ID (BID) jest unikalny tylko w obrębie konkretnego gracza.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Przenieś wiadomość
Komunikat MOVE jest poleceniem z programu gracza do gry (ale myśl o tym jako o poleceniu dla bota). Wystarczy zidentyfikować bota, który chcesz przenieść, i współrzędne. Zakłada się, że dowodzisz własnym botem, więc PID nie jest potrzebny.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Wiadomość docelowa
Komunikat TARGET mówi jednemu z twoich botów, aby celował w innego bota.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Wiadomość mocy
Komunikat POWER przenosi 12pu dostępnych dla twojego bota między ruchem, siłą ognia i tarczami.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
Konkurencja
Jeśli masz dość odwagi, by eksplorować nieokiełznane ziemie, weźmiesz udział w turnieju podwójnej eliminacji przeciwko swoim najemnikom. Utwórz odpowiedź dla swojego zgłoszenia i wklej kod lub podaj link do repozytorium git, gist itp. Dowolny język jest akceptowalny, ale powinieneś założyć, że nic nie wiem o tym języku, i dołącz instrukcje dotyczące uruchomienia programu. Utwórz tyle zgłoszeń, ile chcesz, i nadaj im nazwy!
Programy przykładowych graczy zostaną uwzględnione w turnieju, więc bardzo polecam przetestowanie twojego bota przeciwko nim. Turniej rozpocznie się mniej więcej dwa tygodnie po otrzymaniu czterech unikalnych zgłoszeń do programu. Powodzenia!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Inne ważne informacje
- Gra działa z prędkością 12 tyknięć na sekundę, więc nie będziesz otrzymywać wiadomości częściej niż co 83 milisekundy.
- Każdy bot ma średnicę 60du. Tarcza nie zajmuje dodatkowego miejsca. Przy dokładności +/- 2,5% szanse na trafienie bota w pewnej odległości są przedstawione na tym wykresie:
- Rozkład uszkodzenia lasera na odległość jest reprezentowany przez ten wykres:
- Dokładność bota i rozkład laserowy łączą się, aby obliczyć średnie obrażenia na strzał. Oznacza to, że średnie obrażenia zadawane przez bota, gdy strzela z pewnej odległości. Obrażenia na strzał przedstawiają ten wykres:
- Laser bota zaczyna się w połowie drogi między środkiem bota a jego krawędzią. Tak więc układanie botów spowoduje przyjazny ogień.
- Wrogie boty spawnują się mniej więcej w odległości 1440du.
- Gra kończy się, gdy minie 120 tyknięć (10 sekund) bez zadanych obrażeń.
- Zwycięzcą zostaje gracz, który ma najwięcej botów, a następnie najwięcej zdrowia po zakończeniu gry.
Zrozumienie renderowanego obrazu
- Gracz 1 jest reprezentowany przez koła, a gracz 2 przez sześciokąty.
- Kolor bota odzwierciedla jego przydział mocy. Więcej czerwieni oznacza, że więcej mocy zostało przydzielone do strzelania. Więcej niebieskiego oznacza więcej tarczy. Więcej zieleni oznacza większy ruch.
- „Dziura” w ciele bota oznacza obrażenia. Im większy otwór, tym więcej obrażeń odniesiono.
- Białe kółka otaczające bota to jego tarcza. Jeśli bot ma tarczę na końcu tury, jest pokazywana. Jeśli tarcza została rozbita przez odniesienie obrażeń, nie jest wyświetlana.
- Czerwone linie między botami przedstawiają wykonane zdjęcia.
- Po zabiciu bota wyświetlana jest duża czerwona „eksplozja”.
źródło
Odpowiedzi:
Extremist (Python 3)
Ten bot zawsze poświęca całą swoją moc na jedną rzecz: osłonę, jeśli nie jest osłonięta, poruszanie się, jeśli jest na pozycji i strzelanie w inny sposób. Pokonuje wszystkich przykładowych botów oprócz anteny śmierci.
źródło
Mniej lekkomyślny ( Idź )
Początkowo planowałem nieznacznie zmodyfikować przykładowy program Reckless Abandon, aby boty nie strzelały, gdyby przeszkadzał mi przyjazny bot. Skończyłem z botami, które wybierają nowe cele, gdy kolega jest na drodze, co, jak sądzę, jest lepsze. Pokona pierwsze dwa programy.
Kod nie jest idealny. Logika określania, czy strzał jest wyraźny, wymaga dość losowych domysłów.
Wydaje się, że nie ma mechanizmu celowania w „nikogo”. To może być dobra funkcja do dodania.
Interfejs TCP API jest przyjemny w tym, że można go odtwarzać w dowolnym języku, ale oznacza to także wiele kodów typu „Boiler Plate”. Gdybym nie był zaznajomiony z językiem, w którym napisane były przykładowe boty, prawdopodobnie nie byłbym zmotywowany do zabawy. Zbiór próbek szablonów w różnych językach byłby świetnym dodatkiem do innych repozytoriów git.
(większość następującego kodu to kopiuj / wklej z jednego z przykładowych botów)
źródło
Trigger Happy - Java 8
Trigger Happy to prosta ewolucja mojego oryginalnego, ale już nieopłacalnego bota Bombard. Jest to bardzo prosty bot, który po prostu strzela do aktualnie atakowanego wroga, jeśli jest wyraźny strzał, w przeciwnym razie wykonuje losowy spacer, aby spróbować dostać się w lepszą pozycję. Cały czas próbuje mieć tarczę.
Jednak pomimo całej swojej prostoty jest bardzo skuteczny. I z łatwością zniszczy przykładowe boty.
Uwaga: bot ma wiele błędów, np. Czasami strzela, nawet jeśli nie ma wyraźnego strzału i może nie utrzymywać tarczy ... ale nadal jest skuteczny, więc po prostu prześlij ten wpis w obecnym stanie
Death-dish vs Trigger Happy
Kod w następujący sposób:
Aby skompilować: javac TriggerHappy.java
Aby uruchomić: Java TriggerHappy
źródło