Wprowadzenie
W tej grze gracze używają swoich armii do walki z armiami innych graczy, zdobywania terytoriów i zostania ostatnim stojącym człowiekiem. W każdej turze gracze otrzymują do dyspozycji podstawową liczbę armii. Jednak zdobywając terytoria w niektórych regionach, gracze mogą zwiększyć tę liczbę, aby dać im potencjalną przewagę w dalszej części gry. (Jest to w zasadzie to samo co Warlight ).
Wszystkie boty powinny być napisane w Javie, C lub C ++ (obejmowałbym inne języki, ale nie mam dla nich oprogramowania ani doświadczenia). Przedłożenie klasy nie jest konieczne, więc możesz utworzyć funkcje, klasy, interfejsy lub cokolwiek innego, co jest konieczne, i użyć dowolnego pakietu lub klasy w standardowych interfejsach API . Jeśli planujesz utworzyć klasę lub interfejs, rozważ użycie wewnętrznej klasy lub interfejsu wewnętrznego.
Nie próbuj programowo zmieniać kontrolera ani innych zgłoszeń w tym konkursie.
Rozgrywka
Przegląd
Dwuwymiarowa tablica 10x10 będzie symulować płytkę, przy czym każdy element / komórka reprezentuje „terytorium”. Będzie 20 rund i do 1000 tur na rundę. W każdej turze gracze najpierw rozmieszczą swoje armie na dowolnych terytoriach, które posiadają, a następnie będą mieli możliwość przetransportowania swoich armii na pobliskie terytoria, próbując przejąć terytoria przeciwników, atakując znajdujące się w nich armie. Gracze muszą rozmieścić wszystkie swoje armie, ale nie muszą ich przenosić w razie potrzeby.
Atakowanie / przekazywanie armii
Jeśli gracz sobie tego życzy, może wysyłać armie z jednego terytorium na dowolne z ośmiu sąsiednich. Plansza „owija się”, tzn. Jeśli terytorium gracza znajduje się po jednej stronie, armie z niego można przenieść na sąsiednie terytorium po drugiej stronie. Podczas przenoszenia armii z terytorium na tym terytorium powinna pozostać co najmniej jedna armia. Na przykład, jeśli terytorium zawiera pięć armii, nie więcej niż cztery można przenieść na inne terytorium; jeśli terytorium je zawiera, armia nie może się ruszyć.
Jeśli gracz wyśle n
armie z jednego terytorium na drugie, którego jest właścicielem, terytorium to otrzyma n
armie.
Powiedz, że gracz wysyła n
armie ze swojego terytorium na terytorium przeciwne, na którym znajdują się o
armie. o
zmniejszy się o n * .6
zaokrągloną do najbliższej liczby całkowitej; jednak w tym samym czasie n
zmniejszy się o o * .7
zaokrąglenie do najbliższej liczby całkowitej. Zastosowanie będą miały następujące zasady dotyczące tego, czy terytorium przeciwne zostało zdobyte:
- Jeśli
o
osiągnie zero, ORAZn
jest większe od 0, gracz przejmie terytorium, na którym będąn
armie. - Jeżeli obie
n
io
stać się zero,o
zostanie automatycznie ustawiona na 1 i terytorium nie zostaną przechwycone. - Jeśli
o
pozostanie większa niż 0, liczba armii na terytorium gracza wzrośnie o,n
a terytorium przeciwne nie zostanie zdobyte.
Bonusy
Grupa terytoriów zostanie wybrana do reprezentowania premii; jeśli jeden gracz jest właścicielem wszystkich terytoriów należących do grupy, ten gracz otrzyma dodatkową liczbę armii na turę.
Bonusy mają numery identyfikacyjne oznaczające różne i wartości, które reprezentują dodatkową liczbę armii, którą gracz może otrzymać. W każdej rundzie wartość premii będzie losową liczbą od 5 do 10 włącznie, a na polu będzie dostępnych dziesięć bonusów, każda z dziesięcioma terytoriami objętymi premią.
Na przykład, jeśli gracz, który otrzyma 5 armii na turę, posiada wszystkie terytoria, które składają się na bonus o wartości 8, gracz otrzyma 13 armii w następnej turze i kolejnych turach. Jeśli jednak gracz straci jedno lub więcej terytoriów, które składają się na bonus, otrzyma tylko 5 armii na turę.
Wejście wyjście
Twój program powinien przyjmować dane wejściowe za pomocą argumentów wiersza polecenia, które będą miały następujący format:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
iarmies
oba są liczbami całkowitymi.id
jest twoim identyfikatorem iarmies
liczbą armii, które musisz rozmieścić na swoich terytoriach. Musisz rozmieścić wszystkie podane ci armie - nie więcej i nie mniej.territories
to seria ciągów reprezentujących terytoria, które posiadasz oraz terytoria, których nie posiadasz, przylegające do twojego. Ciągi są w tym formacie:[row],[col],[bonus id],[player id],[armies]
row
icol
wskaż rząd i kolumnę planszy, na której znajduje się terytorium,bonus id
jest to identyfikator bonusu, którego częścią jest to terytorium,player id
jest to identyfikator gracza, który jest właścicielem terytorium, iarmies
jest liczbą armii zawartych na tym terytorium. To są wszystkie liczby.bonuses
to seria ciągów znaków reprezentujących bonusy na planszy, z których możesz skorzystać. Ciągi są w tym formacie:[id],[armies],[territories left]
id
jest identyfikatorem bonusu,armies
jest liczbą dodatkowych armii, które możesz otrzymać, posiadając wszystkie terytoria w tej premii, iterritories left
jest liczbą terytoriów w premii, którą musisz przejąć, aby otrzymać dodatkowe armie.
Należy pamiętać, że piąty argument, „X”, pojawi się, jeśli jest to pierwsza tura rundy i można go użyć ze względów wygody.
Przykład wejścia w pierwszej turze:
0 5 "7,6,7,-1,2 8,7,7,-1,2 7,7,7,0,5 6,6,7,-1,2 8,8,9,-1,2 6,7,7,-1,2 7,8,9,-1,2 6,8,9,-1,2 8,6,7,-1,2" "0,5,10 1,5,10 2,9,10 3,9,10 4,9,10 5,5,10 6,5,10 7,6,9 8,7,10 9,7,10" X
Twój program musi wypisać dwa ciągi znaków oddzielone znakiem nowej linii, z których pierwszy zawiera wiersze i kolumny terytoriów, do których chcesz dodać armie, oraz liczbę armii, które chcesz do niego dodać, a drugi z nich zawiera wiersze oraz kolumny terytoriów, do których chcesz wysłać armie, oraz liczbę armii, które chcesz wysłać. Dane wyjściowe mogą zawierać końcowe spacje.
Aby określić terytorium, do którego chcesz dodać armie, dane wyjściowe powinny mieć następujący format:
[row],[col],[armies]
row
i col
są rzędem i kolumną planszy, na której znajduje się terytorium, do którego chcesz dodać armie, i armies
jest liczbą armii, które chcesz dodać do terytorium.
Aby określić, na które terytoria chcesz wysłać armie, dane wyjściowe powinny mieć następujący format:
[srow],[scol],[drow],[dcol],[armies]
srow
i scol
są rzędem i kolumną planszy, na której znajduje się terytorium, z którego chcesz przewozić armie, drow
i dcol
są rzędem i kolumną planszy, na której terytorium znajduje się terytorium, do którego chcesz wysłać armie, i armies
jest liczbą armii, które chcesz wysłać . Pamiętaj, że jeśli nie chcesz przenosić armii, twój program powinien wydrukować spację.
Przykładowy wynik może być następujący:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
W tym przypadku gracz rozmieszcza pięć armii na terytorium o wartości 0,0 i przesuwa trzy armie z 0,0 na 0,1; trzy od 0,0 do 1,0; i trzy od 0,0 do 1,1.
Rundy i tury
Na początku każdej rundy wszyscy gracze otrzymają jedno terytorium znajdujące się w losowym miejscu na planszy (możliwe jest, aby dwóch lub więcej graczy rozpoczęło grę obok siebie). Terytoria, które składają się na bonus, mogą się również zmienić.
W pierwszej turze każdy gracz będzie miał jedno terytorium zawierające pięć armii i otrzyma pięć armii, z których będzie mógł korzystać (jest to minimum, które mogą otrzymać). Wszystkie pozostałe terytoria będą własnością NPC, którzy nie atakują; każda z nich zawiera dwie armie i ma identyfikator -1
.
W każdej turze twój program będzie uruchamiany i obie części danych wyjściowych będą zbierane. Kontroler zastosuje pierwszą część produkcji, natychmiast dodając armie do terytoriów; kontroler będzie jednak czekał, aż wszyscy gracze wydadzą drugą odpowiedź, polecenia ataku / transferu. Po zakończeniu tego polecenia będą losowo tasowane, a następnie wykonywane. Twój program musi zapewnić wyjście i zakończyć się w ciągu jednej sekundy lub krócej, aby wziąć udział w turze.
Punktacja i wygrana
Za każdą rundę, jeśli pozostanie jeden gracz, ten gracz zdobędzie 100 punktów. W przeciwnym razie, jeśli minie 1000 tur i nadal będzie wielu graczy, 100 punktów zostanie równo podzielonych pomiędzy pozostałych graczy (tj. Pozostali 3 gracze dają po 33 punkty). Wygrywa ten, który gracz zdobędzie najwięcej punktów na koniec 20 rund.
Zgłoszenia
Twój post powinien zawierać nazwę bota, język, w którym jest napisany, krótki jego opis oraz kod użyty do jego uruchomienia. Przykładowy bot zostanie opublikowany tutaj jako przykład i zostanie wykorzystany w konkursie. Możesz przesłać tyle, ile chcesz.
Inny
Twój program może tworzyć, zapisywać i odczytywać z pliku, o ile jego nazwa jest taka sama jak nazwa użyta do przesłania. Pliki te zostaną usunięte przed rozpoczęciem turnieju, ale nie pomiędzy rundami.
Twoja kolej zostanie pominięta, jeśli:
- jesteś wyeliminowany (nie masz terytoriów);
- twój program nic nie drukuje;
- twój program nie kończy się w ciągu jednej sekundy;
- wystawiasz za mało armii na swoje terytoria (rozmieszczenie armii na terytoriach, których nie posiadasz, liczy się do tego) lub zbyt wiele armii; lub
- twoje wyjście powoduje, że kontroler zgłasza wyjątek.
Twoje polecenie ataku / transferu nie zostanie wykonane, jeśli:
- twój program nie daje poprawnego wyjścia;
- wybierasz terytorium, z którego chcesz przenieść armie, które nie są twoje;
- przesuwasz zero lub ujemną liczbę armii ze swojego terytorium;
- przesuwasz zbyt wiele armii ze swojego terytorium; lub
- wybierasz terytorium, na które chcesz wysłać wojska, które nie sąsiaduje z terytorium, z którego chcesz przenieść armie.
Można znaleźć kontroler oraz próbkę bot tutaj . Bot weźmie udział w grze, ale prawdopodobnie nie wygra żadnej rundy (chyba że będzie miał naprawdę szczęście).
Wyniki
Uruchamiając kontroler po wrzuceniu poprawki błędu, WeSwarm nadal jest siłą, z którą należy się liczyć. Potrzeba bota ze świetną strategią, aby mieć z nim szansę.
As of 25-08-15, 04:40 UTC
1: WeSwarm 1420
2: java Player 120
java LandGrab 120
java Hermit 120
java Castler 120
6: java RandomHalver 80
Ogłoszenie!
Naprawiono błąd wykryty przez Zsw powodujący, że terytoria, które rozmieszczały swoje armie po tym, jak inni mieli potencjalną przewagę w grze. Edycja została przekazana do kontrolera, więc proszę użyć istniejącej wersji znalezionej za pomocą powyższego linku.
źródło
Odpowiedzi:
Castler - Java 8
Po prostu chce zbudować kwadratowy zamek ... a jeśli zostanie pozostawiony sam sobie, zrobi to właśnie. Chociaż nudzi go mały zamek, więc powiększa się. Będzie to nieuchronnie oznaczać konflikt z innymi graczami, więc walka się rozpocznie. Jednak nigdy nie zapomina swojego najbardziej pożądanego kształtu ... kwadratu.
Kliknij obraz, aby zobaczyć animowany gif (15 megapikseli) pełnej symulacji obrotu 20x 1000. Castler zdobył po 1700, a pozostali gracze po 100.
źródło
Hermit - Java
Po prostu dodaje swoje armie do tego samego miasta. Nie sądzę, że można go zdjąć bez uzyskania dodatkowych armii.
źródło
WeSwarm - C ++ 11 [v2.2]
Zaktualizowano do wersji 2.2 od 25 sierpnia 2015 r.
v2.2 - dostosowany ze względu na zmianę sposobu, w jaki kontroler zgłasza armie.
v2.1 - TNT miał problem ze skompilowaniem mojego kodu, więc przestałem go używać
stoi
.v2.0 - refaktor kodu wraz z kilkoma poprawkami błędów.
Witamy w roju. Nasza siła jest w liczbach. Naszą wieczną wolą jest zebranie wszystkich twoich bonusów, aby zmaksymalizować nasze spawny. Nie stój nam na drodze, abyś nie został przytłoczony. Nie próbuj nas pokonać, za każdego zabitego zajmie to miejsce trzech kolejnych. Możesz nas zmusić do poświęceń, ale nigdy nie zmusisz nas do poddania się!
Animowany gif
Zarchiwizowane:
v2.1: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEU3lkNzVoTUpRTG8
v1.0: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEVzZUUlFydXo2T00
źródło
stoi
nie został rozwiązany pomimo posiadania C ++ 11. Wystąpiły spójne problemy z jego rozwiązaniem , które muszę jeszcze wymyślić, jak to zrobić, więc czy mógłbyś podać alternatywne rozwiązanie, które nie wykorzystujestoi
?LandGrab - Java
Im więcej ziemi, tym lepiej. Celuje wyłącznie w wolne terytoria, jeśli takie istnieją, wtedy wraz z resztkami armii zaczyna się budować i usuwać wroga po jednym kafelku na raz.
źródło
Random Halver - Java 8
Bardzo prosty bot, który po prostu przenosi połowę swoich armii z każdego terytorium na losowe sąsiednie terytorium. Nie ma znaczenia, czy sąsiad jest przyjacielem czy wrogiem ...
Chociaż nie może konkurować z Castlerem, zaskakująco dobrze radzi sobie z Graczem i innymi botami.
źródło