Zagraj w Kick The Can!
Chociaż Moogie jest aktualnym zwycięzcą, jeśli ktoś może zdobyć jego koronę, zachęca się go do tego
Kick the can to gra dla dzieci. Zaangażowanie jednego obrońcy i wielu atakujących. Dziś to już nie jest taka gra! Twoim zadaniem jest napisanie bota, który w to gra, aby wygrać w stylu króla wzgórza !
https://en.wikipedia.org/wiki/Kick_the_can
Istnieją pewne kluczowe różnice w tej grze. Pierwszą kluczową różnicą jest to, że gra jest wieloosobowa (5 na 5). Druga kluczowa różnica polega na tym, że oba zestawy botów mogą zabijać i eliminować wrogich graczy zarówno kopalniami, jak i rzucanymi bombami! Boty nie widzą żadnych min (niezależnie od odległości) ani graczy w odległości większej niż pięć bloków!
Mapa jest labiryntem w następujący sposób.
Ten labirynt jest generowany proceduralnie, najpierw tworząc labirynt przy użyciu algorytmu rekurencyjnego cofania z głębokości. A następnie umieszczenie pokazanych otworów (a także uczynienie labiryntu bardziej „niedoskonałym”. Labirynt ma szerokość 65 x 65 bloków i zero indeksów. W ten sposób niebieska flaga (puszka) ma 1,1, a czerwona flaga (puszka) jest przy 63, 63. Niebieska drużyna odradza się przy 2,2 i 3,3 4,4 itd. czerwona drużyna odradza się przy 62, 62 i 61, 61, 60,60 itd. Blokami w kolorze cyjan są boty w drużynie niebieskiej, i bloki w kolorze magenta to czerwone boty. Gra jest zawsze pięć na pięć. Każdy bot w zespole użyje twojego kodu (ale może przechowywać inne zmienne instancji (lub tworzyć pliki lokalne), aby śledzić stan i różnicować role.
Rozgrywka
Kopalnie można umieścić tak, jak widać na szaro. I bomby mogą być rzucane w maksymalnej odległości do czterech bloków. Podróżują przez maksymalnie cztery bloki przez ściany, a inni gracze zabijają tylko wrogów, którzy staną ci na drodze. Po każdym kroku mają 40% szans na odpadnięcie. Mają więc 100% szansy na 1 zasięg 60% na 2 zasięg 36% na 3 zasięg i 21,6% na trzy odległości Umieszczenie miny lub rzucenie bomby wymaga amunicji jednej drużyny. Zaczyna się od 0 i można ją zwiększyć, zbierając pomarańczowe pola. Zauważ, że cztery (4) z tych skrzynek z amunicją będą dogodnie wyśrodkowane. Boty są ustawione w szeregu dwóch czerwonych i dwóch niebieskich. IE RRRRRBBBBB. Zezwolenie na flagę jest dozwolone, ale uwaga: przebywanie w pobliżu flagi (tj. Mniej niż pięć bloków) powoduje spowolnienie i pozwala tylko na ruch. co trzy obroty. Arena wybiera losowy starter na każdą turę. JA.
Cel
Zaprogramuj pięć botów (każdy ma ten sam plik klasy), aby pomyślnie nawigować po labiryncie i dotykać przeciwnej puszki, uważając, aby przypadkowo nie przewrócić własnej puszki ani nie nadepnąć na minę.
Programowanie
Wpisy areny i bota są obecnie w Javie, jednak istnieje inne opakowanie dla stdin / out dla innych języków.
Kod areny zostanie udostępniony, ale oto odpowiednie szczegóły.
Klasa bota
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Dostępne kluczowe metody
Pamiętaj, że korzystanie z jakichkolwiek technik modyfikowania lub dostępu do danych, do których ogólnie nie powinieneś mieć dostępu, jest niedozwolone i spowoduje dyskwalifikację.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
Specyfikacja interfejsu otoki wejścia / wyjścia
Interfejs składa się z dwóch trybów: inicjalizacji i uruchamiania.
W trybie inicjalizacji pojedyncza ramka INIT jest wysyłana przez stdout. Specyfikacja tej ramki jest następująca:
INIT
{Team Membership Id}
{Game Map}
TINI
Gdzie: {Identyfikator członkostwa zespołu} jest pojedynczą postacią: R lub B. B oznacza drużynę niebieską, R oznacza drużynę czerwoną.
{Game Map} to seria rzędów znaków ascii reprezentujących jeden rząd mapy. Poprawne są następujące znaki ascii: F = niebieska flaga G = czerwona flaga O = otwarta przestrzeń W = ściana
Gra przejdzie następnie do wysyłania ramek gry przez standardowe wyjście do każdego bota w następujący sposób:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Gdzie:
{Ammo} to ciąg cyfr, wartość będzie wynosić 0 lub więcej {Alive Bot Count} to ciąg cyfr, wartość będzie wynosić 0 lub więcej {Box X} to ciąg cyfr reprezentujących współrzędną X bota na mapie gry. Wartość będzie wynosić 0 <= X <szerokość mapy. {Pole Y} to ciąg cyfr reprezentujących współrzędną Y bota na mapie gry. Wartość będzie wynosić 0 <= Y <Wysokość mapy. {Mapa lokalna} to seria rzędów znaków ascii reprezentujących całą mapę otaczającą bota. Poprawne są następujące znaki ascii: F = niebieska flaga G = czerwona flaga O = otwarta przestrzeń W = ściana R = czerwony bot drużyny B = niebieski bot drużyny M = moja A = amunicja
Kontroler oczekuje, że twój bot wyśle (na standardowe wyjście) odpowiedź jednokreskową w formacie:
{Action},{Direction}
Gdzie:
{Action} jest jednym z: Move Defuse Mine Throw
{Kierunek} to pojedyncza cyfra od 0 do 4 włącznie. (patrz informacje o kierunku wcześniej)
UWAGA: wszystkie ciągi zostaną rozdzielone znakiem \ n Znak końca linii.To będzie turniej eliminacyjny. Moje przykładowe boty będą uczestniczyć jako wypełniacze, ale nie przyznam sobie wygranej. W przypadku zwycięstwa jednego z moich botów, tytuł przechodzi na członka z drugiego miejsca i będzie trwać, dopóki nie będzie bota, który nie jest moim. Każdy mecz składa się z 11 rund kopnięcia puszki. Jeśli żadna z drużyn nie wygra do tego czasu pojedynku, obie zostaną wyeliminowane. Jeśli remis jest niezerowy, rozegrany zostanie jeden mecz rozstrzygający. Jeśli remis pozostanie, oba zostaną wyeliminowane. Późniejsze rundy mogą składać się z większej liczby meczów. Rozstawienie turnieju będzie oparte na liczbie głosów pozytywnych na dzień 31.07.2016 (data może ulec zmianie).
Każdy mecz trwa 4096 tur. Zwycięstwo daje jeden punkt. Remis lub przegrana zapewnia zero punktów. Powodzenia!
Zapoznaj się z kodem lub krytykuj go w tym repozytorium GitHub.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Zauważ, że nie mam tłumaczy dla zbyt wielu języków na moim komputerze i być może potrzebuję ochotników do uruchomienia symulacji na ich komputerze. Lub mogę pobrać tłumacza języka. Upewnij się, że twoje boty.
- Odpowiadaj w rozsądnym czasie (powiedz 250 ms)
- Nie uszkodzi mojej maszyny hosta
źródło
Odpowiedzi:
NavPointBot, Java 8
Bot jest biało / niebieski
Ten bot wyznacza lidera spośród przyjaznych botów w każdej ramce, która następnie przypisuje punkty nawigacyjne dla każdego bota do nawigacji.
Początkowo wszystkie boty mają obowiązek znajdowania składu amunicji, następnie dwa boty są przydzielane jako strażnicy, pozostali szukają amunicji, a następnie atakują flagę wroga.
Odkryłem, że gra jest bardzo zależna od początkowej lokalizacji zajezdni. Jako taki nie mogę powiedzieć, że ten bot jest lepszy od innych.
Biegnij z
java NavPointBot
źródło
Zoptymalizowany Pathfinder JAVA
Dzięki @Moogie za pomoc w optymalizacji mojego bałaganu w poszukiwaniu ścieżek wypełniania zalewów. Oto źródło bota. Ten facet wie, jak ważna jest obrona jego flagi. Przydziela trzech obrońców i dwóch napastników. Obrońcy trzymają się z tyłu i bronią / zbierają amunicję, dwaj atakujący podążają (dość prostą) drogą do flagi (i zbierają amunicję na środku). Zastrzelił każdego, kogo zobaczy i powinien być zaciętym rywalem. Obrońcy umieszczają miny wokół flagi i obozu, dopóki nie pozostanie opozycja, aby mogli pójść i kopnąć puszkę.
źródło