Ce défi est terminé. Pour voir les résultats finaux des concurrents, cliquez ici
Dans ce défi, chaque soumission correspond à un bot. Chaque bot devrait être une fonction Javascript. Les bots vont se battre pour obtenir la plus haute valeur totale en or. L’or peut être cultivé ou gagné en tuant d’autres bots et est utilisé pour améliorer la guérison, les attaques, le blindage et l’agriculture.
Objectif:
Sur un nombre de tours contenant jusqu'à 1000 tours (se termine lorsqu'il ne reste qu'un seul bot), c'est le bot qui a la valeur totale la plus élevée (la somme de tout l'or obtenu) est le gagnant.
Se tourne:
A chaque tour, chaque bot en vie (> 0 HP) sera exécuté une fois. Il peut retourner un mouvement, qui peut être l'un des suivants:
- Heal: Regagne HP
- Attaque: supprime HP d'un autre bot
- Bouclier: se défend contre les attaques ultérieures
- Stun: Saute le prochain tour d'un autre bot
- Ferme: Gagne de l'or au prix de HP
- Mise à niveau: améliorer certains mouvements
Tous les robots renverront leur mouvement avant que tous ne soient exécutés. Par conséquent, un étourdissement, des soins, une attaque, un bouclier, etc., n'affecteront pas les robots se déplaçant plus tard dans ce tour. Par exemple, si le bot A étouffe le bot B, et que le bot B est après le bot A dans l'ordre du tour, le bot B continuera à se déplacer plus tard dans le même tour et l'étourdissement se produira au tour suivant.
Combat, agriculture et valorisation:
Chaque bot a un maximum de 100 HP et un UID attribué compris entre 0 et 99. Cet UID change après chaque tour et constitue le moyen utilisé par les bots pour se suivre.
La guérison est l'un des mouvements les plus simples, en ajoutant une quantité de HP déterminée par son niveau (à partir de 5 HP). Un bot ne peut pas guérir après 100 CV.
Attaquer un bot par son UID est un autre mouvement possible, avec des dégâts de base de 5 PV au niveau 0. Les bots peuvent également être assommés en sautant leur prochain tour, qui utilise également des UID.
Les robots ont un bouclier supplémentaire HP, qui n'a pas de limite. Ce bouclier HP absorbe les dégâts des attaques directes d’autres bots et s’ajoute au blindage. Au niveau 0, le blindage ajoute 5 boucliers HP.
L'agriculture gagnera 5 or au niveau 0, au prix de 2 HP. Ce 2 HP ne peut pas être blindé. La seule utilisation de l'or (au-delà de la victoire) est d'améliorer les mouvements. Les soins, les attaques et les blindages ont une valeur de base de 5 PV et l'agriculture commence à 5 or. Chacun de ces mouvements a des niveaux individuels, qui commencent à 0. Ces formules détermineront la valeur en HP ou en or d'un mouvement, où L est le niveau:
- Guérison:
L + 5
- Attaquant:
1.25L + 5
- Blindage:
1.5L + 5
- Agriculture:
2L + 5
Le coût de la mise à niveau d'un déplacement est le même pour un certain niveau et est déterminé par 2.5L² + 2.5L + 10
, où L est le niveau actuel. Un bot peut utiliser cette fonction cost(currentLevel)
comme raccourci pour le déterminer.
Les bots commencent avec 25 pièces d'or, ce qui leur permet d'améliorer rapidement soit deux mouvements au niveau 1, soit un mouvement au niveau 2. Cet or de départ ne compte pas dans la valeur totale des bots. Tuer un bot vous donne la moitié de sa valeur totale en or, arrondi, et si deux bots en tuent un au même tour, ils reçoivent tous les deux la récompense.
Entrée sortie:
Pour communiquer avec le contrôleur, la valeur de retour de la fonction est utilisée pour envoyer des informations de déplacement. L'un d'eux doit être retourné:
- Guérir:
heal()
- Attaque:
attack(uid)
- Bouclier:
shield()
- Étourdir:
stun(uid)
- Ferme:
farm()
- Améliorer:
upgrade("heal" / "attack" / "shield" / "farm")
Pour sauter un tour (ne rien faire), ne rien retourner ou une valeur de fausseté.
Pour obtenir le numéro de tour actuel (commence à 1), utilisez turn()
.
Les arguments de votre fonction incluront des informations sur votre bot, les UID d'autres bots et le stockage entre les tours. Le premier argument est un objet avec les propriétés suivantes: uid
, hp
, gold
, et shield
. Ce sont des copies des informations actuelles de votre bot. Il y a aussi un objet imbriqué levels
, avec les numéros de niveau de heal
, attack
, shield
et farm
.
Le deuxième argument est un tableau mélangé de tous les robots vivants autres que le vôtre, formatés en tant qu'objet contenant des propriétés uid
, hp
(plus un bouclier) worth
, et attack
(niveau d'attaque). Le troisième argument est un objet vide qui peut être utilisé pour le stockage entre les tours.
Exemple de robots:
Ce bot agraiera jusqu'à ce qu'il puisse augmenter son attaque au niveau 5, puis attaquera un bot aléatoire à chaque tour jusqu'à ce qu'il meure (ou gagne). Pas très efficace en raison du manque de guérison / blindage.
function freeTestBotA(me, others, storage) {
if (me.levels.attack < 5) {
if (me.gold < cost(me.levels.attack))
return farm();
return upgrade("attack");
}
return attack(others[0].uid);
}
Ce bot a deux modes: offensif et défensif. Il assommera un bot aléatoire ou guérira en mode défensif et il attaquera ou se protégera en mode offensif. Il tentera d'améliorer ses attaques chaque fois que possible.
function freeTestBotB(me, others, storage) {
if (me.gold >= cost(me.levels.attack))
return upgrade("attack");
if (me.hp < 50)
if (Math.random() < 0.5)
return stun(others[0].uid);
else
return heal();
else
if (Math.random() < 0.5)
return attack(others[0].uid);
else
return shield();
}
Règles:
- Les échappatoires standard sont interdites
- Les robots ne peuvent pas lire, modifier ou ajouter de variables en dehors de leur portée, ne peuvent pas tenter de tricher et ne peuvent appeler aucune fonction définie par le contrôleur ou DOM
- La valeur de retour doit être falsy ou l'une des sorties de fonction ci-dessus
- Les bots ne doivent pas être conçus pour cibler un bot spécifique, mais peuvent tirer parti des stratégies communes
- Les robots ne peuvent pas s'attaquer eux-mêmes (découverte suite à un commentaire de @Ness)
- Les robots doivent être suffisamment différents des autres robots pour pouvoir être considérés comme des entrées séparées.
- Faire équipe est maintenant interdit
- Le contrôleur peut être trouvé ici
- Tchat
Nouveau débogage de contrôleur:
À l'aide du fichier gold-battle-log.js
, vous pouvez définir la valeur de la debug
propriété d'un bot botData
sur 0 (pas de journalisation), 1 (journal se déplace) ou 2 (journal se déplace, hp, or, niveaux, etc.).
Le défi se termine à 17h00 UTC le vendredi 9 août
la source
[closed]
à la fin, il est probable que les téléspectateurs occasionnels passeront au-dessus de ma lecture du défi car ils supposeraient que cela est de faible qualité ou hors sujet.Réponses:
Incassable
fourchu de Undyable .
Etant donné les coûts exponentiels des mises à niveau, nous pouvons également mettre à niveau l'agriculture si nous ne pouvons pas améliorer la guérison, ce qui permettra au bot de collecter l'or plus efficacement.
la source
if
déclaration avait été utilisée<=
- actuellement, il ne guérira jamais complètement.ThanosBot
Il y a trop de robots, pas assez d'or pour faire le tour. Ce bot propose une solution.
Génocide, oui, mais aléatoire, impartial, équitable pour les riches comme pour les pauvres.
Ils l'ont appelé un fou.
ThanosBot veut le meilleur pour la communauté de robots et est prêt à aller jusqu'au bout. Au début, il améliorera son attaque, son agriculture et sa guérison, afin de collecter plus efficacement des ressources et de gagner des batailles. Progressivement, il commencera à attaquer des gens au hasard tout en rassemblant des ressources pour les batailles à venir. Il continuera à améliorer son armée, ses armes et lui-même.
Une fois que 50% de la population aura été éliminée, les bots nés ne connaîtront plus que le ventre et le ciel dégagés, il se retirera dans une vie agricole et verra le soleil se lever sur un univers reconnaissant. Il deviendra complètement pacifiste, ne guérissant que par les soupes de légumes et l'agriculture.
la source
Tuer le voleur
Maintenant, non seulement vole tue, mais vole vole tue aussi!
Ce bot ne fait pas grand chose à part Farm, et quand il s'en aperçoit, s'associe pour porter le coup de grâce à un ennemi mourant et parvient à être très bon.
la source
L'égaliseur
Ce bot cherche à rétablir la paix dans la communauté de bot. Il cible sans relâche les robots avec la plus haute attaque, n'abandonnant que si la guérison du bot est meilleure que sa propre attaque. Une fois qu'il ne restera plus que des robots avec un potentiel de guérison pire que son attaque, il se retirera dans une vie d'agriculture pacifique.
la source
Optimiste
Supposons qu’il sera en mesure de passer 80% de son temps à cultiver de manière pacifique. C’est pourquoi il commence tout d'abord par maximiser son activité, puis commence à prêter une attention particulière à ses aptitudes au combat. Sûrement rien ne va mal tourner!
la source
Kill Assist
Pourquoi augmenter la valeur d'attaque quand vous pouvez faire des dégâts de plink tout en obtenant tout le crédit?
Une fois de plus, retrouvez Tiger Stealer. J'ai été en mesure de simplifier plusieurs blocs de code où les déclarations étaient toujours vraies et faussées avec des nombres qui ont entraîné des gains énormes par rapport à l'original.
Je dois le donner à @dzaima pour lui avoir rendu compte qu'il était assez malin d'assommer un riche adversaire susceptible d'être impliqué dans une passe décisive. L'une des (très) rares fois
Stun()
donne un résultat positif. Une fois encore, j'ai pu améliorer l'idée, sachant que Kill Stealer fonctionnerait selon une logique similaire, Kill Assist recherche une "deuxième meilleure" cible (avec une certaine discrétion) et l'étourdit à la place.Mise à jour mineure pour empêcher l'étourdissement du bot sur le point de mourir et l'empêchement de l'étourdissement du bot le plus susceptible de le faire tuer.
Exemples de résultats (top 5 tronqués après 1000 matchs)
la source
runGame(1) results: [...] captFarmer: 13768
Undyable Bot (v3)
la source
PatientStratègeBot
J'ai essayé d'écrire un robot qui commence par définir et défendre en fonction de ses besoins, puis de passer à la mort d'autres robots de grande valeur plus tard dans le jeu.
Actuellement, cela ne semble pas fonctionner correctement, car il a été tué par une bande de robots meurtriers au début du jeu ou est bloqué quelque part dans son mode offensif.
Je suis toujours content que ce soit mon premier code JS, alors ... (j'ai volé des extraits de code ici et là, car c'était plus rapide que de chercher dans la syntaxe de base JS)
la source
Suisse
Comme son nom l'indique, ce bot est
neutrepour la plupart (il aide maintenant à tuer les bots qui vont mourir) et se contente de fermes et de soins, accumulant lentement son or (comme en Suisse)la source
Le bot qui ferme, attaque, protège et même soigne mais ne s'étouffe jamais
(Nom abrégé: TBTFASAEHBNS , à ne pas confondre avec TBTPTGCBCBA )
Ce bot essentiellement:
Éditer 1: Correction d'un problème et amélioration de petites choses dans le bot basées sur des tests avec beaucoup de jeux.
Edit 2: Mises à jour réduites du bouclier.
la source
SniperBot
Ce bot ne sera efficace que si quelqu'un commence à ajouter des robots qui attaquent régulièrement. SmartFarmer est ma solution optimisée actuelle
les vautours n'ont pas besoin d'attaque
la source
int
) sur la ligne 2. ReferenceError: l'intégrité n'est pas définie.me.hp
?if(me.hp <30 && ...)
pourriez être simplifié à la première clause en raison du besoin d’un niveau de guérison absurde pour qu’elle compte (Niv. 65)BullyDozerBot
Mashup of BullyBot et quelques autres bits. Optimist avait un petit morceau d’attaque opportuniste que j'ai remarqué (bien que d’autres bots fassent des calculs similaires).
Au lieu d’intimider la cible en l’étourdissant, il les assassine pour leur butin sucré. Il cible également les plus faibles de la harde contre le harcèlement, mais il abandonnera et ira simplement à l'agriculture si le nombre de PV de la cible la plus faible est trop élevé.
la source
FizzBuzz
Bot principalement offensant. Extrêmement contrarié par le fait qu’il ne peut pas vraiment fonctionner par FizzBuzz, il bourdonne alors avec colère. Quand ce n'est pas Fizzing ou Buzzing, il écrase un autre bot pendant 30 tours, puis abandonne et choisit un autre bot à cibler s'il ne progresse pas.
Effectue extraordinairement incohérent.Qu'à cela ne tienne, met à jour le contrôleur, semble maintenant se situer toujours au milieu du paquet.la source
BullyBot
Essayez-le en ligne!
Peut ne pas gagner, mais tentera certainement ses damndest pour s'assurer que sa cible ne soit pas non plus. bullyBot exploite également le premier tour, de sorte que s'il n'y a pas d'influence extérieure, il battra son objectif 5-0 ou égalerait 5-5.
la source
JustFarm
Je pensais que je commencerais simple.
la source
ScavengerBot (V2)
J'ai réalisé que ce n'était pas vraiment un charognard avant. La nouvelle stratégie consiste à attendre jusqu'à ce qu'il puisse tuer un autre bot. Si personne ne peut être tué, il s'assied et construit un bouclier.
la source
me.levels.attacl
?de mauvaise humeur
La stratégie par défaut de Moody's est de moderniser l'agriculture et la guérison pendant un certain temps, puis d'éliminer les autres robots par ordre décroissant de valeur. Cependant, si c'est attaqué, il va avoir peur et se recentrer sur la guérison pour un peu. S'il attaque et "échoue", parce que la victime guérit ou se protège plus efficacement que l'attaque, elle se mettra en colère et partira pour améliorer ses capacités d'attaque.
la source
Bandit
Première tentative d'un bot d'apprentissage du renforcement. Pour l’instant, purement défensif pour limiter l’espace de recherche. Une sorte de spin-off plus intelligent de FizzBuzz - il répète une série spécifique de cinq actions à plusieurs reprises; les cinq actions sont ce que choisit RL.
Pour l’instant, elle est principalement basée sur le dénombrement - je viens de générer les 3 ^ 5 = 243 permutations de séries de cinq actions défensives qui se répètent encore et encore, et stocke leurs scores moyens (divisés par 200, pour obtenir le gain moyen cinq tours) sur 100 itérations dans le
storage.prior
tableau. Ensuite, pendant le jeu, il met en œuvre une approche epsilon-gourmande pour mettre à jour ces listes de partitions afin d’être plus à l’avenir. (Et aussi parce que l'utilisation d'epsilon = 0.3 a été bien meilleure que d'epsilon = 0.1, je l'ai donc conservée.)Ça va, en plaçant systématiquement entre scavengerBot et Optimist. Je suis actuellement en train de m'entraîner davantage sur de vrais jeux et de rechercher de meilleurs moyens de cadrer la stratégie pour voir si je peux l'améliorer.
la source
L'opportuniste
Celui-ci emprunte un peu à quelques autres (notamment ScavengerBot (V2) et Unkillable) car ils avaient les mêmes idées que moi, mais j'aime généralement les styles bien arrondis et touche-à-tout que de me concentrer uniquement sur une ou deux choses. Cela signifiera probablement que je ne gagnerai pas, mais cela devrait se situer quelque part au milieu (ce qui m’arrive le plus souvent dans beaucoup de choses).
Donc, il vole des tueries juteuses; guérit si nécessaire; améliore la ferme, attaque et soigne dans cet ordre; et les fermes autrement.
la source
others
ScaredBot
highest attack * (25% of bots)
, ou s’approche de la limite inférieure deHP + shield
, alors il protège< 50
, il guérit.L'idée est de rester en vie le plus longtemps possible et sinon, tentez d'obtenir de l'or de manière sûre et peu coûteuse pour pouvoir vous mettre à niveau.
Les priorités de mise à niveau devraient probablement être modifiées, ainsi que la condition pour déterminer s'il faut protéger.
la source
SmartFarmer
Les fermes, améliore l'agriculture, guérit si la santé est faible. L'agriculture semblait maîtrisée jusqu'à l'arrivée des robots réellement offensifs. Maintenant mon bot est tué :-(
la source
Mort
Chaque tour, compare le bénéfice amorti de la destruction de chaque bot à celui de l'agriculture et de la guérison et choisit la meilleure option. Vraiment, il devrait utiliser l’état pour déterminer le temps qu’il faudra pour tuer un bot, mais pour l’instant, il suppose simplement que chaque bot guérit ou protège avec une moyenne de 5 points par tour, net des dégâts que les autres robots font.
la source
Bot sympathique
others[0].hp
esthp + shield
au lieu dehp
...la source
Le comptable
Ce bot pratique calcule le coup le plus avantageux sur le plan économique, mais il aime garder son profil d'attaque faible pour éviter les ennuis de la part de tous les robots vigilants. Il n'essaye pas d'aider les sans défense ni de s'en prendre à eux. Il fait plutôt ce qui l’aide le plus.
la source
vraimentCommittedTurtle
Voici la chose. C'est devenu vraiment dangereux là-bas. L'agriculture augmente votre valeur et fait de vous une cible. Il n’est donc vraiment pas prudent de cultiver tant que vous n’avez pas construit un immense bouclier et que la violence n’est plus en place. Ensuite, vous pouvez sortir la tête de votre coquille et commencer à cultiver. Ou tuer-aider. Tout ce qui paie mieux.
la source
Gardien
Je peux avoir plus d'une soumission, non?
Une fourchette de CampBot. Ne protège pas, se concentre plutôt sur l'attaque. Montre une préférence pour attaquer les joueurs avec des statistiques d'attaque plus élevées, plutôt que de frapper au hasard, comme CampBot. Met l'accent sur la modernisation de l'agriculture plutôt que sur la guérison.
la source
let victim=potentialVictims[Math.floor(Math.random()*potentialVictims.length)]
Rando
Ce gars stupide va choisir des actions basées sur un caractère aléatoire uniforme avec quelques préjugés. Si une action choisie au hasard ne fonctionne pas, elle passe au choix suivant.
Donc, en moyenne, il devrait attaquer presque 2/9 du temps et cultiver près de 3/9 du temps. Les autres ont environ 1/9 de chance s’il est capable de s’améliorer, ou si la guérison / protection en vaut la peine, etc.
Il ne sera probablement pas performant, mais au moins, il y a une petite chance qu'il règne en maître. Et c'est tout le but de Rando. Il a juste besoin de croire en lui! Toutes les options sont devant lui. Il lui suffit de choisir ce qui est nécessaire pour une situation donnée.
(Je sais que "default" n'est pas nécessaire, mais je pense que c'est une bonne pratique de codage pour un code robuste.)
la source
Tuer Bot
Un bot simple, Kill Bot veut juste tuer ses ennemis. Puisque le bouclier est beaucoup plus efficace que la guérison (surtout lorsqu'il est nivelé), Kill Bot essaie juste de toujours être une cible peu attrayante en se protégeant chaque fois qu'il est attaqué. Kill Bot fait assez bien parmi les bots pacifistes faibles ici (vous pouvez sentir son mépris pour eux).
la source
o.attack
c'est le niveau d'attaque, pas ses dégâtsFarmHeal Bot
Source du bot JustFarm de @Anonymous
la source
Indestructible
Une modification du bot de Draco18, utilisant des boucliers (plus efficace contre les autres robots)
la source