introduction
Dans ce jeu, les joueurs utilisent leurs armées pour combattre les armées des autres joueurs, capturer des territoires et devenir le dernier homme debout. Chaque tour, les joueurs reçoivent un nombre de base d'armées à utiliser à leur disposition. En capturant des territoires dans certaines régions, cependant, les joueurs peuvent augmenter ce nombre pour leur donner un avantage potentiel plus tard dans la partie. (C'est essentiellement la même chose que Warlight ).
Tous les bots doivent être écrits en Java, C ou C ++ (j'inclurais d'autres langages mais je n'ai pas le logiciel ou l'expérience pour eux). Il n'est pas nécessaire que votre soumission étende une classe, et vous pouvez créer des fonctions, des classes, des interfaces ou tout ce qui est nécessaire, et utiliser n'importe quel package ou classe dans les API standard . Si vous prévoyez de créer une classe ou une interface, pensez à utiliser une classe interne ou une interface interne.
Veuillez ne pas essayer de modifier par programme le contrôleur ou d'autres soumissions dans ce concours.
Gameplay
Aperçu
Un tableau bidimensionnel 10x10 simulera la carte, chaque élément / cellule représentant un "territoire". Il y aura 20 tours et jusqu'à 1000 tours par tour. À chaque tour, les joueurs déploieront d'abord les armées dont ils disposent sur l'un des territoires qu'ils possèdent, puis auront la possibilité de transporter leurs armées vers les territoires voisins pour tenter de capturer les territoires de leurs adversaires en attaquant les armées qui s'y trouvent. Les joueurs doivent déployer toutes leurs armées, mais ils n'ont pas à les déplacer si vous le souhaitez.
Attaquer / transférer des armées
Si le joueur le désire, il / elle peut envoyer des armées d'un territoire vers l'un des huit territoires adjacents. Le plateau "s'enroule", c'est-à-dire que si le territoire d'un joueur est d'un côté, les armées de celui-ci peuvent être transférées vers un territoire adjacent de l'autre côté. Lorsque vous déplacez des armées d'un territoire, il devrait toujours y avoir au moins une armée sur ce territoire. Par exemple, si un territoire contient cinq armées, pas plus de quatre peuvent être déplacées vers un territoire différent; si un territoire en contient un, cette armée ne peut pas se déplacer.
Si un joueur envoie des n
armées d'un territoire à un autre qu'il possède, ce territoire recevra des n
armées.
Supposons qu'un joueur envoie des n
armées de son territoire vers un territoire adverse avec des o
armées. o
diminuera par n * .6
arrondi à l'entier le plus proche; cependant, en même temps, n
diminuera en o * .7
arrondissant à l'entier le plus proche. Les règles suivantes concernant la capture ou non du territoire adverse s’appliqueront:
- Si
o
atteint zéro ETn
est supérieur à 0, le joueur prendra le contrôle du territoire, qui aura desn
armées à l'intérieur . - Si les deux
n
eto
deviennent nuls,o
sera automatiquement mis à 1 et le territoire ne sera pas capturé. - S'il
o
reste supérieur à 0, le nombre d'armées sur le territoire du joueur augmentera den
et le territoire adverse ne sera pas capturé.
Bonus
Un groupe de territoires sera choisi pour représenter un bonus; si un joueur possède tous les territoires qui font partie du groupe, ce joueur recevra un nombre supplémentaire d'armées par tour.
Les bonus ont des numéros d'identification pour indiquer différents et des valeurs qui représentent le nombre supplémentaire d'armées qu'un joueur peut recevoir. Chaque tour, la valeur d'un bonus sera un nombre aléatoire compris entre 5 et 10, inclus, et dix bonus seront disponibles sur le terrain, chacun avec dix territoires inclus dans le bonus.
Par exemple, si un joueur qui reçoit 5 armées par tour possède tous les territoires qui composent un bonus d'une valeur de 8, le joueur recevra 13 armées au tour suivant et aux tours suivants. Si, cependant, le joueur perd un ou plusieurs des territoires qui composent le bonus, il ou elle ne recevra que 5 armées par tour.
Entrée sortie
Votre programme doit recevoir des entrées via des arguments de ligne de commande, qui auront le format suivant:
[id] [armies] [territories (yours and all adjacent ones)] [bonuses] ["X" (if first turn)]
id
etarmies
sont tous les deux des nombres entiers.id
est votre identifiant etarmies
le nombre d'armées que vous devez déployer sur vos territoires. Vous devez déployer toutes les armées qui vous sont données - ni plus ni moins.territories
est une série de chaînes représentant les territoires que vous possédez et les territoires que vous ne possédez pas qui sont adjacents aux vôtres. Les chaînes sont dans ce format:[row],[col],[bonus id],[player id],[armies]
row
etcol
indiquer la ligne et la colonne du plateau où se trouve le territoire,bonus id
est l'id du bonus dont ce territoire fait partie,player id
est l'id du joueur qui possède le territoire, etarmies
est le nombre d'armées contenues dans le territoire. Ce sont tous des chiffres.bonuses
est une série de chaînes représentant les bonus du tableau dont vous pouvez profiter. Les chaînes sont dans ce format:[id],[armies],[territories left]
id
est l'id du bonus,armies
est le nombre d'armées supplémentaires que vous pouvez recevoir en possédant tous les territoires dans ce bonus, etterritories left
est le nombre de territoires dans le bonus que vous devez capturer pour recevoir les armées supplémentaires.
Veuillez noter qu'un cinquième argument, un "X", apparaîtra s'il s'agit du premier tour d'un tour et peut être utilisé pour des raisons de commodité.
Un exemple d'entrée au premier tour:
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
Votre programme doit produire deux chaînes séparées par un retour à la ligne, dont la première répertorie les lignes et les colonnes des territoires auxquels vous souhaitez ajouter des armées et le nombre d'armées que vous souhaitez y ajouter, et la seconde qui répertorie les lignes et les colonnes des territoires auxquels vous souhaitez envoyer des armées et le nombre d'armées que vous souhaitez envoyer. La sortie peut contenir des espaces de fin.
Pour spécifier un territoire auquel vous souhaitez ajouter des armées, votre sortie doit suivre ce format:
[row],[col],[armies]
row
et col
sont la ligne et la colonne du tableau où se trouve le territoire auquel vous souhaitez ajouter des armées, et armies
est le nombre d'armées que vous souhaitez ajouter au territoire.
Pour spécifier vers quels territoires vous souhaitez envoyer des armées, votre sortie doit suivre ce format:
[srow],[scol],[drow],[dcol],[armies]
srow
et scol
sont la ligne et la colonne du tableau où se trouve le territoire à partir duquel vous souhaitez transporter des armées, drow
et dcol
sont la ligne et la colonne du tableau où se trouve le territoire vers lequel vous souhaitez envoyer des armées, et armies
est le nombre d'armées que vous souhaitez envoyer . Notez que si vous ne souhaitez déplacer aucune armée, votre programme doit imprimer un espace.
Un exemple de sortie peut être le suivant:
0,0,5
0,0,0,1,3 0,0,1,0,3 0,0,1,1,3
Dans ce cas, le joueur déploie cinq armées sur le territoire à 0,0 et déplace trois armées de 0,0 à 0,1; trois de 0,0 à 1,0; et trois de 0,0 à 1,1.
Tours et tours
Au début de chaque tour, tous les joueurs se verront attribuer un territoire situé à un endroit aléatoire sur le plateau (il est possible pour deux ou plusieurs joueurs de commencer côte à côte). Les territoires qui composent un bonus peuvent également changer.
Au premier tour, chaque joueur aura un territoire contenant cinq armées, et il recevra cinq armées qu'il pourra utiliser (c'est le minimum qu'il peut recevoir). Tous les autres territoires appartiendront à des PNJ qui n'attaqueront pas; chacun d'eux contient deux armées et a un identifiant de -1
.
À chaque tour, votre programme sera exécuté et les deux éléments de sortie seront collectés. Le contrôleur appliquera immédiatement le premier élément de sortie, ajoutant des armées aux territoires; cependant, le contrôleur attendra que tous les joueurs aient donné leur deuxième élément de sortie, leurs commandes d'attaque / transfert. Une fois cette opération terminée, les commandes seront mélangées de manière aléatoire puis exécutées. Votre programme doit fournir une sortie et se terminer en une seconde ou moins afin de participer au tour.
Marquer et gagner
Pour un tour donné, s'il reste un joueur, ce joueur gagnera 100 points. Sinon, si 1000 tours passent et qu'il y a encore plusieurs joueurs, les 100 points seront répartis également entre les joueurs restants (c'est-à-dire que 3 joueurs restants rapportent 33 points chacun). Quel que soit le joueur qui a le plus de points à la fin des 20 manches, il gagnera.
Soumissions
Votre message doit inclure un nom pour le bot, la langue dans laquelle il est écrit, une brève description de celui-ci et le code utilisé pour l'exécuter. Un exemple de bot sera affiché ici à titre d'exemple et sera utilisé dans le cadre du concours. Vous pouvez en soumettre autant que vous le souhaitez.
Autre
Votre programme peut créer, écrire et lire à partir d'un fichier tant que le nom du fichier est le même que le nom que vous avez utilisé pour votre soumission. Ces fichiers seront supprimés avant le début d'un tournoi mais pas entre les tours.
Votre tour sera ignoré si:
- vous êtes éliminé (vous n'avez pas de territoire);
- votre programme n'imprime rien;
- votre programme ne se termine pas dans une seconde;
- vous déployez trop peu d'armées sur vos territoires (le déploiement d'armées sur des territoires que vous ne possédez pas comptera pour cela) ou trop d'armées; ou
- votre sortie provoque le contrôleur de lever une exception.
Votre commande d'attaque / transfert ne sera pas exécutée si:
- votre programme ne donne pas une sortie correcte;
- vous choisissez un territoire dont vous voulez déplacer des armées qui ne vous appartient pas;
- vous déplacez zéro ou un nombre négatif d'armées de votre territoire;
- vous déplacez trop d'armées de votre territoire; ou
- vous choisissez un territoire vers lequel envoyer des armées qui n'est pas adjacent au territoire duquel vous avez choisi de déplacer des armées.
Vous pouvez trouver le contrôleur et un exemple de bot ici . Le bot participera au jeu, mais il ne gagnera probablement aucun round (à moins qu'il ne soit vraiment chanceux).
Résultats
En exécutant le contrôleur après avoir poussé un correctif de bogue, WeSwarm continue d'être une force avec laquelle il faut compter. Il faudra un bot avec une excellente stratégie pour avoir une chance contre lui.
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
Remarquer!
Un bug découvert par Zsw faisant que les territoires qui déployaient leurs armées après que les autres aient un avantage potentiel dans le jeu a été corrigé. Une modification a été envoyée au contrôleur, veuillez donc utiliser la version existante trouvée en utilisant le lien ci-dessus.
Réponses:
Castler - Java 8
Il veut juste faire un château carré ... et s'il est laissé à lui-même, il fera exactement cela. Bien qu'il s'ennuie avec un petit château, il l'agrandit de plus en plus. Cela signifiera inévitablement un conflit avec d'autres joueurs et donc les combats s'ensuivent. Mais il n'oublie jamais sa forme la plus désirée ... le carré.
Cliquez sur l'image pour un gif animé (15 mégas) d'une simulation complète de 20x 1000 tours. Castler a marqué 1700 et les autres joueurs ont marqué 100 chacun.
la source
Ermite - Java
Continue d'ajouter ses armées à la même ville. Je ne pense pas qu'il puisse être retiré sans obtenir des armées bonus.
la source
WeSwarm - C ++ 11 [v2.2]
Mise à jour vers la version 2.2 depuis le 25 août 2015.
v2.2 - ajusté en raison d'un changement dans la façon dont le contrôleur signale les armées.
v2.1 - TNT avait du mal à compiler mon code, j'ai donc arrêté d'utiliser
stoi
.v2.0 - un refactoriseur de code avec quelques corrections de bugs.
Bienvenue dans l'essaim. Notre force réside dans les chiffres. Notre volonté éternelle est de collecter tous vos bonus afin de maximiser nos spawns. Ne nous gênez pas, de peur que vous ne souhaitiez être submergé. N'essayez pas de nous vaincre, pour chacun que vous tuez, trois autres prendront sa place. Vous pouvez nous forcer à faire des sacrifices, mais vous ne nous forcerez jamais à nous rendre!
GIF animé
Archivé:
v2.1: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEU3lkNzVoTUpRTG8
v1.0: https://drive.google.com/uc?export=download&id=0B-BtKdd4FDDEVzZUUlFydXo2T00
la source
stoi
n'a pas été résolu malgré C ++ 11. Il y a eu cohérence des problèmes avec la résolution de ce que je dois encore savoir comment faire, alors pourriez - vous fournir une solution de rechange qui n'utilise passtoi
?LandGrab - Java
Plus il y a de terres, mieux c'est. Cible des territoires exclusivement libres s'il y en a, puis avec les armées restantes commence à se constituer et à éliminer l'ennemi une tuile à la fois.
la source
Halver aléatoire - Java 8
Un bot très simple qui déplace simplement la moitié de ses armées dans chaque territoire vers un territoire voisin aléatoire. Peu importe que le voisin soit ami ou ennemi ...
Bien qu'il ne puisse pas rivaliser avec Castler, il fait étonnamment bien contre le joueur et d'autres bots.
la source