Wprowadzenie
Gra toczy się w małym świecie z różnymi miastami. Władcy miast nienawidzą się nawzajem i chcieliby rządzić światem. Ludzie dzielą się na dwie grupy, wojowników i dzieci. Nisko urodzone dzieci mogą jednak wychowywać na wojowników. Jesteś władcą trzech z tych miast.
Rozgrywka
Na początku gry rządzisz trzema miastami. W każdym mieście jest 100 osób. Musisz podzielić je na rycerzy i nisko urodzonych.
Następnie rozpoczyna się faktyczna gra turowa. Tura wygląda następująco: "Produce" knights
=> execute command of first town
=> execute command of next town
(powtórz dla wszystkich miast) => try a rebellion
.
- W każdej turze twój program będzie wywoływany dla każdego miasta, które należy do ciebie . Możesz albo zaatakować miasto , wesprzeć miasto lub po prostu zaczekać . Działania te będą wykonywane sekwencyjnie, a nie jednocześnie.
- Co trzecią turę dostajesz jednego rycerza na 2 nisko urodzonych (23 nisko urodzonych => 11 rycerzy). Ilość nisko urodzonych dzieci pozostaje taka sama.
- Rycerze w mieście mają premię do obrony w wysokości 1,2. Jeśli zostaniesz zaatakowany, twoi rycerze zostaną pomnożeni przez tę liczbę (np. Masz
78 knights
, będziesz miał93 knights
podczas ataku). Po ataku dodatkowi rycerze zostaną usunięci (jeśli82 knights
przeżyjesz, nadal będziesz miał78 knights
). - W ataku każdy rycerz zabija wroga przed śmiercią. Na przykład:
30 knights
atak100 knights
(bez premii do obrony) => 70 rycerzy przeżyje. - Możesz przejąć miasto zabijając wszystkich znajdujących się w nim rycerzy . Wszyscy nisko urodzeni należą teraz do ciebie, a twoi ocalali rycerze stacjonują w mieście. W następnej rundzie możesz rządzić tym miastem oprócz wszystkich innych miast .
- Po zdobyciu miasta nie będzie miało bonusu do obrony przez 2 pełne tury (ponieważ bramy są zniszczone). W trzeciej turze bramy zostaną naprawione.
- Aby zapobiec buntowi nisko urodzonych, potrzebujesz co najmniej o połowę mniej rycerzy niż nisko urodzonych (23 nisko urodzonych w mieście potrzebuje co najmniej 12 rycerzy w tym samym mieście). W przeciwnym razie nisko urodzeni zabiją wszystkich rycerzy, a miasto stanie się „neutralne” (bez lidera wskazanego przez PlayerId
-1
). - Neutralne miasta będą „produkować” rycerzy, ale nie będą atakować ani wspierać innych miast.
Składnia
Kontroler zapewnia dane wejściowe za pomocą argumentów poleceń, program musi wyświetlać dane wyjściowe za pomocą standardowego wyjścia.
Wyjście (przygotowanie)
Przed rozpoczęciem gry kontroler wzywa cię do poddania się bez argumentów. Oznacza to, że musisz rozdzielić swoje 100 osób (dla każdego miasta) na rycerzy i nisko urodzonych. Musisz KnightCount KnightCount KnightCount
na przykład wysyłać dane wyjściowe 95 80 95
.
Wejście
Round;YourPlayerId;YourTownId;PlayerId_TownId_knights_lowborns;PlayerId_TownId_knights_lowborns;...
W pierwszej rundzie będzie to coś w rodzaju
1;2;2;0_0_100_0;1_1_50_50;2_2_80_20
. Tutaj widzisz, że jest to pierwsza runda, jesteś graczem 2 w mieście 2. Masz 80 rycerzy i 20 nisko urodzonych.
W dalszej części gry może to być coś w rodzaju 20;2;1;0_0_100_0;2_1_30_50;2_2_40_20
. Nadal jesteś graczem 2 (to się nigdy nie zmienia), ale przejąłeś miasto 1 (które obecnie kontrolujesz).
Wyjście
A TownId NumberOfKnights
lub S TownId NumberOfKnights
lub W
(do oczekiwania).
Przykład: A 2 100
(atakuj miasto 2 100 rycerzami) lub S 3 2
(wspieraj miasto 3 2 rycerzami).
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ź (na miasto).
- Podaj polecenia, aby skompilować i uruchomić swoje zgłoszenia.
Zwycięski
Zwycięzcą jest ten, który ma najwięcej miast po 100 rundach. Jeśli gracz przejmie wszystkie miasta, gra się kończy i wygrywa. Jeśli wielu graczy ma taką samą liczbę miast, liczą się rycerze, a następnie liczba nisko urodzonych.
Kontroler
Kontroler można znaleźć na github. Zawiera także 2 sampleboty napisane w Javie. Otwórz go w Eclipse, umieść skompilowane boty w folderze głównym i dodaj klasę do programu sterującego (podobnie jak sampleboty).
Wyniki
Aby uzyskać ostateczne wyniki, przeprowadziłem 10 gier. To jest średnia:
Miasta gracza 1. Liberator 37.5 2. Sehtimianer 8.2 3. SuperProducer 5.4 4. Miejsce sypialne 1.4 5. Frankenstein 1.2 6. Masło 0,8 (więcej rycerzy) 7. TheKing 0.8 (mniej rycerzy) 8. Exodus 0.6 9. Turtle 0.5 (więcej rycerzy) 10. AttackOn3 0,5 (mniej rycerzy) 11. Demokracja 0.3 12. Obliczony brak 0,2 13. Rewolucjonista 0.1
Możesz przeczytać przykładową grę tutaj: przykładowa gra na github
źródło
A
obsługuje inne miastoB
, podana liczba rycerzy jest po prostu przenoszonaA
doB
, po czym są kontrolowani przez właścicielaB
, prawda?Odpowiedzi:
Python3, Liberator
Jedynym celem tego bota jest uwolnienie najczęstszych ludzi od opresyjnego jarzma tyranii.
źródło
Python 2, The King
Król rządzi miastem o najwyższej liczbie w swoim imperium i żąda wysłania nadmiaru rycerzy z innych miast pod jego kontrolą. Gdy będzie miał dość rycerzy, zaatakuje miasto wroga. Nie jest bardzo mądrym Królem, więc nie studiował historii ani nie rozumie konsekwencji swoich działań.
Nie jest to testowane z kontrolerem lub innymi botami.
źródło
He is not a very smart King, so has not studied history or understands the consequences of his actions.
JavaScript (węzeł), Empire
Zaczyna silnie odstraszyć inne miasta. Miasta starają się współpracować, aby schwytać innych. Priorytetem jest przejmowanie miast z wieloma małymi dziećmi.
Uruchom: węzeł imperium
źródło
knights - lowborns/2
, ale jeśli masz 30 rycerzy i 90 nisko urodzonych, to nie działa. Napraw swojągetAttackers()
funkcję.DEBUG
flagę w kontrolerze, która powodowała, że połyka ona błędy nawet przyGAME_MESSAGES
ustawionej flagi true. Czuję, że nadal może korzystać z niektórych prac na mojej strategii, zwłaszcza z Liberatora teraz na scenie, ale z najnowszej edycji nie widzę żadnych błędów podczas uruchamiania moich testów zDEBUG
naJava, Frankenstein
Próbując znaleźć sposób na zniszczenie Liberatora, w moim kodzie wpadł mały błąd. Kod zaczął wtedy niszczyć konkurencję. Po dodaniu Demokracji i uporządkowaniu graczy zaczęło się to nie udać. Studiując kod, próbowałem znaleźć jego strategię. W związku z tym utworzono następujący kod. Ma tendencję do atakowania i niszczenia najlepszego gracza. Po zniszczeniu najlepszych graczy, łatwo to niszczy resztę.
Oto oryginalny odtwarzacz:
źródło
Java, Turtle
Dzięki TheBestOne dla podstawowych metod właśnie zmieniłem algorytm (mam nadzieję, że to OK). Bot ten w zasadzie ulepsza swoje najlepiej bronione miasto, aby rywalizować z najniebezpieczniejszym wrogim miastem, jednocześnie utrzymując wystarczającą liczbę rycerzy, aby zapobiec powstaniu w innych miastach.
Skompilować:
javac Turtle.java
Biegać:
java Turtle
źródło
dangerousEnemyTown = dangerousEnemyTown.knightCount() >= town.knightCount() ? dangerousEnemyTown : town;
nie miałeś na myślidangerousEnemyTown = bestDefendedTown.knightCount() >= town.knightCount() ? bestDefendedTown : town;
Java 8, polityk
Zachowuje się jak prawdziwy polityk. Szkoda, że Crasher wciąż go zabija.
Skompilować:
javac Politician.java
Biegać:
java Politician
źródło
lie
metodęJava 8, Masło
Rozprzestrzenia się możliwie równomiernie. Dusi miasto, jeśli jest wystarczająco małe.
Skompilować:
javac Butter.java
Biegać:
java Butter
źródło
Java, rewolucjonista
Ostatni, wciąż oparty na podstawowych metodach TheBestOne. Ten bot próbuje wzbudzić bunt w każdym mieście, ponieważ neutralny gracz jest nieszkodliwy, zabijając pewną liczbę rycerzy w stosunku do niskiej populacji. Oczywiście nie zaatakuje neutralnego gracza.
Skompilować:
javac Revolutionist.java
Biegać:
java Revolutionist
źródło
JAVA, Sehtimianer
Jeszcze raz dzięki TheBestOne skopiowałem też jego podstawowe metody; ) Po raz pierwszy gram w KingOfTheHill-CodeGame, więc mam nadzieję, że wszystko zrobiłem dobrze. Z dumą prezentuję Sehtimianerów: D
Sehtimianie próbują przewyższyć całą grę i kończą ją na końcu. Mam nadzieję, że mój bot nie zrobi nic złego :)
źródło
Java, Exodus
Jeszcze raz, w oparciu o podstawowe metody TheBestOne. Bot ten migruje z miasta do miasta, gdy osiągnie pewien poziom populacji rycerzy, bez względu na właściciela, i powtarzaj ten proces, aż przekształci cały świat.
Skompilować:
javac Exodus.java
Biegać:
java Exodus
źródło
Python 2, Demokracja
Ten król nie jest królem. To coś nowoczesnego. To król ludzi . To jest demokracja. Jest powolny, nieefektywny, a kiedy coś robi, robi to źle.
Uruchom
python2 democracy.py
. Zauważ, że demokracja wymaga Python 2 .Edycja: Naprawiono błąd związany z drukowaniem obiektu miasta
źródło
<__main__.Town
.C ++ 11, CalculatedFail
po tym, jak wypróbowałem kilka rzeczy z małą Javą, którą znam i nie byłem w stanie osiągnąć tego, czego chciałem, postanowiłem napisać ją ponownie w C ++ i dodać obsługę plików. Problem polegał na tym, że mój C ++ jest dość zardzewiały i niewiele lepszy, więc niektóre części są ze sobą powiązane i to tylko pierwsze rozwiązanie w Google, więc nie bardzo dobry kod ...
mimo to udało mi się uzyskać przynajmniej działający wynik, który nie jest do kitu, wygrywa przynajmniej czasami, ale nie mogę go idealnie przetestować, ponieważ nie jestem w stanie uruchomić wszystkich innych zgłoszeń na tym komputerze. Prawdopodobnie przepiszę całkowicie kierowanie i dodam je jako kolejną odpowiedź dzisiaj lub jutro.
Połącz z:
g++ -std=c++11 CalculatedFail.cpp -o CalculatedFail.exe
Google mówi na Linuksie, że to CalculatedFail.out zamiast .exe, ale nie mogę go przetestować.
i biegnij
CalculatedFail.exe
ponieważ używa pliku do sprawdzenia premii def, jednoczesne uruchomienie gry wiele razy może prowadzić do błędów ...
mam nadzieję, że działa poprawnie bez większych problemów
źródło
Java, Illuminati
Przeczytałem to i wiedziałem, że nigdy nie będę w stanie wymyślić skutecznej strategii, więc postanowiłem zagrać w żałośnie niedostatecznie reprezentowanych jaszczurkach, którzy mogą rządzić nami lub nie. Zamiast walczyć z innymi botami, ten zmusza ich do współpracy, tylko po to, aby porzucić je na samym końcu. Ten bot nie pozostawia żadnych trwałych obrażeń.
źródło
Java, SuperProducer
W mojej części świata jest już późno, więc nie mam wystarczająco dużo czasu, aby rozwinąć swoje zdanie. Będę planować później wyjaśnić, jak to działa.
Wydajność bota wydaje się być wysoce zależna od kolejności startowej, którą wygrywa przez pewien czas ...
Miałem kilka pomysłów na zwiększenie rund wygranych ... ale poza czasem: P
Kompilacja: javac SuperProducer.java
Uruchom: java moogiesoft.SuperProducer
źródło
C ++ 11, attackOn3
sam kod nie stał się ładniejszy, ale teraz używam innego sposobu kierowania, prawdopodobnie dodam komentarze do kodu później.
wydaje się być w porządku z botami, które prowadzę, chociaż nadal jest ciężko w porównaniu z Frankensteinem i Liberatorem i nie może konsekwentnie wygrywać.
skompiluj z:
g++ -std=c++11 attackOn3.cpp -o attackOn3.exe
i uruchom
attackOn3.exe
źródło