Dans un monde désolé et déchiré par la guerre, où les villes ont été envahies par des voyous et des voleurs, la civilisation s'est réinventée sous la forme de petites coopératives industrielles isolées, disséminées dans le paysage auparavant inhabité. L'existence de ces communautés dépend des équipes d'ouvriers mercenaires appelés "scrappers", qui recherchent sur le territoire sauvage des matériaux précieux à vendre aux coopératives. Comme ces matériaux se sont raréfiés, la mise au rebut est devenue une profession de plus en plus difficile et dangereuse. Les travailleurs humains fragiles ont été pour la plupart remplacés par des remplaçants robotiques à distance, appelés «bots», et un mercenaire typique est plus susceptible d'être un programmeur qualifié qu'un soudeur armé. Comme la présence humaine dans la démolition a diminué, le respect entre les groupes de mercenaires les uns pour les autres a également diminué. Les bots sont équipés non seulement pour collecter la ferraille, mais pour la défendre et, dans certains cas, la prendre de force. Les programmeurs de robots travaillent sans relâche à concevoir de nouvelles stratégies pour déjouer les scrappers rivaux, ce qui entraîne des bots de plus en plus agressifs et un autre danger pour les humains qui s'aventurent hors des murs de leurs communautés.
(ouais, le logo est recadré hilarante)
Bienvenue chez Scrappers!
Il s'agit d'une première version de Scrappers dans laquelle la collecte des rebuts et les usines n'ont pas été implémentées. Il s'agit essentiellement d'un "shoot 'em up".
Vous êtes un programmeur mercenaire chargé de créer un programme pour mener à distance vos robots vers la victoire sur des groupes de scrapper rivaux. Vos robots sont des machines en forme d'araignée composées de générateurs de puissance et de boucliers en leur cœur, entourés de nombreux appendices équipés d'outils de préhension, de coupe et d'attaque. Le générateur de puissance est capable de produire 12 unités de puissance (pu) par tick (unité de temps d'un scrapper). Vous contrôlez la façon dont ce pouvoir est réparti entre les trois besoins principaux d'un bot: le mouvement, les boucliers et la puissance de feu.
Les robots Scrapper sont des machines exceptionnellement agiles et peuvent facilement se déplacer sur, sous et autour des obstacles qu'ils rencontrent. Ainsi, la collision n'est pas quelque chose que votre programme doit prendre en considération. Vous êtes libre d'allouer tout, une partie ou aucune des 12 unités disponibles à votre bot pour le mouvement, tant que vous traitez en nombres entiers. Allouer 0pu aux fonctions de mouvement d'un bot le rendrait immobile. Allouer 2pu permettrait à un bot de déplacer 2 unités de distance (du) par tick, 5pu donnerait 5du / tick, 11pu donnerait 11du / tick, et ainsi de suite.
Les générateurs de bouclier de vos bots projettent une bulle d'énergie de déviation autour de leur corps. Un bouclier peut dévier jusqu'à 1 dégât avant d'éclater, laissant ainsi votre robot exposé jusqu'à ce que son générateur de bouclier génère suffisamment de puissance pour remettre le bouclier en place. Vous êtes libre d'allouer tout, une partie ou aucune des 12 unités disponibles à votre bot vers son bouclier. Allouer 0pu au bouclier d'un bot signifie qu'il ne générera jamais de bouclier. L'allocation de 2pu permettrait à un bot de générer un nouveau bouclier 2 sur 12 ticks, ou une fois toutes les 6 ticks. 5pu entraînerait la régénération du bouclier 5 fois sur 12 ticks, et ainsi de suite.
En accumulant une charge dans leurs lasers de soudage, vos robots peuvent tirer des faisceaux dommageables sur de courtes distances avec une assez bonne précision. Tout comme la génération de boucliers, la cadence de tir de vos bots dépend de la puissance allouée à leurs lasers. Allouer 0pu aux lasers d'un bot signifie qu'il ne se déclenchera jamais. Allouer 2pu permettrait à un bot de tirer 2 ticks sur 12, et ainsi de suite. Le laser d'un bot se déplacera jusqu'à ce qu'il rencontre un objet ou se disperse dans l'inutilité, alors faites attention au feu ami. Bien que vos robots soient assez précis, ils ne sont pas parfaits. Vous devez vous attendre à +/- 2,5 degrés de variance de précision. À mesure que le faisceau laser se déplace, ses particules sont progressivement déviées par l'atmosphère jusqu'à ce que le faisceau devienne effectivement inoffensif à une distance suffisante. Un laser inflige 1 dégât à bout portant, et 2,5% de dégâts en moins à chaque longueur de bot qu'il parcourt.
Les robots Scrapper sont suffisamment autonomes pour gérer les fonctions de base, mais comptent sur vous, leur programmeur, pour les rendre utiles en tant que groupe. En tant que programmeur, vous pouvez émettre les commandes suivantes pour chaque bot individuel:
- MOVE: Spécifiez les coordonnées vers lesquelles un bot se déplacera.
- CIBLE: Identifiez un bot à viser et à tirer lorsque l'allocation de puissance le permet.
- PUISSANCE: redistribuez la puissance entre le mouvement, les boucliers et la puissance de feu.
Détails techniques du jeu
Il y a trois programmes que vous devrez connaître. Le Game Engine est le lève-personne lourd et fournit une API TCP à laquelle les programmes des joueurs se connectent. Le programme du lecteur est ce que vous allez écrire, et j'ai fourni quelques exemples de binaires ici . Enfin, le Renderer traite la sortie du Game Engine pour produire un GIF de la bataille.
Le moteur de jeu
Vous pouvez télécharger le moteur de jeu ici . Lorsque le jeu sera lancé, il commencera à écouter sur le port 50000 (actuellement non configurable) les connexions des joueurs. Une fois qu'il reçoit deux connexions de joueurs, il envoie le message PRET aux joueurs et commence la partie. Les programmes des joueurs envoient des commandes au jeu via l'API TCP. Une fois le jeu terminé, un fichier JSON nommé scrappers.json (également non configurable actuellement) est créé. C'est ce que le moteur de rendu utilise pour créer un GIF du jeu.
L'API TCP
Les programmes des joueurs et le moteur de jeu communiquent en passant les chaînes JSON terminées par la nouvelle ligne en arrière et en quatrième sur une connexion TCP. Il n'y a que cinq messages JSON différents qui peuvent être envoyés ou reçus.
Message prêt
Le message PRET est envoyé du jeu aux programmes des joueurs et n'est envoyé qu'une seule fois. Ce message indique au programme du joueur quel est son ID de joueur (PID) et fournit une liste de tous les bots du jeu. Le PID est le seul moyen de déterminer quels robots sont amis contre ennemis. Plus d'informations sur les champs de bots ci-dessous.
{
"Type":"READY", // Message type
"PID":1, // Player ID
"Bots":[ // Array of bots
{
"Type":"BOT",
"PID":1,
"BID":1,
"X":-592,
...
},
...
]
}
Message du robot
Le message BOT est envoyé du jeu aux programmes des joueurs et est envoyé lorsque les attributs d'un bot changent. Par exemple, lorsque des boucliers sont projetés ou que la santé change, un message BOT est envoyé. Le Bot ID (BID) n'est unique qu'au sein d'un joueur particulier.
{
"Type":"BOT", // Message type
"PID":1, // Player ID
"BID":1, // Bot ID
"X":-592, // Current X position
"Y":-706, // Current Y position
"Health":12, // Current health out of 12
"Fired":false, // If the Bot fired this tick
"HitX":0, // X position of where the shot landed
"HitY":0, // Y position of where the shot landed
"Scrap":0, // Future use. Ignore.
"Shield":false // If the Bot is currently shielded.
}
Déplacer le message
Le message MOVE est une commande du programme du joueur au jeu (mais pensez-y comme une commande à un bot). Identifiez simplement le bot que vous souhaitez déplacer et les coordonnées. On suppose que vous commandez votre propre bot, donc aucun PID n'est nécessaire.
{
"Cmd":"MOVE",
"BID":1, // Bot ID
"X":-592, // Destination X coordinate
"Y":-706, // Destination Y coordinate
}
Message cible
Le message TARGET indique à l'un de vos robots de cibler un autre robot.
{
"Cmd":"TARGET",
"BID":1, // Bot ID
"TPID":0, // The PID of the bot being targeted
"TBID":0, // The BID of the bot being targeted
}
Message de puissance
Le message POWER réalloue les 12pu disponibles pour votre bot entre le mouvement, la puissance de feu et les boucliers.
{
"Cmd":"POWER",
"BID":1, // Bot ID
"FPow":4, // Set fire power
"MPow":4, // Set move power
"SPow":4, // Set shield power
}
La compétition
Si vous êtes assez courageux pour explorer les terres sauvages, vous participerez à un tournoi à double élimination contre vos pairs mercenaires. Veuillez créer une réponse pour votre soumission et coller votre code ou fournir un lien vers un dépôt git, un gist, etc. Toute langue est acceptable, mais vous devez supposer que je ne sais rien de la langue et inclure des instructions pour exécuter votre programme. Créez autant de soumissions que vous le souhaitez et assurez-vous de leur donner des noms!
Les exemples de programmes de joueurs seront inclus dans le tournoi, donc je recommande fortement de tester votre bot contre eux. Le tournoi commencera environ deux semaines après que nous aurons reçu quatre soumissions de programme uniques. Bonne chance!
--- Winner's Bracket ---
** Contestants will be randomly seeded **
__________________
|___________
__________________| |
|___________
__________________ | |
|___________| |
__________________| |
|________________
__________________ | |
|___________ | |
__________________| | | |
|___________| |
__________________ | |
|___________| |
__________________| |
|
--- Loser's Bracket --- |___________
|
___________ |
|___________ |
___________| |___________ |
| | |
___________| | |
|___________ |
___________ | | |
|___________ | |___________|
___________| |___________| |
| |
___________| ___________|
Autres informations importantes
- Le jeu fonctionne à 12 ticks / seconde, vous ne recevrez donc pas de messages plus fréquemment que toutes les 83 millisecondes environ.
- Chaque bot a un diamètre de 60du. Le bouclier ne prend pas d'espace supplémentaire. Avec une précision de +/- 2,5%, les chances de frapper un bot à une certaine distance sont représentées par ce graphique:
- La décroissance des dommages du laser sur la distance est représentée par ce graphique:
- La précision d'un robot et la décroissance laser se combinent pour calculer ses dégâts moyens par tir. Autrement dit, les dégâts moyens qu'un bot causera lorsqu'il tirera à partir d'une certaine distance. Les dégâts par tir sont représentés par ce graphique:
- Le laser d'un bot prend naissance à mi-chemin entre le centre du bot et son bord. Ainsi, l'empilement de vos robots se traduira par un tir ami.
- Les bots ennemis apparaissent à environ 1440du de distance.
- Le jeu se termine si 120 ticks (10 secondes) passent sans aucun dommage.
- Le gagnant est le joueur avec le plus de bots, puis le plus de santé à la fin du jeu.
Comprendre l'image rendue
- Le joueur 1 est représenté par des cercles et le joueur 2 par des hexagones.
- La couleur d'un bot représente son allocation de puissance. Plus de rouge signifie que plus de puissance a été allouée au tir. Plus de bleu signifie plus de bouclier. Plus de vert signifie plus de mouvement.
- Le "trou" dans le corps d'un bot représente des dégâts. Plus le trou est grand, plus les dégâts sont importants.
- Les cercles blancs entourant un bot sont son bouclier. Si un bot a un bouclier à la fin du tour, il s'affiche. Si le bouclier a éclaté en subissant des dégâts, il n'est pas affiché.
- Les lignes rouges entre les robots représentent les photos prises.
- Lorsqu'un bot est tué, une grande "explosion" rouge s'affiche.
la source
Réponses:
Extrémiste (Python 3)
Ce bot consacrera toujours tout son pouvoir à une chose: protéger s'il n'est pas protégé, se déplacer s'il n'est pas en position et tirer autrement. Bat tous les bots de l'échantillon à l'exception de Death-Dish.
la source
Moins téméraire ( aller )
À l'origine, je prévoyais de modifier légèrement le programme d'échantillonnage Abandon téméraire afin que les robots ne se déclenchent pas si un robot ami était sur le chemin. Je me suis retrouvé avec des robots qui choisissent de nouvelles cibles lorsqu'un ami est sur le chemin, ce qui, je suppose, est mieux. Ça va battre les deux premiers programmes.
Le code n'est pas parfait. La logique pour déterminer si un tir est clair utilise des suppositions assez aléatoires.
Il ne semble pas y avoir de mécanisme pour cibler "personne". Cela pourrait être une bonne fonctionnalité à ajouter.
L'API TCP est agréable dans la mesure où n'importe quel langage peut jouer, mais cela signifie également beaucoup de code standard. Si je ne connaissais pas la langue dans laquelle les exemples de robots étaient écrits, je n'aurais probablement pas été motivé à jouer avec ça. Une collection d'échantillons passe-partout dans différentes langues serait un excellent ajout à vos autres dépôts git.
(la plupart du code suivant est un copier / coller de l'un des exemples de robots)
la source
Trigger Happy - Java 8
Trigger Happy est une simple évolution de mon robot Bombard d'origine, mais qui n'est plus viable. C'est un bot très simple qui tirera simplement sur l'ennemi actuellement ciblé s'il y a un tir clair, sinon effectue une marche aléatoire pour essayer de se mettre dans une meilleure position. Tout le temps essayant d'avoir un bouclier.
Cependant, malgré toute sa simplicité, il est très efficace. Et détruira facilement les robots d'échantillonnage.
Remarque, il existe plusieurs bogues avec le bot, qui se déclenchent parfois même si ce n'est pas un tir clair et peuvent ne pas maintenir de bouclier ... mais il est toujours efficace, donc soumettra cette entrée telle quelle
Death-dish vs Trigger Happy
Code comme suit:
Pour compiler: javac TriggerHappy.java
Pour exécuter: java TriggerHappy
la source