Jouons à Kick The Can!
Bien que Moogie soit le gagnant actuel, si quelqu'un peut prendre sa couronne, il est encouragé à le faire
Kick the can est un jeu pour enfants. Impliquant un défenseur et plusieurs attaquants. Aujourd'hui, ce n'est plus un tel jeu! Votre travail consiste à écrire un bot qui le joue, pour gagner, le style roi de la colline !
https://en.wikipedia.org/wiki/Kick_the_can
Il y a quelques différences clés dans ce jeu. La première différence clé est que le jeu est multijoueur (5v5). La deuxième différence clé est que les deux ensembles de robots peuvent tuer et éliminer les joueurs ennemis avec des mines et des bombes lancées! Les robots ne peuvent pas voir de mines (quelle que soit la distance) ou de joueurs à plus de cinq pâtés de maisons!
La carte est un labyrinthe comme suit.
Ce labyrinthe est généré de manière procédurale en créant d'abord un labyrinthe en utilisant un premier algorithme de backtracking récursif en profondeur. Et puis en plaçant les trous montrés dans (ainsi que rendre le labyrinthe plus "imparfait". Le labyrinthe est de 65x65 blocs de large et zéro indexé. Ainsi, le drapeau bleu (can) est à 1,1 et le drapeau rouge (can) est à 63,63. L'équipe bleue apparaît à 2,2 et 3,3 4,4 etc. l'équipe rouge apparaît à 62,62 et 61,61, 60,60 etc. Les blocs en cyan sont des robots de l'équipe bleue, et les blocs en magenta sont des bots rouges. Le jeu est toujours cinq contre cinq. Chaque bot de l'équipe utilisera votre code (mais peut stocker d'autres variables d'instance (ou créer des fichiers locaux) pour garder une trace de l'état et différencier les rôles.
Gameplay
Les mines peuvent être placées comme vous pouvez le voir en gris. Et les bombes peuvent être lancées sur une distance maximale de quatre blocs. Ceux-ci voyagent jusqu'à quatre pâtés de maisons à travers les murs et les autres joueurs ne tuant que les ennemis qui se dressent sur votre chemin. Après chaque étape, ils ont 40% de chances de tomber. Ils ont donc 100% de chances de 1 portée 60% à 2 portée 36% à 3 portée et 21,6% à trois portée Placer une mine ou lancer une bombe prend une munition d'équipe. Cela commence à 0 et peut être augmenté en collectant les cases orange. Notez que quatre (4) de ces caches de munitions seront commodément centrées. Les Bots sont alignés dans un tableau de deux rouges et deux bleus. IE RRRRRBBBBB. Gaurding le drapeau est autorisé, mais attention à être près du drapeau (c'est-à-dire moins de cinq blocs) entraîne une lenteur, et ne permet que de se déplacer. tous les trois tours. L'arène choisit un démarreur aléatoire pour chaque tour. JE.
Objectif
Programmez vos cinq robots (chacun a le même fichier de classe) pour réussir à naviguer dans le labyrinthe et toucher la boîte adverse tout en faisant attention de ne pas renverser accidentellement sa propre boîte ou de marcher sur une mine.
Programmation
Les entrées d'arène et de bot sont actuellement en Java, mais un wrapper stdin / out existe pour d'autres langues.
Le code de l'arène sera disponible mais voici les détails pertinents.
Classe Bot
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
}
}
Principales méthodes disponibles
Notez que l'utilisation de toute technique pour modifier ou accéder à des données auxquelles vous ne devriez généralement pas avoir accès n'est pas autorisée et entraînera la disqualification.
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
Spécifications de l'interface du wrapper StdIn / Out
L'interface se compose de deux modes: initialisation et exécution.
En mode d'initialisation, une seule trame INIT est envoyée via stdout. Les spécifications de ce cadre sont les suivantes:
INIT
{Team Membership Id}
{Game Map}
TINI
Où: {Team Membership Id} est un seul caractère: R ou B. B signifie équipe bleue, R signifie équipe rouge.
{Game Map} est une série de rangées de caractères ascii représentant une rangée de la carte. Les caractères ascii suivants sont valides: F = drapeau bleu G = drapeau rouge O = espace ouvert W = mur
Le jeu procédera ensuite à l'envoi de cadres de jeu sur stdout à chaque bot comme suit:
FRAME
{Ammo}
{Alive Bot Count}
{Bot X},{Bot Y}
{Local Map}
EMARF
Où:
{Ammo} est une chaîne de chiffres, la valeur sera 0 ou plus {Alive Bot Count} est une chaîne de chiffres, la valeur sera 0 ou plus {Box X} est une chaîne de chiffres représentant la coordonnée X du bot sur la carte du jeu. La valeur sera 0 <= X <Largeur de carte. {Box Y} est une chaîne de chiffres représentant la coordonnée Y du bot sur la carte du jeu. La valeur sera 0 <= Y <Hauteur de la carte. {Carte locale} est une série de rangées de caractères ascii représentant la carte entière entourant le bot. Les caractères ascii suivants sont valides: F = drapeau bleu G = drapeau rouge O = espace ouvert W = mur R = robot d'équipe rouge B = robot d'équipe bleu M = mine A = munitions
Le contrôleur s'attend à ce que votre bot produise ensuite (vers stdout) une réponse sur une seule ligne au format:
{Action},{Direction}
Où:
{Action} est l'un des: Déplacer Désamorcer Lancer de Mine
{Direction} est un chiffre unique compris entre 0 et 4 inclus. (voir les informations de direction plus tôt)
REMARQUE: toutes les chaînes seront délimitées par \ n le caractère de fin de ligne.Ce sera un tournoi à élimination. Mes échantillons de robots participeront en tant que remplisseurs, mais je ne m'attribuerai pas la victoire. En cas de victoire par l'un de mes bots, le titre revient au membre de la deuxième place, et se poursuivra jusqu'à ce qu'il y ait un bot qui n'est pas le mien. Chaque match se compose de 11 tours de coup de pied dans la boîte. Si aucune des deux équipes n'a remporté un seul match, elles sont toutes les deux éliminées. En cas d'égalité de score non nul, un match de bris d'égalité sera joué. S'il y a égalité, les deux sont éliminés. Les tours ultérieurs peuvent comprendre plus de matchs. Le classement du tournoi sera basé sur le nombre de votes positifs au 31/07/16 (date sujette à changement).
Chaque match dure 4096 tours. Une victoire donne un point. Une égalité ou une perte ne rapporte aucun point. Bonne chance!
N'hésitez pas à regarder le code ou à le critiquer dans ce GitHub Repo.
https://github.com/rjhunjhunwala/BotCTF/blob/master/src/botctf/Arena.java
Notez que je n'ai pas d'interprètes pour trop de langues sur mon ordinateur, et j'ai peut-être besoin de bénévoles pour exécuter la simulation sur leur ordinateur. Ou je peux télécharger l'interprète de langue. Veuillez vous assurer que vos bots.
- Répondez dans un délai raisonnable (disons 250 ms)
- N'endommagera pas ma machine hôte
la source
Réponses:
NavPointBot, Java 8
Le robot est blanc / bleu
Ce bot nomme un chef parmi les bots amis à chaque image qui attribuera ensuite des points de navigation à chaque bot vers lequel naviguer.
Initialement, tous les robots sont en dépôt de munitions, puis deux robots sont affectés en tant que gardes, le reste recherchant des munitions et attaquant ensuite le drapeau ennemi.
J'ai trouvé que le jeu dépend beaucoup de l'emplacement de départ des dépôts. En tant que tel, je ne peux pas vraiment dire que ce bot est meilleur que tous les autres.
Courir avec
java NavPointBot
la source
Pathfinder optimisé JAVA
Merci à @Moogie de m'avoir aidé à optimiser ma recherche de chemins de remplissage. Voici la source du bot. Ce gars sait à quel point il est important de défendre son drapeau. Il aligne trois défenseurs et deux attaquants. Les défenseurs se replient et défendent / rassemblent des munitions, les deux attaquants prennent (un chemin assez droit) vers le drapeau (et récupèrent les munitions au milieu). Il tire sur tous ceux qu'il voit et devrait être une concurrence féroce. Les défenseurs placent des mines autour du drapeau et du camp jusqu'à ce qu'il n'y ait plus d'opposition pour qu'ils puissent aller botter la boîte.
la source