Einführung
In diesem Spiel setzen die Spieler ihre Armeen ein, um gegen die Armeen anderer Spieler zu kämpfen, Gebiete zu erobern und als letzter Mann zu bestehen. In jedem Zug erhalten die Spieler eine Basisanzahl von Armeen, die sie verwenden können. Durch die Eroberung von Gebieten in bestimmten Regionen können die Spieler diese Zahl jedoch erhöhen, um ihnen später im Spiel einen potenziellen Vorteil zu verschaffen. (Dies ist im Wesentlichen dasselbe wie Warlight ).
Alle Bots sollten in Java, C oder C ++ geschrieben sein (ich würde andere Sprachen einbinden, habe aber keine Software oder Erfahrung dafür). Es ist nicht erforderlich, dass Ihre Übermittlung eine Klasse erweitert, und Sie können Funktionen, Klassen, Schnittstellen oder andere erforderliche Elemente erstellen und ein Paket oder eine Klasse in den Standard- APIs verwenden . Wenn Sie vorhaben, eine Klasse oder Schnittstelle zu erstellen, ziehen Sie bitte die Verwendung einer inneren Klasse oder einer inneren Schnittstelle in Betracht.
Bitte versuchen Sie nicht, den Controller oder andere Einsendungen in diesem Wettbewerb programmgesteuert zu ändern.
Spielweise
Überblick
Ein 10x10 zweidimensionales Array simuliert das Board, wobei jedes Element / jede Zelle ein "Territorium" darstellt. Es gibt 20 Runden und bis zu 1000 Runden pro Runde. In jeder Runde stellen die Spieler zuerst die Armeen, die sie besitzen, in einem ihrer Territorien auf und erhalten dann die Möglichkeit, ihre Armeen in benachbarte Territorien zu transportieren, um die Territorien ihrer Gegner zu erobern, indem sie die Armeen in ihnen angreifen. Die Spieler müssen alle einsetzen ihre Armeen, aber sie haben sie nicht zu bewegen , falls gewünscht.
Angreifen / Übertragen von Armeen
Auf Wunsch des Spielers kann er Armeen aus einem Gebiet in eines der acht benachbarten Gebiete entsenden. Das Brett "dreht sich um", dh wenn sich das Territorium eines Spielers auf der einen Seite befindet, können Armeen von diesem auf ein benachbartes Territorium auf der anderen Seite übertragen werden. Wenn Armeen aus einem Gebiet entfernt werden, sollte sich noch mindestens eine Armee in diesem Gebiet befinden. Wenn ein Gebiet beispielsweise fünf Armeen enthält, können nicht mehr als vier in ein anderes Gebiet versetzt werden. Wenn ein Gebiet eines enthält, kann sich diese Armee nicht bewegen.
Wenn ein Spieler n
Armeen von einem Territorium in ein anderes sendet , das er besitzt, erhält dieses Territorium n
Armeen.
Angenommen, ein Spieler sendet n
Armeen von seinem Territorium in ein gegnerisches Territorium, in dem sich o
Armeen befinden. o
wird n * .6
auf die nächste ganze Zahl gerundet verringert ; Gleichzeitig n
wird jedoch o * .7
auf die nächste ganze Zahl gerundet. Es gelten die folgenden Regeln, die festlegen, ob das gegnerische Territorium eingenommen wurde oder nicht:
- Erreicht
o
AND denn
Wert 0, übernimmt der Spieler das Territorium, in dem sichn
Armeen befinden. - Wenn beide
n
undo
Null werden,o
wird automatisch auf 1 gesetzt und das Gebiet wird nicht erfasst. - Bleibt der
o
Wert größer als 0, erhöht sich die Anzahl der Armeen im Territorium des Spielers umn
und das gegnerische Territorium wird nicht erobert.
Boni
Eine Gruppe von Gebieten wird ausgewählt, um einen Bonus darzustellen. Wenn ein Spieler alle Gebiete besitzt, die Teil der Gruppe sind, erhält dieser Spieler eine zusätzliche Menge Armeen pro Spielzug.
Boni haben ID-Nummern, die unterschiedliche Werte kennzeichnen, die die zusätzliche Anzahl von Armeen darstellen, die ein Spieler erhalten kann. In jeder Runde ist der Wert eines Bonusses eine Zufallszahl zwischen einschließlich 5 und 10, und auf dem Spielfeld stehen zehn Boni zur Verfügung, von denen jedes zehn Gebiete umfasst.
Wenn zum Beispiel ein Spieler, der 5 Armeen pro Runde erhält, alle Gebiete besitzt, die einen Bonus von 8 ausmachen, erhält der Spieler in der nächsten Runde und den folgenden Runden 13 Armeen. Wenn der Spieler jedoch eines oder mehrere der Gebiete verliert, aus denen sich der Bonus zusammensetzt, erhält er nur 5 Armeen pro Spielzug.
Input-Output
Ihr Programm sollte Eingaben über Befehlszeilenargumente annehmen, die das folgende Format haben:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
undarmies
sind beide ganze Zahlen.id
ist Ihre ID undarmies
die Anzahl der Armeen, die Sie in Ihrem Gebiet einsetzen müssen. Sie müssen alle Armeen einsetzen, die Ihnen gegeben wurden - nicht mehr und nicht weniger.territories
ist eine Reihe von Zeichenfolgen, die die Gebiete darstellen, die Sie besitzen, und die Gebiete, die Sie nicht besitzen und die an Ihre angrenzend sind. Die Zeichenfolgen haben folgendes Format:[row],[col],[bonus id],[player id],[armies]
row
undcol
geben Sie die Zeile und Spalte der Tafel an, auf der sich das Gebiet befindet,bonus id
ist die ID des Bonus, zu dem dieses Gebiet gehört,player id
ist die ID des Spielers, dem das Gebiet gehört, undarmies
ist die Anzahl der in dem Gebiet enthaltenen Armeen. Das sind alles Zahlen.bonuses
ist eine Reihe von Zeichenfolgen, die die Boni auf dem Brett darstellen, die Sie nutzen können. Die Zeichenfolgen haben folgendes Format:[id],[armies],[territories left]
id
ist die ID des Bonus,armies
ist die Anzahl der zusätzlichen Armeen, die Sie erhalten können, wenn Sie alle Gebiete in diesem Bonus besitzen, undterritories left
ist die Anzahl der Gebiete in dem Bonus, die Sie erobern müssen, um die zusätzlichen Armeen zu erhalten.
Bitte beachten Sie, dass ein fünftes Argument, ein "X", angezeigt wird, wenn es die erste Runde einer Runde ist und aus praktischen Gründen verwendet werden kann.
Ein Beispiel für die Eingabe in der ersten Runde:
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
Ihr Programm muss zwei durch einen Zeilenumbruch getrennte Zeichenfolgen ausgeben. In der ersten werden die Zeilen und Spalten der Gebiete aufgelistet, denen Sie Armeen hinzufügen möchten, sowie die Anzahl der Armeen, die Sie hinzufügen möchten. In der zweiten Zeile werden die Zeilen aufgelistet und Spalten der Gebiete, an die Sie Armeen senden möchten, und die Anzahl der Armeen, an die Sie senden möchten. Die Ausgabe kann nachgestellte Leerzeichen enthalten.
Um ein Gebiet anzugeben, zu dem Sie Armeen hinzufügen möchten, sollte Ihre Ausgabe dem folgenden Format entsprechen:
[row],[col],[armies]
row
und col
sind die Zeile und Spalte des Brettes, in dem sich das Gebiet befindet, zu dem Sie Armeen hinzufügen möchten, undarmies
die Anzahl der Armeen, die Sie dem Gebiet hinzufügen möchten.
Um festzulegen, an welche Gebiete Sie Armeen senden möchten, sollte Ihre Ausgabe das folgende Format haben:
[srow],[scol],[drow],[dcol],[armies]
srow
und scol
sind die Reihe und Spalte des Brettes, aus dem das Gebiet, aus dem Sie Armeen transportieren möchten, drow
und dcol
sind die Reihe und Spalte des Brettes, aus dem das Gebiet, an das Sie Armeen senden möchten, undarmies
die Anzahl der Armeen, die Sie senden möchten . Beachten Sie, dass Ihr Programm ein Leerzeichen ausgeben sollte, wenn Sie keine Armeen bewegen möchten.
Eine Beispielausgabe könnte sein:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
In diesem Fall setzt der Spieler mit 0,0 fünf Armeen auf dem Territorium ein und bewegt drei Armeen von 0,0 auf 0,1; drei von 0,0 bis 1,0; und drei von 0,0 bis 1,1.
Runden und Kurven
Zu Beginn jeder Runde erhalten alle Spieler ein Gebiet, das sich an einer zufälligen Stelle auf dem Spielplan befindet (es ist möglich, dass zwei oder mehr Spieler nebeneinander beginnen). Die Gebiete, aus denen sich ein Bonus zusammensetzt, können sich ebenfalls ändern.
In der ersten Runde hat jeder Spieler ein Gebiet mit fünf Armeen und erhält fünf Armeen, die er einsetzen kann (dies ist das Minimum, das er erhalten kann). Alle anderen Gebiete gehören NSCs, die nicht angreifen. Jede von ihnen enthält zwei Armeen und hat eine ID von -1
.
In jeder Runde wird Ihr Programm ausgeführt und beide Ausgaben werden gesammelt. Der Controller wendet die erste Ausgabe an und fügt sofort Armeen zu Territorien hinzu. Der Controller wartet jedoch, bis alle Spieler ihre zweite Ausgabe, ihre Angriffs- / Transferbefehle, gegeben haben. Sobald dies abgeschlossen ist, werden die Befehle nach dem Zufallsprinzip gemischt und dann ausgeführt. Ihr Programm muss eine Ausgabe liefern und innerhalb einer Sekunde oder weniger enden, um an der Runde teilnehmen zu können.
Punkten und Gewinnen
Verbleibt in einer Runde ein Spieler, erhält dieser 100 Punkte. Andernfalls werden die 100 Punkte gleichmäßig auf die verbleibenden Spieler aufgeteilt, wenn 1000 Runden vergangen sind und noch mehrere Spieler vorhanden sind (dh 3 verbleibende Spieler ergeben jeweils 33 Punkte). Wer am Ende der 20 Runden die meisten Punkte hat, gewinnt.
Einreichungen
Ihr Beitrag sollte einen Namen für den Bot, die Sprache, in der er geschrieben ist, eine kurze Beschreibung und den Code enthalten, mit dem er ausgeführt wird. Ein Beispielbot wird hier als Beispiel gepostet und im Wettbewerb verwendet. Sie können so viele einreichen, wie Sie möchten.
Andere
Ihr Programm erstellt, schreibt und liest möglicherweise Daten aus einer Datei, sofern der Dateiname mit dem Namen übereinstimmt, den Sie für die Übermittlung verwendet haben. Diese Dateien werden vor Beginn eines Turniers gelöscht, jedoch nicht zwischen den Runden.
Dein Zug wird übersprungen, wenn:
- Sie sind beseitigt (haben keine Gebiete);
- Ihr Programm druckt nichts;
- Ihr Programm wird nicht innerhalb einer Sekunde beendet.
- Sie setzen zu wenige Armeen in Ihren Territorien ein (wenn Sie Armeen in Territorien einsetzen, die Sie nicht besitzen, wird dies berücksichtigt), oder Sie setzen zu viele Armeen ein. oder
- Ihre Ausgabe bewirkt, dass der Controller eine Ausnahme auslöst.
Ihr Angriffs- / Übertragungsbefehl wird nicht ausgeführt, wenn:
- Ihr Programm gibt keine korrekte Ausgabe aus.
- Sie wählen ein Gebiet, aus dem Sie Armeen abziehen möchten, das nicht Ihnen gehört.
- Sie ziehen keine oder eine negative Anzahl von Armeen aus Ihrem Hoheitsgebiet.
- Sie bewegen zu viele Armeen von Ihrem Territorium; oder
- Sie wählen ein Gebiet aus, in das Armeen entsandt werden sollen, die nicht an das Gebiet angrenzen, aus dem Sie Armeen bewegen möchten.
Den Controller und einen Beispielbot finden Sie hier . Der Bot wird am Spiel teilnehmen, aber wahrscheinlich keine Runden gewinnen (es sei denn, er hat wirklich Glück).
Ergebnisse
WeSwarm führt den Controller aus, nachdem eine Fehlerbehebung vorgenommen wurde. Es braucht einen Bot mit einer großartigen Strategie, um eine Chance dagegen zu haben.
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
Beachten!
Ein von Zsw entdeckter Fehler, der dazu führte, dass Gebiete, die ihre Armeen nach anderen einsetzten, einen potenziellen Vorteil im Spiel hatten, wurde behoben. Es wurde eine Bearbeitung an den Controller gesendet. Verwenden Sie daher die vorhandene Version, die Sie über den obigen Link gefunden haben.
quelle
Antworten:
Castler - Java 8
Er will nur ein quadratisches Schloss bauen ... und wenn er es sich selbst überlässt, wird er genau das tun. Allerdings langweilt er sich in einem kleinen Schloss, wodurch es immer größer wird. Dies wird unvermeidlich Konflikte mit anderen Spielern bedeuten und so kommt es zu Kämpfen. Allerdings vergisst er nie seine Lieblingsform ... das Quadrat.
Klicken Sie auf das Bild, um ein animiertes GIF (15 Meg.) Einer vollständigen Simulation mit 20x 1000 Runden zu erhalten. Castler erzielte 1700 und die anderen Spieler erzielten jeweils 100 Punkte.
quelle
Einsiedler - Java
Fügt einfach weiterhin seine Armeen derselben Stadt hinzu. Ich glaube nicht, dass es besiegt werden kann, ohne Bonusarmeen zu erhalten.
quelle
WeSwarm - C ++ 11 [v2.2]
Aktualisiert auf v2.2 vom 25. August 2015.
v2.2 - angepasst aufgrund einer Änderung in der Art, wie der Controller Armeen meldet.
v2.1 - TNT hatte Probleme beim Kompilieren meines Codes, daher habe ich die Verwendung eingestellt
stoi
.v2.0 - ein Code-Refactor zusammen mit einigen Fehlerkorrekturen.
Willkommen im Schwarm. Unsere Stärke liegt in Zahlen. Unser ewiger Wille ist es, alle deine Boni einzusammeln, um unsere Brut zu maximieren. Stehen Sie uns nicht im Weg, damit Sie nicht überwältigt werden möchten. Versuche nicht, uns zu besiegen. Für jeden, den du tötest, werden drei weitere an seine Stelle treten. Sie können uns zwingen, Opfer zu bringen, aber Sie werden uns niemals zwingen, uns zu ergeben!
Animiertes GIF
Archiviert:
v2.1: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEU3lkNzVoTUpRTG8
v1.0: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEVzZUUlFydXo2T00
quelle
stoi
es trotz C ++ 11 nicht aufgelöst wurde. Es gab beständige Probleme bei der Lösung , die ich noch nicht geklärt habe. Könnten Sie also eine alternative Lösung anbieten, die nicht verwendet wirdstoi
?LandGrab - Java
Je mehr Land desto besser. Zielt ausschließlich auf freie Gebiete, wenn es welche gibt, dann beginnen die Armeen mit dem Aufbau und dem Herausnehmen des Gegners nacheinander.
quelle
Zufällige Halver - Java 8
Ein sehr einfacher Bot, der einfach die Hälfte seiner Armeen in jedem Gebiet in ein zufälliges Nachbargebiet verschiebt. Egal ob der Nachbar Freund oder Feind ist ...
Es kann zwar nicht mit Castler mithalten, schlägt sich aber überraschend gut gegen den Player und andere Bots.
quelle