Wprowadzenie
Podczas piątej KOTH przedstawiam wam wyzwanie oparte na znanej grze Battleship z kilkoma zwrotami akcji. Będziesz dowodził tylko jednym statkiem, którego typ będziesz mógł wybierać spośród 5 „tradycyjnych” klas, ale będziesz mógł podejmować wiele akcji w każdej turze, w tym w ruchu! Jest to rozgrywane jako FFA (Free For All), a Twoim celem będzie bycie ostatnim stojącym statkiem.
Zasada
Gra jest turowa. Na początku gry musisz wybrać klasę swojego statku. Następnie w każdej turze gracze będą mogli wykonać kilka akcji w zależności od statku.
Gra odbywa się na siatce 2D (X, Y), której bok jest określony w ten sposób:
X = 30 + numberOfPlayer
Y = 30 + numberOfPlayer
Pozycja początkowa każdego statku jest losowa.
Kolejność gry jest losowa w każdej turze i nie będziesz znać swojej pozycji w „kolejce” ani liczby graczy. Gra trwa 100 tur lub dopóki nie pozostanie przy życiu tylko jeden statek.
Za każdym razem, gdy trafisz wrogi statek lub zostaniesz trafiony, zdobędziesz lub stracisz punkty. Gracz z najwyższym wynikiem wygrywa. Zwycięzca otrzyma nagrodę (wartość zależy od liczby uczestników).
Kontroler udostępnia dane wejściowe za pomocą argumentów poleceń, a program musi wyświetlać dane wyjściowe za pomocą standardowego wyjścia.
Składnia
Pierwsza tura
Twój program zostanie wywołany raz bez żadnych argumentów. Musisz wybrać liczbę całkowitą od 1 do 5 (włącznie), aby wybrać swój statek:
1
: Niszczyciel [długość: 2, ruchy / obrót: 3, strzały / obrót: 1, zasięg: 9, miny: 4]
Umiejętność : Bezpłatne obroty statku (bez czasu odnowienia)
2
: Okręt podwodny [długość: 3, ruchy / obrót: 2, strzały / obrót: 1, zasięg: 5, miny: 4]
Umiejętność : Potrafi pogrążyć / nawrócić (patrz wyniki). Pod wodą możesz korzystać tylko z akcji „Ruch” i można to zobaczyć tylko podczas skanowania. Nie możesz zostać trafiony strzałem, ale możesz przyjąć obrażenia od min.
3
: Krążownik [długość: 3, ruchy / obrót: 1, strzały / obrót: 2, zasięg: 9, miny: 2]
Umiejętność : Może naprawić (patrz wyniki)
4
: Pancernik [długość: 4, ruchy / tura: 1, strzały / tura: 3, zasięg: 7, miny: 1]
Umiejętność : Może osłonić (patrz wyniki)
5
: Przewoźnik [długość: 5, ruchy / obrót: 1, strzały / obrót: 1, zasięg: 7, miny: 3]
Umiejętność : Strzały zadają celowi obrażenia obszarowe (obszar zasięgu). Jeśli cel zostanie trafiony strzałem, uszkodzone zostaną również do 2 komórek tego statku.
Okazuje
Wejście
Za każdym razem, gdy wywoływany jest twój program, będzie on otrzymywał argumenty w następującym formacie:
Round;YourPlayerId;X,Y,Direction;Hull;Moves,Shots,Mines,Cooldown;Hits,Sunken,Damage;Underwater,Shield,Scan;Map
Rundy są indeksowane 1.
Przykładowe dane wejściowe
1;8;1,12,0;111;1,2,2,0;0,0,0;0,0,0;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.O.....UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUXXXX.......UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
Tutaj jest pierwsza runda, jesteś graczem 8.
Twój statek jest ustawiony na (X = 1, Y = 12), a twój kierunek jest w kierunku góry (0 = Góra, 1 = Prawo, 2 = Dół, 3 = Lewo ).
Twój kadłub nie jest uszkodzony (twój statek ma długość 3, a każdy bit jest prawdziwy [1 = OK, 0 = Uszkodzony]). Możesz poruszyć się 1 raz, strzelić 2 razy, pozostały 2 miny, a twoja „umiejętność” jest dostępna (czas odnowienia = 0).
Nic nie trafiłeś, ani nie zatopiłeś żadnego statku, a ty też nie zostałeś trafiony.
Nie jesteś pod wodą, twoje tarcze (jeśli istnieją) nie są aktywowane i twój skan też nie jest.
Więcej na mapie później ...
Wynik
Musisz podać ciąg znaków opisujący działania, które wykonasz w tej turze. Kolejność znaków w wyjściowym ciągu znaków określa kolejność działań. Możesz wykonać te same działania wiele razy, jeśli nie przekraczają one limitów twojego statku. Jeśli jedno lub wiele działań jest nieważnych, każde z nich będzie osobno traktowane jako W
. Oto lista dostępnych działań:
M
: Przesuń 1 komórkę w kierunku, w którym patrzysz (skonsumuj 1 ruch)
B
: Wstecz 1 komórkę z kierunku, w którym patrzysz (skonsumuj 1 ruch)
C
: Obróć statek zgodnie z ruchem wskazówek zegara (zużyj 1 ruch / bezpłatnie dla Niszczycieli)
K
: Obróć statek przeciwnie do ruchu wskazówek zegara (zużyj 1 ruch / bezpłatnie dla Niszczycieli)
A
: Taranuj swój statek w kierunku, w którym patrzysz (działa tylko wtedy, gdy inny statek zajmuje komórkę w kierunku, w którym jesteś / nie porusza twojego statku / zużywa wszystkie ruchy)
F
: Wystrzel 1 strzał do komórki w zasięgu (zużyj 1 strzał). Musi być następnie kierowane przez komórki, w tym formacie ([+ - +] x [-]) T / przykład: F+2-3
)
N
: Miejsce 1 kopalni komórce przyległej do statku (zużywają wszystkie zdjęcia i 1 kopalni). Po nim musi znajdować się komórka docelowa w tym formacie ([+ -] X [+ -]) Y / example N+0+1
:)
S
: Aktywuj skanowanie na następną turę (zużyj wszystkie strzały)
R
: Napraw uszkodzony kadłub najbliżej „głowy” twojego statku (zużyj wszystkie strzały, czas odnowienia = 3 tury / tylko krążownik)
P
: Zanurz / na powierzchni (zużyj wszystkie strzały, czas odnowienia = 3 tury, maksymalny czas trwania = 5 tur / tylko okręt podwodny)
D
: Aktywuj swoją tarczę, zapobiegając następnym obrażeniom podczas następnej tury (zużyj wszystkie strzały, czas odnowienia = 3 / tylko pancernik)
W
: Poczekaj (nic nie robi)
Wyjaśnienie : „Zużyj wszystkie ruchy / strzały” oznacza, że możesz użyć tej akcji tylko wtedy, gdy nie użyłeś żadnego z twoich ruchów / strzałów podczas tej tury.
Przykładowe dane wyjściowe
MF+9-8CM
: Przesuwa 1 komórkę, a następnie strzela w komórkę, której względna pozycja w stosunku do „głowy” twojego statku to (targetX = X + 9, targetY = Y - 8), obraca się zgodnie z ruchem wskazówek zegara i ostatecznie przesuwa 1 komórkę.
Rozgrywka
Siatka
Oto przykładowa siatka (33 x 13), w której umieszczonych jest 3 graczy:
███████████████████████████████████
█ █
█ 00 █
█ 2 █
█ 2 █
█ 2 █
█ █
█ 11111 █
█ M █
█ █
█ █
█ █
█ █
█ █
███████████████████████████████████
Jak widzimy, M
obok gracza 1 jest także Kopalnia .
Weźmy gracza 2, aby zrozumieć pozycję i kierunek:
Pozycja Gracza 2 to X = 3, Y = 4, Kierunek = 3. Ponieważ jego kierunek to „Dno”, reszta jego „komórek statku” jest ustawiona „nad” jego głową (X = 3, Y = 3) & (X = 3, Y = 2)
Mapa gracza
Ostatnim argumentem każdego gracza jest „własna” mapa. Domyślnie statek wykrywa wszystko w zakresie 5 komórek , ale może aktywować skanowanie, aby zwiększyć ten zakres do 9 .
Argument ma zawsze 361 (19 x 19) znaków. Przedstawia kwadrat wyśrodkowany wokół „głowy” twojego statku, gdzie każda postać odpowiada tak zdefiniowanemu elementowi:
.
: Pusta komórka
O
: Twój statek
M
: Miny
X
: Ściana (komórki poza mapą)
U
: Nieznany (zostanie ujawniony przez skan)
A
: Nieuszkodzona komórka
B
wroga
C
: Komórka uszkodzona przez wroga: Komórka podwodna nieuszkodzona komórka (widoczne tylko ze skanem)
D
: Podwodna uszkodzona komórka wroga (widoczna tylko ze skanem)
W
: Wrak (martwy statek)
Ciąg składa się z 19 znaków pierwszego wiersza, a następnie 19 znaków z drugiego wiersza ... aż do 19 wiersza.
Przyjrzyjmy się, co gracz 2 otrzymuje ze skanem i bez (podział linii dla lepszego zrozumienia, ale nie wysyłany do graczy):
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX
XXXXXX.............
XXXXXX.......AA....
XXXXXX...O.........
XXXXXX...O.........
XXXXXX...O.........
XXXXXX.............
XXXXXX.......AAAAA.
XXXXXX........M....
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXX.............
XXXXXXXXXXXXXXXXXXX
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUXXXXXXXXXXXUUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX...O.....UUUU
UUUUXX.........UUUU
UUUUXX.......AAUUUU
UUUUXX........MUUUU
UUUUXX.........UUUU
UUUUXX.........UUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
UUUUUUUUUUUUUUUUUUU
Kopalnie
Kopalnie są uruchamiane, gdy statek przemieszcza się do komórki zajmowanej przez minę lub gdy wystrzeliwany jest strzał do kopalni. Kopalni nie można uruchomić za pomocą akcji „Ram”.
Kopalnie zadają obrażenia obszarowe (obrażenia obszarowe o zasięgu 1) wszystkim, nawet osobie, która umieściła minę. Kopalnie mogą wywoływać wybuchy „łańcuchowe”, jeśli inna kopalnia znajduje się w promieniu wybuchu.
Rotacje
Obroty są centralnymi symetriami wyśrodkowanymi na „głowie” statku. Obracanie uruchomi minę tylko wtedy, gdy zostanie ona umieszczona w „pozycji docelowej” (nie uruchomisz min w łuku.
Obszar działania
Obrażenia obszarowe 1 zasięgu (dla min i strzałów Przewoźnika) są zdefiniowane przez kwadrat 3x3 (9 komórek) wyśrodkowany na pierwszym strzale / eksplozji (x, y). Uderza w te współrzędne:[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]
Punktacja
Punktację określa ta formuła:
Score = Hits + (Sunken x 5) - Damage taken - (Alive ? 0 : 10)
gdzie::
hits
liczba trafień na wrogim statku, albo przez wybuch Ram, Strzał lub Mine (1 trafienie przez uszkodzoną komórkę statku wroga, w tym wybuch łańcuchowy)
sunken
: liczba „ostatnich trafień” na wrogim statku, które spowodowały jego zatonięcie
damage
: liczba otrzymane trafienia (nie zmniejszone przez naprawę, ale zapobiegane przez tarczę)
alive
: sprawdza, czy twój statek żyje na końcu (co najmniej 1 komórka kadłuba nieuszkodzona)
Kontroler
Kontroler można znaleźć na GitHub . Zawiera także dwa sampleboty napisane w Javie. Aby go uruchomić, sprawdź projekt i otwórz go w swoim Java IDE. Punkt wejścia w głównej metodzie klasy Gra. Wymagana Java 8.
Aby dodać boty, najpierw potrzebujesz skompilowanej wersji dla Javy (pliki .class) lub źródeł tłumaczonych języków. Umieść je w folderze głównym projektu. Następnie utwórz nową klasę Java w pakiecie graczy (możesz wziąć przykład z już istniejących botów). Ta klasa musi implementować Player, aby zastąpić metodę String getCmd (). Zwrócony ciąg to polecenie powłoki do uruchamiania botów. Możesz na przykład uruchomić bota Ruby za pomocą tego polecenia: zwróć „C: \ Ruby \ bin \ ruby.exe MyBot.rb” ;. Na koniec dodaj bota do tablicy graczy na górze klasy gry.
Zasady
- Boty nie powinny być pisane w celu pokonania lub wspierania określonych innych botów.
- Zapis do plików jest dozwolony. Napisz do „twojasubmissionname.txt”, folder zostanie opróżniony przed rozpoczęciem gry. Inne zasoby zewnętrzne są niedozwolone.
- Twoje zgłoszenie ma 1 sekundę na odpowiedź.
- Podaj polecenia, aby skompilować i uruchomić swoje zgłoszenia.
- Możesz napisać wiele zgłoszeń
Obsługiwane języki
Spróbuję wesprzeć każdy język, ale musi on być dostępny online za darmo. Podaj instrukcje instalacji, jeśli nie używasz języka „głównego nurtu”.
W tej chwili mogę uruchomić: Java 6-7-8, PHP, Ruby, Perl, Python 2-3, Lua, R, node.js, Haskell, Kotlin, C ++ 11.
źródło
[x - 1; y - 1],[x - 1; y],[x - 1; y + 1],[x; y - 1],[x; y],[x; y + 1],[x + 1; y - 1],[x + 1; y],[x + 1; y + 1]
Odpowiedzi:
RandomBot
To jest przykładowy bot. Wybiera losowo statek, akcję i komórkę docelową (w razie potrzeby).
PassiveBot
To jest przykładowy bot. Nic nie robi.
źródło
PeaceMaker, Python 2 (pancernik)
PeaceMaker strzela 3 razy w najbliższych wrogów (odległość spiralna) i porusza się w przód iw tył w linii, pozostając co najmniej 2 komórki z dala od min.
źródło