Einführung
Das Spiel spielt in einer kleinen Welt mit verschiedenen Städten. Die Herrscher der Städte hassen sich gegenseitig und möchten die Welt regieren. Die Menschen sind in zwei Gruppen eingeteilt, Krieger und Niedriggeborene. Niedriggeborene können sich jedoch zu Kriegern erheben. Sie sind der Herrscher über drei dieser Städte.
Gameplay
Wenn das Spiel beginnt, regieren Sie über drei Städte. In jeder Stadt leben 100 Menschen. Sie müssen sie in Ritter und Untergeborene aufteilen.
Dann beginnt das eigentliche Spiel, das rundenbasiert ist. Eine Runde sieht so aus: "Produce" knights
=> execute command of first town
=> execute command of next town
(Wiederholung für alle Städte) => try a rebellion
.
- In jeder Runde wird Ihr Programm für jede Stadt aufgerufen , die Ihnen gehört . Sie können entweder eine Stadt angreifen , unterstützen eine Stadt oder einfach warten . Diese Aktionen werden nacheinander und nicht gleichzeitig ausgeführt.
- In jeder dritten Runde erhält man einen Ritter pro 2 Untergeborenen (23 Untergeborene => 11 Ritter). Die Anzahl der Untergeborenen bleibt gleich.
- Ritter in einer Stadt haben einen Verteidigungsbonus von 1,2. Wenn Sie angegriffen werden, wird Ihre Ritter mit dieser Zahl multipliziert werden (zB Sie haben
78 knights
, müssen Sie93 knights
während des Angriffs). Nach dem Angriff werden die zusätzlichen Ritter entfernt (wenn Sie82 knights
überleben, haben Sie immer noch78 knights
). - Bei einem Angriff tötet jeder Ritter einen Feind, bevor er stirbt. Zum Beispiel:
30 knights
Angriff100 knights
(ohne Verteidigungsbonus) => 70 Ritter überleben. - Sie können eine Stadt erobern, indem Sie alle darin befindlichen Ritter töten . Alle Niedriggeborenen gehören dir und deine überlebenden Ritter sind in der Stadt stationiert. In der nächsten Runde kannst du diese Stadt zusätzlich zu all deinen anderen Städten regieren .
- Nachdem eine Stadt erobert wurde, erhält sie für 2 volle Runden keinen Verteidigungsbonus (da die Tore zerbrochen sind). In der dritten Runde werden die Tore repariert.
- Um zu verhindern, dass die Niedriggeborenen rebellieren, benötigen Sie mindestens die Hälfte der Ritter, die es gibt (23 Niedriggeborene in einer Stadt benötigen mindestens 12 Ritter in derselben Stadt). Andernfalls töten die Niedriggeborenen alle Ritter und die Stadt wird "neutral" (ohne einen Anführer, angegeben durch eine Spieler-ID
-1
). - Neutrale Städte "produzieren" Ritter, greifen aber keine andere Stadt an oder unterstützen sie.
Syntax
Die Steuerung stellt Ihnen die Eingabe über Befehlsargumente zur Verfügung, Ihr Programm muss sie über stdout ausgeben.
Ausgabe (Vorbereitung)
Bevor das Spiel startet, ruft der Controller Sie auf, ohne Argumente einzureichen. Das bedeutet, dass Sie Ihre 100 Leute (für jede Stadt) in Ritter und Niedriggeborene aufteilen müssen. Sie müssen zum KnightCount KnightCount KnightCount
Beispiel ausgeben 95 80 95
.
Eingabe
Round;YourPlayerId;YourTownId;PlayerId_TownId_knights_lowborns;PlayerId_TownId_knights_lowborns;...
In der ersten Runde wird dies so etwas wie sein
1;2;2;0_0_100_0;1_1_50_50;2_2_80_20
. Hier siehst du, es ist die erste Runde, du bist Spieler 2 in Stadt 2. Du hast 80 Ritter und 20 Niedriggeborene.
Später im Spiel könnte es so etwas wie sein 20;2;1;0_0_100_0;2_1_30_50;2_2_40_20
. Du bist immer noch Spieler 2 (dies ändert sich nie), aber du hast Stadt 1 erobert (die du gerade kontrollierst).
Ausgabe
A TownId NumberOfKnights
oder S TownId NumberOfKnights
oder W
(zum Warten).
Beispiel: A 2 100
(Angriffsstadt 2 mit 100 Rittern) oder S 3 2
(Stützstadt 3 mit 2 Rittern).
Regeln
- Bots sollten nicht geschrieben werden, um bestimmte andere Bots zu schlagen oder zu unterstützen.
- Das Schreiben in Dateien ist erlaubt. Bitte schreibe an " yoursubmissionname .txt", der Ordner wird vor Spielbeginn geleert. Andere externe Ressourcen sind nicht zulässig.
- Ihr Beitrag hat 1 Sekunde Zeit, um zu antworten (pro Stadt).
- Stellen Sie Befehle zum Kompilieren und Ausführen Ihrer Übermittlungen bereit.
Gewinnen
Gewinner ist der mit den meisten Städten nach 100 Runden. Wenn ein Spieler alle Städte erobert, stoppt das Spiel und er gewinnt. Wenn mehrere Spieler die gleiche Anzahl von Städten haben, zählt die Anzahl der Ritter und dann die Anzahl der Niedriggeborenen.
Regler
Sie finden den Controller auf Github. Es enthält auch 2 Beispielbots, die in Java geschrieben wurden. Öffnen Sie es in Eclipse, platzieren Sie die kompilierten Bots im Stammordner und fügen Sie dem Steuerungsprogramm eine Klasse hinzu (genau wie die Samplebots).
Ergebnisse
Für die Endergebnisse habe ich 10 Spiele gespielt. Dies ist der Durchschnitt:
Spieler-Städte 1. Befreier 37.5 2. Sehtimianer 8.2 3. SuperProducer 5.4 4. Sleeper 1.4 5. Frankenstein 1.2 6. Butter 0.8 (mehr Ritter) 7. TheKing 0.8 (weniger Ritter) 8. Exodus 0.6 9. Schildkröte 0.5 (mehr Ritter) 10. AttackOn3 0.5 (weniger Ritter) 11. Demokratie 0.3 12. CalculatedFail 0.2 13. Revolutionist 0.1
Sie können hier ein Beispielspiel lesen: Beispielspiel auf Github
quelle
A
eine andere Stadt unterstütztB
, die angegebene Anzahl von Rittern einfach vonA
nach übertragen wirdB
, wonach sie vom Eigentümer kontrolliert werdenB
, richtig?Antworten:
Python3, Befreier
Das einzige Ziel dieses Bots ist es, die am weitesten verbreiteten Menschen vom unterdrückenden Joch der Tyrannei zu befreien.
quelle
Python 2, der König
Der König regiert die Stadt mit der höchsten Zahl in seinem Reich und fordert, dass alle überzähligen Ritter aus anderen Städten, die unter seiner Kontrolle stehen, zu ihm geschickt werden. Wenn er genug Ritter hat, wird er eine feindliche Stadt angreifen. Er ist kein sehr kluger König, hat also weder Geschichte studiert noch die Konsequenzen seines Handelns verstanden.
Dies ist mit dem Controller oder anderen Bots nicht getestet.
quelle
He is not a very smart King, so has not studied history or understands the consequences of his actions.
Javascript (Node), Reich
Fängt stark an, um andere Städte abzuschrecken. Städte versuchen zusammenzuarbeiten, um andere zu fangen. Erobert vorrangig Städte mit vielen Niedriggeborenen.
Run: Node Empire
quelle
knights - lowborns/2
, aber wenn man 30 Ritter und 90 Untergeborene hat, funktioniert dies nicht. Bitte korrigieren Sie IhregetAttackers()
Funktion.DEBUG
Flag im Controller, das dazu führte, dass es Fehler verschluckte, selbst wenn dasGAME_MESSAGES
Flag auf true gesetzt war. Ich fühle mich wie ich noch einige Arbeit auf meiner Strategie nutzen könnte, vor allem mit Liberator jetzt auf der Szene, aber mit der neuesten bearbeiten ich sehe keine Fehler , wenn ich mit meinen Tests laufeDEBUG
aufJava, Frankenstein
Bei dem Versuch, einen Weg zu finden, Liberator zu zerstören, ist ein kleiner Fehler in meinen Code eingeflossen. Der Code begann dann, die Konkurrenz zu zerstören. Nachdem Democracy hinzugefügt und die Spieler neu geordnet worden waren, begann es zu scheitern. Als ich den Code studierte, versuchte ich seine Strategie zu finden. Folglich wurde der folgende Code erstellt. Es neigt dazu, den besten Spieler anzugreifen und zu zerstören. Nachdem die besten Spieler zerstört wurden, zerstört dies leicht den Rest.
Hier ist der ursprüngliche Spieler:
quelle
Java, Schildkröte
Dank TheBestOne für die Kernmethoden habe ich gerade den Algorithmus geändert (ich hoffe, das ist in Ordnung). Im Grunde wertet dieser Bot seine am besten verteidigte Stadt auf, um mit der gefährlichsten gegnerischen Stadt mithalten zu können, und behält gleichzeitig genügend Ritter, um Aufstände in den anderen Städten zu verhindern.
Kompilieren:
javac Turtle.java
Lauf:
java Turtle
quelle
dangerousEnemyTown = dangerousEnemyTown.knightCount() >= town.knightCount() ? dangerousEnemyTown : town;
nichtdangerousEnemyTown = bestDefendedTown.knightCount() >= town.knightCount() ? bestDefendedTown : town;
Java 8, Politiker
Handelt wie ein echter Politiker. Schade, dass Crasher ihn immer noch schlachtet.
Kompilieren:
javac Politician.java
Lauf:
java Politician
quelle
lie
Methode verpasstJava 8, Butter
Verteilt sich so gleichmäßig wie möglich. Erstickt eine Stadt, wenn die Stadt klein genug ist.
Kompilieren:
javac Butter.java
Lauf:
java Butter
quelle
Java, Revolutionär
Ein letzter, der immer noch auf den Kernmethoden von TheBestOne basiert. Dieser Bot versucht, in jeder Stadt Rebellionen auszulösen, da der neutrale Spieler harmlos ist, indem er eine bestimmte Anzahl von Rittern im Verhältnis zur niedriggeborenen Bevölkerung tötet. Es wird natürlich keinen neutralen Spieler angreifen.
Kompilieren:
javac Revolutionist.java
Lauf:
java Revolutionist
quelle
Java, Sehtimianer
Nochmals vielen Dank an TheBestOne, ich habe auch seine Kernmethoden kopiert. ) Ich spiele zum ersten Mal ein KingOfTheHill-CodeGame, also hoffe ich, dass ich alles richtig gemacht habe. Ich präsentiere stolz die Sehtimianer: D
Die Sehtimianer versuchen das ganze Spiel überlegen zu sein und es am Ende zu beenden. Ich hoffe mein bot geht nicht so schlecht :)
quelle
Java, Exodus
Wiederum basierend auf den Kernmethoden von TheBestOne. Dieser Bot wandert von Stadt zu Stadt, sobald er ein bestimmtes Maß an Ritterbevölkerung erreicht hat, wahllos von seinem Besitzer, und wiederholt diesen Vorgang, bis er die ganze Welt bekehrt hat.
Kompilieren:
javac Exodus.java
Lauf:
java Exodus
quelle
Python 2, Demokratie
Dieser König ist kein König. Es ist etwas Modernes. Es ist der König der Menschen . Das ist Demokratie. Es ist langsam, ineffizient und wenn es etwas tut, macht es es falsch.
Rennen
python2 democracy.py
. Beachten Sie, dass Demokratie Python 2 erfordert .Bearbeiten: Fehler beim Drucken von Stadtobjekten behoben
quelle
<__main__.Town
.C ++ 11, CalculatedFail
Nachdem ich ein paar Dinge mit dem kleinen Java ausprobiert hatte, das ich kenne und nicht ganz in der Lage war, das zu erreichen, was ich wollte, entschied ich mich dafür, es in C ++ neu zu schreiben und die Dateibehandlung hinzuzufügen. Das Problem war, mein C ++ ist ziemlich verrostet und nicht viel besser, so dass einige Teile zusammengeknallt sind und nur die erste Lösung in Google, also nicht wirklich Qualitätscode ...
Trotzdem konnte ich ein zumindest funktionierendes Ergebnis erzielen, bei dem nicht so viel gesaugt wird. Es gewinnt zumindest gelegentlich, aber ich kann es nicht perfekt testen, da ich nicht in der Lage bin, alle anderen Einsendungen auf diesem PC auszuführen. Ich werde das Targeting wahrscheinlich komplett neu schreiben und es später heute oder morgen als weitere Antwort hinzufügen.
kompilieren mit:
g++ -std=c++11 CalculatedFail.cpp -o CalculatedFail.exe
Google sagt, dass es unter Linux CalculatedFail.out anstelle der .exe ist, aber ich kann es nicht testen.
und Renn
CalculatedFail.exe
Da es eine Datei verwendet, um nach dem Def-Bonus zu suchen, kann es zu Fehlern kommen, wenn das Spiel mehrmals gleichzeitig ausgeführt wird ...
hoffe es funktioniert einwandfrei ohne zu viele probleme
quelle
Java, Illuminati
Ich habe dies gelesen und wusste, dass ich nie in der Lage sein würde, eine tragfähige Strategie zu entwickeln, also habe ich mich entschieden, die jämmerlich unterrepräsentierten Echsenmenschen zu spielen, die uns vielleicht beherrschen oder nicht. Anstatt mit den anderen Bots zu kämpfen, zwingt dieser sie zur Zusammenarbeit, um sie am Ende aufzugeben. Dieser Bot hinterlässt keinen bleibenden Schaden.
quelle
Java, SuperProducer
Es ist spät in meinem Teil der Welt, so dass ich nicht genug Zeit habe, um meine Vorlage zu erläutern. Ich werde später genauer darauf eingehen, wie es funktioniert.
Die Leistung des Bots scheint stark von der Startreihenfolge abhängig zu sein, die er manchmal gewinnt ...
Ich hatte ein paar Ideen, um die Gewinnrunden zu erhöhen ... aber die Zeit drängt: P
Kompilieren Sie: javac SuperProducer.java
Führen Sie Folgendes aus: java moogiesoft.SuperProducer
quelle
C ++ 11, attackOn3
Code selbst ist nicht viel schöner geworden, aber jetzt benutze ich einen anderen Weg, um zu zielen. Möglicherweise werden dem Code später Kommentare hinzugefügt.
Scheint mit den Bots, die ich laufe, in Ordnung zu sein, obwohl es immer noch hart gegen Frankenstein und Liberator ist und nicht konsequent gewinnen kann.
kompiliere mit:
g++ -std=c++11 attackOn3.cpp -o attackOn3.exe
und laufe
attackOn3.exe
quelle