Jesteś przedsiębiorczą kropką, która chce powiększyć ziemię pod jej kontrolą. Jest to dość proste - podróżuj poza swoją obecną ziemię i zapętl się z powrotem do swojej ziemi, a wszystko w tej pętli jest teraz własnością ciebie. Ale jest w tym haczyk. Jeśli jakaś inna kropka w jakiś sposób znajdzie twoją pętlę i przekroczy ją, umrzesz.
Jeśli jeszcze tego nie próbowałeś, przejdź do Splix.io i wypróbuj grę. Użyj klawiszy strzałek, aby kontrolować swój ruch.
GIF
Źródło: http://splix.io/
Specyfika
Wszyscy gracze zaczynają od losowych pozycji na planszy 200 x 200. (Zastrzegam sobie prawo do zmiany tego :). Będziesz miał określoną liczbę ruchów, aby zebrać jak najwięcej punktów. Punkty są sumowane przez:
- Liczba graczy, których zabiłeś, wynosi 300
- Ilość ziemi, którą posiadasz na koniec rundy
To powoduje, że inni mogą ukraść twoją ziemię. Jeśli zaczną pętlę, która przecina część twojej ziemi, mogą ją przejąć. Jeśli zginiesz podczas rundy, tracisz wszystkie punkty za tę rundę.
Każda runda ma losowo wybraną grupę graczy (maksymalnie 5 unikalnych graczy) (może ulec zmianie). Każdy gracz uczestniczy w równej liczbie rund. Ostateczny wynik twojego bota zależy od jego średniej oceny na grę. Każda gra składa się z 2000 tur (również może ulec zmianie). Wszystkie boty wykonują ruchy w tym samym czasie.
Przypadki śmierci
Głowa tyłek
Obaj gracze umierają, gdy stykają się ze sobą. Jest to nadal prawdą, nawet gdy obaj gracze są na krawędzi swojego pola.
Jednak gdy tylko jeden z graczy znajduje się na jego ziemi, drugi gracz umiera.
Linia krzyżowa
W takim przypadku tylko fioletowy gracz umiera.
Nie możesz przekroczyć własnej linii.
Wyjście z planszy
Jeśli gracz spróbuje wyjść z planszy, umrze i straci wszystkie punkty.
Obszar przechwytywania
Gracz przejmie obszar, gdy będzie miał ślad i ponownie wkroczy na swoją ziemię.
Czerwony wypełnia dwie czerwone linie. Jedynym przypadkiem, w którym gracz nie wypełnia, jest sytuacja, gdy inny gracz znajduje się w pętli. Żeby było jasne, dotyczy to tylko sytuacji, gdy inny gracz jest w pętli, a nie tylko posiadanej przez niego ziemi. Gracz może przejąć ziemię od innej osoby. Jeśli gracz nie może wypełnić obszaru otoczonego szlakiem, szlak przekształca się bezpośrednio w normalny ląd. Jeśli gracz w pętli lądowej innego gracza umiera, obszar w tej pętli jest zapełniony. Za każdym razem, gdy gracz umiera, plansza jest ponownie sprawdzana pod kątem obszaru, który można wypełnić.
Dane kontrolera
Kontroler jest tutaj . Jest bardzo podobny do oryginalnej gry, ale wprowadzono niewielkie zmiany, aby lepiej pasowało do KotH i ze względów technicznych. Jest on zbudowany z @NathanMerrill „s KotHComm biblioteki , a przy znacznej pomocy ze @NathanMerrill również. Daj mi znać o wszelkich błędach, które znajdziesz w kontrolerze w pokoju rozmów . Aby zachować spójność z KotHComm, korzystałem z kolekcji Eclipse w całym kontrolerze, ale boty można pisać tylko przy użyciu biblioteki kolekcji Java.
Wszystko jest zapakowane w uberjar na stronie wydań github . Aby go użyć, pobierz go i dołącz do swojego projektu, abyś mógł go używać do autouzupełniania (instrukcje dla IntelliJ , Eclipse ). Aby przetestować swoje zgłoszenia, uruchom jar z java -jar SplixKoTH-all.jar -d path\to\submissions\folder
. Upewnij się, że path\to\submissions\folder
ma on nazwany subfoler java
i umieść tam wszystkie swoje pliki. Nie używaj nazw pakietów w swoich botach (chociaż może to być możliwe w przypadku KotHComm, to tylko trochę więcej problemów). Aby zobaczyć wszystkie opcje, użyj --help
. Aby załadować wszystkie boty, użyj --question-id 126815
.
Pisanie bota
Aby zacząć pisać bota, musisz go rozszerzyć SplixPlayer
.
Direction makeMove(ReadOnlyGame game, ReadOnlyBoard board)
- Tutaj decydujesz, który ruch chcesz wykonać. Nie może zwracać wartości null.
HiddenPlayer getThisHidden()
- Pobierz
HiddenPlayer
wersjęthis
. Przydatny do porównania bota z tablicą.
- Pobierz
enum Direction
- Wartości
East
(x = 1; y = 0)West
(x = -1; y = 0)North
(x = 0; y = 1)South
(x = 0; y = -1)
Direction leftTurn()
- Zdobądź to
Direction
, co dostaniesz, jeśli skręcisz w lewo.
- Zdobądź to
Direction RightTurn()
- Zdobądź to
Direction
, co dostaniesz, jeśli wykonasz skręt w prawo.
- Zdobądź to
ReadOnlyBoard
W tej klasie masz dostęp do tablicy. Możesz uzyskać widok lokalny (20 x 20) planszy z pokazanymi pozycjami gracza lub widok globalny (cała plansza) z informacją tylko o tym, kto jest właścicielem i zajmuje pozycje na planszy. Tutaj też otrzymujesz swoją pozycję.
SquareRegion getBounds()
- Odzyskaj rozmiar planszy.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getGlobal()
- Uzyskaj globalną mapę planszy.
MutableMap<com.nmerrill.kothcomm.game.maps.Point2D,ReadOnlySplixPoint> getView()
- Taki sam
getGlobal()
, z wyjątkiem tego, że jest ograniczony do obszaru 20 x 20 wokół twojego gracza i pokazuje pozycje gracza.
- Taki sam
Point2D getPosition(SplixPlayer me)
- Zdobądź pozycję swojego gracza. Użyj jako
board.getPosition(this)
.
- Zdobądź pozycję swojego gracza. Użyj jako
Point2D getSelfPosition(ReadOnlyBoard)
- Zdobądź swoją pozycję na tablicy. Stosowanie:
Point2D mypos = getSelfPosition(board)
- Zdobądź swoją pozycję na tablicy. Stosowanie:
ReadOnlyGame
ReadOnlyGame
zapewnia jedynie dostęp do liczby tur pozostałych w grze int getRemainingIterations()
.
ReadOnlySplixPoint
HiddenPlayer getClaimer()
- Pobierz
HiddenPlayer
wersję tego, kto żąda punktu - twierdzenie = ślad.
- Pobierz
HiddenPlayer getOwner()
- Znajdź, kto jest właścicielem punktu.
HiddenPlayer getWhosOnSpot()
- Jeśli gracz jest ustawiony w tym punkcie, zwróć jego ukrytą wersję. Działa tylko w
getLocal()
.
- Jeśli gracz jest ustawiony w tym punkcie, zwróć jego ukrytą wersję. Działa tylko w
Point2D
W przeciwieństwie do innych klas Point2D
zawartych w bibliotece KotHComm.com.nmerrill.kothcomm.game.maps.Point2D
Point2D(int x, int y)
int getX()
int getY()
Point2D moveX(int x)
Point2D moveY(int y)
Point2D wrapX(int maxX)
- Zawiń
x
wartość, aby była w zakresiemaxX
.
- Zawiń
Point2D wrapY(int maxY)
- Zawiń
y
wartość, aby była w zakresiemaxY
.
- Zawiń
int cartesianDistance(Point2D other)
- Przekłada się to na to, ile tur zajmie graczowi przejście z punktu a do punktu b.
Wsparcie Clojure
Kompilator Clojure jest dołączony do SplixKoTH-all.jar
, więc możesz używać Clojure dla swojego bota! Zobacz mój, random_bot
aby zobaczyć, jak go używać.
Debugowanie bota
Kontroler jest wyposażony w debuger, który pomaga testować strategie. Aby go uruchomić, uruchom słoik z --gui
opcją.
Aby dołączyć debuger do słoika, postępuj zgodnie z tymi instrukcjami dla IntelliJ lub tymi dla Eclipse (wersja Eclipse niesprawdzona).
Jeśli używasz debugera ze swoim kodem, możesz go użyć, aby pomóc w wizualizacji tego, co widzi twój bot. Ustaw punkt przerwania na początku makeMove
bota i upewnij się, że wstrzymuje on tylko bieżący wątek. Następnie kliknij przycisk Start w interfejsie użytkownika i przejdź przez kod.
Podsumowując:
Uruchamianie botów
Aby uruchomić boty z innymi, musisz uruchomić jar na stronie wydań. Oto lista flag:
--iterations
(-i
) <=int
(domyślnie500
)- Określ liczbę gier do uruchomienia.
--test-bot
(-t
) <=String
- Uruchamiaj tylko gry, w których znajduje się bot.
--directory
(-d
) <= Ścieżka- Katalog, z którego uruchamiane są zgłoszenia. Użyj tego, aby uruchomić swoje boty. Upewnij się, że twoje boty znajdują się w podfolderze o nazwie ścieżka
java
.
- Katalog, z którego uruchamiane są zgłoszenia. Użyj tego, aby uruchomić swoje boty. Upewnij się, że twoje boty znajdują się w podfolderze o nazwie ścieżka
--question-id
(-q
) <=int
(tylko użyj126815
)- Pobierz i skompiluj pozostałe zgłoszenia ze strony.
--random-seed
(-r
) <=int
(domyślnie losowa liczba)- Daj ziarno biegaczowi, aby boty korzystające z losowości mogły odtworzyć wyniki.
--gui
(-g
)- Uruchom interfejs debugera zamiast turnieju. Najlepiej stosować z
--test-bot
.
- Uruchom interfejs debugera zamiast turnieju. Najlepiej stosować z
--multi-thread
(-m
) <=boolean
(domyślnietrue
)- Uruchom tournoment w trybie wielowątkowym. Umożliwia to szybszy wynik, jeśli komputer ma wiele rdzeni.
--thread-count
(-c
) <=int
(domyślnie4
)- Liczba wątków do uruchomienia, jeśli dozwolonych jest wiele wątków.
--help
(-h
)- Wydrukuj komunikat pomocy podobny do tego.
Aby uruchomić wszystkie zgłoszenia na tej stronie, użyj java -jar SplixKoTH-all.jar -q 126815
.
Formatowanie postu
Aby mieć pewność, że kontroler może pobrać wszystkie boty, należy postępować zgodnie z tym formatem.
[BotName], Java // this is a header
// any explanation you want
[BotName].java // filename, in the codeblock
[code]
Nie używaj również deklaracji pakietu.
Tablica wyników
+------+--------------+-----------+
| Rank | Name | Score |
+------+--------------+-----------+
| 1 | ImNotACoward | 8940444.0 |
| 2 | TrapBot | 257328.0 |
| 3 | HunterBot | 218382.0 |
+------+--------------+-----------+
Daj mi znać, jeśli jakakolwiek część zasad jest niejasna lub jeśli znajdziesz jakieś błędy w kontrolerze w pokoju rozmów .
Baw się dobrze!
źródło
Odpowiedzi:
ImNotACoward, Java
Ten bot jest
tchórzemekspert przeżycia. Jeśli w pobliżu nie ma wroga, przejmuje część ziemi. Jeśli można bezpiecznie dotrzeć do pętli innego gracza,dźga on drugiego gracza w plecy,angażując go w pojedynek. Jeśli drugiego gracza nie można bezpiecznie zaatakować,ucieka,wykonuje strategiczne odwrót do swojej ziemi.źródło
TrapBot, Java
To chyba najprostszy bot. Wystarczy prześledzić krawędź planszy, podwajając się, aby zmniejszyć ryzyko śmierci.
źródło
random_bot, Clojure
To jest RandomBot , ale musiałem trzymać się konwencji nazewnictwa, a niektóre problemy uniemożliwiają mi użycie łącznika w nazwie, więc podkreślam, że królują!
make-move
Fn zwraca vec z pierwszym elementem byciaDirection
chcesz poruszać się, a drugi jest stan chcesz być przekazywane z powrotem do Ciebie na następnej tury. Nie używaj żadnych zewnętrznych atomów, ponieważ ten kod może uruchamiać wiele gier równolegle.źródło
HunterBot, Java
Jeden z najbardziej podstawowych botów. Przeszukuje planszę w poszukiwaniu miejsc do zabicia innych i podąża najkrótszą możliwą ścieżką, aby dostać się do pozycji zabijania. Jeśli znajduje się poza swoim terytorium, wykona losowe ruchy, dopóki nie otworzy się ponownie, aby zabić innego gracza. Ma pewną logikę, by nie dopuścić do tego, by się nad nim przebiegł, a gdy wszyscy inni gracze nie żyją, wraca do swojego domu. Po powrocie do domu po prostu idzie na mały kwadrat.
źródło