Lass uns Kick The Can spielen!
Obwohl Moogie der aktuelle Gewinner ist, wird jeder dazu ermutigt, wenn er seine Krone nehmen kann
Kick the Can ist ein Kinderspiel. Beteiligung eines Verteidigers und mehrerer Angreifer. Heute ist es kein solches Spiel mehr! Ihre Aufgabe ist es, einen Bot zu schreiben, der ihn spielt, um den King-of-the-Hill- Stil zu gewinnen!
https://en.wikipedia.org/wiki/Kick_the_can
Es gibt einige wesentliche Unterschiede in diesem Spiel. Der erste wesentliche Unterschied besteht darin, dass das Spiel im Mehrspielermodus (5 gegen 5) gespielt wird. Der zweite entscheidende Unterschied besteht darin, dass beide Bots feindliche Spieler mit Minen und geworfenen Bomben töten und eliminieren können! Bots können keine Minen (unabhängig von der Entfernung) oder Spieler in mehr als fünf Blocks Entfernung sehen!
Die Karte ist wie folgt ein Labyrinth.
Dieses Labyrinth wird prozedural erzeugt, indem zuerst ein Labyrinth unter Verwendung eines tiefenrekursiven Rückverfolgungsalgorithmus erstellt wird. Und dann platzieren Sie die gezeigten Löcher in (und machen das Labyrinth "unvollkommener". Das Labyrinth ist 65x65 Blöcke breit und null indiziert. Somit ist die blaue Flagge (Dose) bei 1,1 und die rote Flagge (Dose) ist bei 63,63. Blaues Team spawnt bei 2,2 und 3,3 4,4 usw. Rotes Team spawnt bei 62,62 und 61,61, 60,60 usw. Die Blöcke in Cyan sind Bots im blauen Team und Die Blöcke in Magenta sind rote Bots. Das Spiel ist immer fünf gegen fünf. Jeder Bot im Team verwendet Ihren Code (kann jedoch andere Instanzvariablen speichern (oder lokale Dateien erstellen), um den Status zu verfolgen und Rollen zu unterscheiden.
Spielweise
Minen können platziert werden, wie Sie in grau sehen können. Und Bomben können mit einer maximalen Entfernung von bis zu vier Blöcken geworfen werden. Diese reisen bis zu vier Blocks durch Wände und andere Spieler töten nur die Feinde, die Ihnen im Weg stehen. Nach jedem Schritt haben sie eine 40% ige Chance, wegzufallen. Sie haben also eine 100% ige Chance auf 1 Reichweite 60% bei 2 Reichweite 36% bei 3 Reichweite und 21,6% bei drei Reichweite Das Platzieren einer Mine oder das Werfen einer Bombe erfordert eine Teammunition. Dies beginnt bei 0 und kann durch Sammeln der orangefarbenen Kästchen erhöht werden. Beachten Sie, dass vier (4) dieser Munitionscaches bequem zentriert werden. Die Bots sind in einer Reihe von zwei roten und zwei blauen angeordnet. IE RRRRRBBBBB. Das Gaurding der Flagge ist erlaubt, aber beachten Sie, dass die Nähe zur Flagge (dh weniger als fünf Blöcke) zu Langsamkeit führt und nur Bewegung zulässt. alle drei Umdrehungen. Die Arena wählt für jede Runde einen zufälligen Starter. ICH.
Zielsetzung
Programmieren Sie Ihre fünf Bots (jeder hat dieselbe Klassendatei), um erfolgreich durch das Labyrinth zu navigieren und die gegnerische Dose zu berühren, während Sie darauf achten, nicht versehentlich die eigene Dose umzuwerfen oder auf eine Mine zu treten.
Programmierung
Die Arena- und Bot-Einträge befinden sich derzeit in Java. Für andere Sprachen ist jedoch ein Standard- / Out-Wrapper vorhanden.
Der Arena-Code wird zur Verfügung gestellt, aber hier sind die relevanten Details.
Bot Klasse
public class YourUniqueBotName extends Bot{
public YourUniqueBotName(int x , int y, int team){
super(x,y,team);
//optional code
}
public Move move(){//todo implement this method
//it should output a Move();
//A move has two paramaters
//direction is from 0 - 3 as such
// 3
// 2-I-0
// 1
// a direction of 4 or higher means a no-op (i.e stay still)
//And a MoveType. This movetype can be
//MoveType.Throw
//MoveType.Mine
//MoveType.Defuse defuse any mine present in the direction given
//MoveType.Move
}
}
Wichtige Methoden verfügbar
Beachten Sie, dass die Verwendung von Techniken zum Ändern oder Zugreifen auf Daten, auf die Sie im Allgemeinen keinen Zugriff haben sollten, nicht zulässig ist und zur Disqualifikation führt.
Arena.getAmmo()[team];//returns the shared ammo cache of your team
Arena.getMap();//returns an integer[] representing the map. Be careful since all enemies more than 5 blocks away (straight line distance) and all mines are replaced with constant for spaces
//constants for each block type are provided such as Bot.space Bot.wall Bot.mine Bot.redTeam Bot.blueTeam Bot.redFlag Bot.blueFlag
Arena.getAliveBots();//returns the number of bots left
getX();//returns a zero indexed x coordinate you may directly look at (but not change X)
getY();//returns a zero indexed y coordinate (y would work to, but do not change y's value)
//Although some state variables are public please do not cheat by accessing modifying these
StdIn / Out-Wrapper-Schnittstellenspezifikation
Die Schnittstelle besteht aus zwei Modi: Initialisierung und Ausführung.
Während des Initialisierungsmodus wird ein einzelner INIT-Frame über stdout gesendet. Die Spezifikation dieses Rahmens lautet wie folgt:
INIT
{Team Membership Id}
{Game Map}
TINI
Wobei: {Team Membership Id} ein einzelnes Zeichen ist: R oder B. B bedeutet blaues Team, R bedeutet rotes Team.
{Game Map} ist eine Reihe von Reihen von ASCII-Zeichen, die eine Reihe der Karte darstellen. Die folgenden ASCII-Zeichen sind gültig: F = blaue Flagge G = rote Flagge O = offener Raum W = Wand
Das Spiel sendet dann Spielframes über stdout an jeden Bot wie folgt:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Wo:
{Munition} ist eine Ziffernfolge, der Wert ist 0 oder höher. {Alive Bot Count} ist eine Ziffernfolge, der Wert ist 0 oder höher. {Box X} ist eine Ziffernfolge, die die X-Koordinate des Bots darstellt auf der Spielkarte. Der Wert ist 0 <= X <Kartenbreite. {Box Y} ist eine Ziffernfolge, die die Y-Koordinate des Bots auf der Spielkarte darstellt. Der Wert ist 0 <= Y <Kartenhöhe. {Local Map} ist eine Reihe von Reihen von ASCII-Zeichen, die die gesamte Karte darstellen, die den Bot umgibt. Die folgenden ASCII-Zeichen sind gültig: F = blaue Flagge G = rote Flagge O = offener Raum W = Wand R = roter Teambot B = blauer Teambot M = meine A = Munition
Der Controller erwartet, dass Ihr Bot dann eine einzeilige Antwort im folgenden Format ausgibt (an stdout):
{Action},{Direction}
Wo:
{Action} ist eine von: Move Defuse Mine Throw
{Richtung} ist eine einzelne Ziffer zwischen 0 und 4 einschließlich. (siehe Richtungsangaben früher)
HINWEIS: Alle Zeichenfolgen werden durch das Zeichen \ n Zeilenende begrenzt.Dies wird ein Ausscheidungsturnier sein. Meine Sample-Bots werden als Füllstoffe teilnehmen, aber ich werde mir den Gewinn nicht selbst vergeben. Im Falle eines Sieges durch einen meiner Bots geht der Titel an das zweitplatzierte Mitglied und wird fortgesetzt, bis es einen Bot gibt, der nicht einer von mir ist. Jedes Match besteht aus 11 Kick-the-Can-Runden. Wenn keine der beiden Mannschaften ein einziges Spiel gewonnen hat, werden beide eliminiert. Bei einem Unentschieden ungleich Null wird ein Unentschieden gespielt. Bleibt ein Unentschieden bestehen, werden beide eliminiert. Spätere Runden können aus mehr Spielen bestehen. Die Aussaat des Turniers basiert auf der Anzahl der Upvotes zum 31.7.16 (Änderungen vorbehalten).
Jedes Match dauert 4096 Runden. Ein Sieg gewährt einen Punkt. Ein Unentschieden oder Verlust gewährt null Punkte. Viel Glück!
Schauen Sie sich den Code an oder kritisieren Sie ihn in diesem GitHub Repo.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Beachten Sie, dass ich auf meinem Computer keine Dolmetscher für zu viele Sprachen habe und möglicherweise Freiwillige benötige, um die Simulation auf ihrem Computer auszuführen. Oder ich kann den Sprachdolmetscher herunterladen. Bitte stellen Sie sicher, dass Ihre Bots.
- Antworten Sie in angemessener Zeit (z. B. 250 ms).
- Beschädigt meinen Host-Computer nicht