Confrontation 4 hommes
La description
Vous vous êtes en quelque sorte retrouvé dans une impasse à quatre voies. Un pistolet chargé repose dans vos mains et des grenades sont accrochées à votre ceinture.
L'objectif est d'avoir le plus de santé possible à la fin d'une impasse. Une impasse est terminée quand au plus une personne a une quantité positive de santé.
Chaque joueur a la 5
santé et meurt quand sa santé tombe à / en dessous 0
. Le tour d'un joueur qui meurt est le dernier tour que ce joueur peut subir.
S'il y a un joueur en direct à la fin d'une impasse, ce joueur gagne. Sinon, le joueur avec la santé la moins négative gagne.
Actions
Shoot : Tirez sur quelqu'un.
2
dégâts si vous tirez sur un ennemi vivant0
dégâts si vous tirez sur un ennemi morthealth_at_start_of_turn+2
dommage si vous tirez vous-même. (Notez que cela vous laissera avec la plupart des-2
soins de santé.)- Si un ennemi vous tire dessus au même tour que vous vous tirez vous-même, vous mettez fin à l'impasse avec -4 points de vie (vous subissez quand même des dégâts des autres joueurs le tour où vous vous tuez).
- Votre action au tour suivant sera ignorée (et supposée l'être
Nothing
).
Esquiver : Essayez d'esquiver le tir d'un seul adversaire.
Préparez : Décrochez votre grenade et préparez-vous à la lancer.
- Vous n'avez que trois tours pour le lancer, avant de vous faire exploser (vous infligez des
6
dégâts,3
tous les ennemis vivants sont endommagés) - Mourir avec une grenade non percée équivaut à ne pas lancer la grenade pendant trois tours.
- Vous n'avez que trois tours pour le lancer, avant de vous faire exploser (vous infligez des
Lancer : Lancez la grenade vers quelqu'un et espérez que tout ira pour le mieux.
- La cible subit des
8
dégâts si elle est en vie - Tous les autres (y compris vous-même) subissent des
3
dégâts s'ils sont en vie
- La cible subit des
Rien : restez les bras croisés et regardez tout le monde mourir.
Contribution
Votre programme recevra les informations suivantes:
- La santé de chaque joueur
Liste des actions entreprises par ce joueur depuis le début de la confrontation. Vous trouverez ci-dessous le format des informations transmises par joueur:
[Health],[Action 1],[Action 2],[Action 3],...
Les actions seront données dans le format spécifié dans la section Sortie .
Vous recevrez 4 telles chaînes, séparées par un espace et passées sous forme d'argument unique. L'ordre de ces chaînes est:
[Player Info] [Opponent 1 Info] [Opponent 2 Info] [Opponent 3 Info]
Les chaînes sont passées en tant que deuxième argument. Le premier argument contient un entier qui identifie de manière unique l’impasse en cours d’adoption. Les affrontements entre les mêmes joueurs sont garantis de ne pas être simultanés. Cependant, plusieurs impasses se produiront en même temps.
Par exemple:
$./Player.bash 5 "3,S2,N 5,P,N 3,S0,N -2,S3,N"
Actuellement, le joueur et le second adversaire ont 3 points de vie, le premier adversaire a 5 points de vie et le troisième adversaire a -2 points de vie et est mort.
Au premier tour:
- Joueur 1 tir ennemi 2
- Enemy 1 a préparé une grenade
- Enemy 2 tireur
- Enemy 3 s'est tiré une balle
Au deuxième tour:
- Tous les joueurs n'ont rien fait. (Le joueur et l'ennemi 2 ne peuvent rien faire puisqu'ils ont tiré au tour précédent. L'ennemi 3 est mort: il le fera
Nothing
pour le reste de l'impasse.)
Le second argument au début d'un bras de fer est: 5 5 5 5
.
Sortie
Une commande doit être sortie dans le format indiqué ci-dessous. Une sortie invalide est interprétée comme 'Nothing'. Une commande nécessitant une cible doit être suivie d'un entier ( 0-3
, avec 0
représentant le joueur et 1-3
représentant les ennemis 1 à 3).
S[target]
: Tire [cible].D[target]
: Essaie d'esquiver [cible].P
: Préparez une grenade.T[target]
: Lancer la grenade sur [cible].N
: Ne fais rien.
Une commande qui a besoin d'une cible, mais est alimentée avec une cible qui n'est pas entre 0
et 3
ou qui n'est pas alimentée entièrement avec une cible, sera supposée cibler 0
(le joueur).
Notation
À la fin de chaque confrontation, les joueurs reçoivent un score calculé selon la formule suivante:
35 + health at end of standoff
Dans le cas où un joueur se termine un bras de fer avec la santé négative, ils vont recevoir un score inférieur à 35 . Les points suivants sont également récompensés en bonus:
- Le plus de santé: +4 points
- Deuxième plus de points de vie: +2 points
- Troisième plus de santé: +1 point.
En cas d'égalité, le bonus le plus bas est accordé (si deux personnes sont associées avec le plus de points de vie, on leur attribue +2; si 3 personnes ont le plus de santé, +1 et si tout le monde finit à égalité, +0).
Le score final est déterminé en calculant la moyenne de tous les scores individuels.
Règles / Détails
- L'ordre des événements dans un tour est le suivant:
- Tous les joueurs font leurs actions.
- Les joueurs ayant 0 ou moins de santé meurent.
- Les grenades non tirées qui doivent exploser vont exploser (les joueurs qui viennent de mourir sont toujours blessés, car c'est toujours le tour où ils sont morts).
- Pas de collaboration entre les entrées.
- Trois * affrontements auront lieu entre chaque groupe de 4 joueurs. (L'ordre des joueurs peut varier d'une impasse à l'autre).
- Les entrées consommant une quantité excessive de mémoire d'espace disque seront disqualifiées.
- Lire ou modifier des fichiers autres que ceux de votre entrée entraînera sa disqualification.
- Un camion conduit par un ivrogne écrasera tous les joueurs en vie après le
50th
tournant, si le bras de fer n’est pas terminé à la fin du50th
tour.- Ce camion inflige 20 dégâts à tous les joueurs en direct.
- Les affrontements arrivent vite. Les programmes sont coupés après 1 seconde.
- Votre programme sera appelé à chaque tour, même après votre décès.
- Vous pouvez lire ou écrire des fichiers dans votre répertoire uniquement (si votre entrée s'appelle JohnDoe, vous pouvez enregistrer des fichiers dans le répertoire players / JohnDoe /); cependant, ce ne sera PAS le répertoire en cours pendant l'exécution de votre script.
- Les entretiens auront lieu sur une machine exécutant Arch Linux (version 2014.08.01).
Le contrôleur est disponible sur GitHub .
Veuillez inclure les éléments suivants dans votre message:
- Un nom pour votre bot
- Une commande shell pour exécuter le bot (ex.
java Doe.java
) L'entrée sera passée à travers la ligne de commande sous forme d'argument unique (java Doe.java 5 "-2,S0 -2,S1 -2,S2 5,N"
) - Code de votre bot
- Comment le bot doit être compilé (le cas échéant)
- Langue (et version si applicable, spécialement pour Python)
* Le contrôleur prend trop de temps pour six.
Tableau de bord
Observer 43.280570409982
MuhammadAli 43.134861217214
Osama 43.031983702572
LateBoomer 42.560275019099
SimpleShooter 42.412885154062
LessSimpleShooter 42.3772
Neo 42.3738
Scared 42.3678
Richochet 42.3263
Equivocator 42.2833
TwentyFourthsAndAHalfCentury 42.2640
Darwin 42.1584
HanSolo 42.1025
Coward 42.0458
ManipulativeBastard 41.8948
Sadist 41.7232
Aggressor 41.7058
CourageTheDog 41.5629
Grenadier 40.9889
Bomberman 40.8840
Spock 40.8713
Sniper 40.6346
DONTNUKEMEBRO 39.8151
PriorityTargets 39.6126
Hippolyta 39.2480
EmoCowboy 39.2069
Zaenille 39.1971
AntiGrenadier 39.1919
PoliticallyCorrectGunman 39.1689
InputAnalyzer 39.1517
Rule0Bot 39.1000
BiasedOne 39.0664
Pacifist 39.0481
StraightShooter 39.0292
Ninja 38.7801
MAD 38.2543
Monkey 37.7089
Label1Goto1 36.2131
Generated: 2014/08/22 03:56:13.470264860 UTC
Journaux: sur GitHub
la source
Réponses:
Observateur
Ce mec analyse ses ennemis. Le but est de survivre jusqu'à ce qu'il ne reste qu'un seul adversaire "agressif", puis de le tuer dans un affrontement épique.
Compiler:
javac Observer.java
Exécuter:java Observer arg0 arg1
la source
!player.contains("S" + id)
est-ce une condition nécessaire dans la fonction "isAgressif"? Un joueur suicidaire sera mort de toute façonGrenadier
Les armes sont surestimées. Le vrai bras de fer d'un écossais est le suivant:
Bien que cela semble trivial, ce n'est probablement pas une stratégie terrible . Depuis des fusils et des grenades ont tous deux un cycle de deux tour, c'est de loin le plus efficace 1 moyen de infligent.
Bien sûr, si les trois adversaires me tirent au premier tour, ce n'est pas bon. Mais pas grand-chose d'autre non plus.
Compiler / exécuter de la manière standard Java:
1 note de bas de page inutile
la source
Règle d'Asimov numéro 0 Bot - Python
Assez simple, il attaquera le premier joueur qu'il voit tenir une grenade pour protéger la majorité des humains. Si personne n'est une menace pour la majorité des humains, il ne fera rien.
Courez comme ça:
la source
Han Solo - Python
Han a tiré le premier. Dans ce cas, il tirera en premier en choisissant la cible vivante la plus proche.
Courez comme ça:
Remarque : C’est la première chose que j’ai écrite en Python. Si vous rencontrez des pratiques malveillantes spécifiques à Python, faites-le moi savoir.
la source
is_alive
EmoCowboy
Pourquoi attendre pour mourir? Tue-toi maintenant. Espérons que le reste des imbéciles se soufflera beaucoup moins que -2.
Le score sera normalement -2. Parfois -4 si les gens décident de me tirer dessus. Rarement plus que cela, ce qui signifie que cela devrait battre plusieurs des soumissions actuelles.
Python
EDIT: Ce n'est pas une blague, c'est généralement pourquoi ces soumissions emo sont mal vues. C'est une stratégie légitime. Être en vie est mortel!
la source
Pacifiste
C'est un vrai type de gars, il vient de se retrouver avec la mauvaise foule.
Exécutez en tant que
runghc pacifist.hs
, mais vous voudrez peut-être le compiler avec -O3 si l'efficacité pose problème.la source
-O3
fait une différence foutue.runghc
côté. En fait, il est 10 fois plus lent sur ma machine Linux.Singe - Python (Première entrée!)
Ce que le singe voit, le singe fait. Répétera exactement la dernière action prise par un joueur au hasard.
Peut être exécuté comme ceci: "python monkey.py args" Aucune étape supplémentaire requise.
la source
-1
directement.argv[2]
obtenir l'historique des joueurs.Simple Shooter - Perl (bug corrigé)
Ce bot tire sur l'adversaire avec le plus de santé. C'est une stratégie très simple, mais je pense qu'elle a une chance décente de bien réussir.
Voici comment l'exécuter en utilisant un exemple d'entrée:
la source
Spock, en Python 3.x
Ce code est plutôt une expérience bien pensée (donc nommé d'après Spock parce que ... c'est un vulcan, et ils sont plutôt doués pour ce genre de choses), mais c'était amusant de le construire quand même. Le raisonnement principal derrière tout ce code est l'hypothèse qu'un bon être logique, comme Spock, ferait, si on lui donnait les règles du jeu:
L'objectif de ce jeu est de maximiser le score, ce qui serait fait par tout le monde debout, ce qui est impossible, à cause du camion.
La façon dont Spock joue dans le reste du jeu peut être résumée par sa célèbre citation: " Les besoins de la majorité l'emportent sur ceux de quelques-uns ". En d'autres termes, Spock doit s'assurer que le moins de dégâts possible est subi, en tuant ceux qui le font. Comment il le fait:
Le raisonnement est que, en ciblant les joueurs les plus faibles, nous mettons fin aux sources de dommages. Le raisonnement derrière les grenades est qu'elles partent quand même et qu'elles causent moins de dégâts si elles ne sont pas lancées.
Et si ce bot fonctionne. Je n'ai pas fait de tests approfondis sur les échecs d'entrée (merci de m'avertir si quelque chose ne va pas), mais je suis convaincu que j'ai résolu la plupart des problèmes. J'ai basé une petite partie du code du bot HanSolo, mais la plupart du temps, c'est un fouillis de code enchevêtré. Prendre plaisir.
Courez comme ça:
2014-08-12 -
Correction de bug mineure concernant la détection de grenade 2014-08-14 - Correction de bug mineure concernant la phase finale, merci à isaacg de l'avoir signalé avant
la source
Traceback (most recent call last):
File "./players/Spock/Spock.py", line 87, in <module>: Endgame(current_turn)
File "./players/Spock/Spock.py", line 79, in Endgame: if IsTarget(player, target_health):
File "./players/Spock/Spock.py", line 4, in IsTarget: return int(player[1].split(",")[0]) < target_health
TypeError: unorderable types: int() < str()
player[1][1]
devrait êtreint(player[1][1])
.Gunman politiquement correct
Très politiquement correct, car cela ne discrimine rien. Donc ce n'est pas très intelligent.
Peu importe quels arguments lui sont transmis comment.
python politicallycorrectgunman.py
la source
random.choice(array)
?Bon tireur
Il fait partie de la cavalerie et parle plusieurs langues mais, étant aveuglé, Straight Shooter ne peut voir que l’ennemi en face de lui. Étant un cheval, il ne comprend pas que vous devez attendre entre les tirs.
Perl, Python 2/3, Ruby: ce cheval est vraiment une entrée polygot.
Pour une réponse qui comporte un peu plus de réflexion (et un paradigme fonctionnel), voir Vingt-quatrième et demi-siècle .
la source
Anti-grenadier
Les grenades sont mauvaises. Très mauvais. Donc, si quelqu'un en prépare un, la meilleure chose à faire est de leur tirer dessus. Sinon, nous allons simplement sortir.
la source
Ricochet - Perl
Les stratégies simples semblent bien réussir dans ce défi, alors en voici un autre. Il tire un joueur vivant aléatoire. Il a la particularité supplémentaire de se suicider à la fin pour éviter le camion.
Courez comme si:
la source
Agresseur
Tire au premier tour, au adversaire au plus haut niveau de santé au deuxième tour, tire ensuite à l'adversaire au plus haut niveau de santé.
Exécutez ceci comme ./agg ID "5 5 5 5".
la source
Ninja
Esquive au hasard en essayant d'éviter de se faire toucher.
courir comme
Les args sont inutiles, mais peuvent être ajoutés sans problème.
la source
Nom : PriorityTargets
Commande de shell : ruby PriorityTargets.rb 5 [état_de_jeu]
Langue : Ruby V2.1.2
Description : PriorityTargets tente de trouver des styles de lecture courants. Il décide ensuite, en fonction de ces styles de jeu, qui il veut attaquer et quelle arme utiliser.
Remarque : Première soumission de Code Code! Beaucoup plus grand que les autres soumissions parce que je suis devenu un peu fou.
la source
Coward - Perl
Fait très lâche. Lorsqu'il se sent en bonne santé, il choisit un ennemi qui ne le ressent pas et lui tire dessus. Points bonus pour les ennemis qui tiraient le dernier tour (car ils sont connus pour faire
Nothing
ce tour et donc être absolument sans défense). Quand il ne se sent pas très bien, il court se mettre à l'abri pour sauver sa peau, tirant parfois sur quelqu'un.Joli code Perl standard; enregistrez-le dans un fichier, puis exécutez-le
perl file argument argument [...]
. J'ai vérifié la syntaxe et tout s'est bien passé. J'espère donc que cela ne posera aucun problème.E: élimine un potentiel de division par 0 erreur.
la source
Bomberman
Bot écrit en R, ligne de commande doit être:
Rscript Bomberman.R arg0 arg1
je pris conscience après avoir commencé à écrire ce bot qui Geobits déjà fait un grenadier mais je pense que la mienne est sensiblement différente, en ce sens qu'elle vérifie sa santé est supérieure à 3 avant de préparer une grenade, le jette à la le dernier tireur en premier, et le second le plus sain, et si sa santé est inférieure à 3, il esquivera le joueur dangereux (ni mort ni tireur au dernier tour) ou ne tirera qu’un des joueurs restants.
Modifier
Il semble y avoir un problème de communication entre ce bot et votre contrôleur car tous les journaux que j’ai regardés ont montré que mon bot ne sortait que
N
. Donc, voici le même bot mais réécrit en Python, dans l’espoir que si celui-ci rencontre également un problème de communication, quelqu'un le verra.Être appelé avec
python Bomberman.py arg0 arg1
.la source
Néo
Esquivez un joueur vivant qui n'a pas tiré le dernier tour. Si tout le monde en vie tire au dernier tour, tirez sur un joueur vivant au hasard. Suicide quand vous voyez des phares.
Je ne m'attends pas à grand chose de ce type contre les piqueurs de grenades, mais contre les tireurs, ça pourrait bien marcher. On verra.
la source
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.charAt(String.java:658)
at Neo.main(Neo.java:17)
Vingt-quatrième et un siècle
Cette entrée Python esquive et esquive jusqu’à ce qu’il ne reste que des joueurs passifs ou un seul joueur agressif, puis commence à tirer. Il espère qu'un martien passager s'occupe des grenadiers et des chauffeurs de camions ivres.
Sauf si j'ai fait quelque chose de mal, c'est Python fonctionnel. Cela ne ressemble certainement pas au genre de Python que j'ai écrit avant que Haskell et ses amis ne me trouvent, et je ne pense pas avoir rien muté sur place. Mais si vous savez mieux, dites-le-moi s'il vous plaît.
Courir comme:
la source
Effrayé
Cette soumission a peur de tout le monde. Mais certaines personnes ont particulièrement peur. Donc, il détermine qui est le plus dangereux, et leur tire dessus. Si plusieurs ennemis paraissent les plus dangereux, il tire au hasard.
Ceci est python (2 ou 3, même résultat dans les deux cas.) Enregistrer sous
scared.py
, exécuter avecpython3 scared.py
la source
Bâtard manipulateur - Python
Prépare et jette des grenades. S'il pense que le temps presse ou qu'il y a trop peu d'ennemis, il tire. S'il est seul, il tente de déjouer l'autre gars.
la source
Oussama
J'essaie cela depuis un jour ou deux, maintenant il est temps de poster et de voir comment les autres ont évolué entre-temps.
Compiler avec
ghc -O2 osama.hs
, puis exécuter en utilisant./players/Osama/osama
.la source
Sniper - Lua
Au premier tour, il tirera sur une personne au hasard, puis sur tous les joueurs qu'il peut tuer (2 ou 1 PV). Si aucun de ceux-ci ne fonctionne, il essaiera de tirer sur le joueur qui l'a tiré en dernier, sinon il tirera sur un joueur aléatoire. Courir avec
lua Sniper.lua
la source
lua Sniper.lua 3 "5,S1 3,D3 5,N 5,P"
. Vous devrez peut-être vérifier votrearg
index.lua: ./players/Sniper/Sniper.lua:38: attempt to compare nil with number
pile./players/Sniper/Sniper.lua:38: in main chunk
[C]: in ?
Darwin
La survie du plus apte signifie que le moins sain doit mourir.
Raisonnement
En regardant le lot de résultats du mardi 12, il semble y avoir trois groupes distincts: les survivants; le effectivement suicidaire; et le pire qu'inutile. Les survivants partagent des stratégies simples basées sur le tir. Alors que quelques autres robots ( Spock , Coward ) cibleront l'ennemi le moins en santé, ils compliquent également leurs stratégies avec d'autres actions. Celui-ci ne le fait pas. Comme Simple Shooter , il a une définition claire de la cible et le respecte sans relâche. Il sera intéressant de voir où cela se situe dans les résultats.
Ceci est une version allégée, légèrement modifiée de mon précédent vingt-quatrième et demi-siècle , et partage son invocation:
la source
Zaenille - C
Les priorités:
Compiler avec
gcc <filename.c>
.Courez avec
./a.out <parameters>
.la source
InputAnalyzer
La clé d'un tel jeu consiste à analyser comment tous vos adversaires jouent pour réagir en conséquence. Mon bot fera justement cela en utilisant des algorithmes compliqués qui vont conduire à utiliser mes adversaires tourne à mon avantage en donnant une victoire décisive!
Edit: je maintenant
Compilez le bot avec la commande suivante (besoin d'avoir ghc)
La commande shell à exécuter devrait être la suivante
Remarque: j'ai testé sur Windows, donc si vous avez un problème de conformité / exécution, merci de le commenter et je ferai de mon mieux pour connaître la commande correcte.
la source
Chien nommé Courage
Première chose - tirez les méchants à vue. Puis esquivez au hasard jusqu'à ce que quelqu'un prépare une grenade. Puis, quand tout le monde lui tire dessus, préparez ma propre grenade et lancez-la sur n'importe qui. Mais l'homme de distraction.
Edit: Maintenant implémenté comme je le pensais. Avant, le score était de: 35,9
Mise à jour: tire parfois au lieu d'esquiver
couragethedog.py
Courir comme
la source
MAD - Java
MAD bot fait confiance au pouvoir de l'intimidation par la destruction mutuelle assurée . Chaque fois qu'il n'a pas de grenade prête, il en prépare une. Il évite ensuite les mitrailleurs potentiels jusqu'à ce que quelqu'un essaye de lui causer des dégâts ou que sa grenade soit sur le point d'exploser. Dès le moment où il est attaqué, il lance des grenades sur celui qui a essayé de lui infliger plus de dégâts ce match. Si sa grenade est sur le point d'exploser, il bombarde le principal joueur. MAD n'est pas contre de tirer sur quelqu'un quand il n'y a rien à esquiver ni à lancer une grenade et que sa grenade est encore bonne pour au moins un tour.
Ce Bot aura probablement de mauvaises performances, mais j'ai quand même bien aimé l'idée. MAD ferait probablement mieux dans un domaine avec des robots plus intelligents qui enregistrent le comportement des autres robots et avec plus de matchs entre 4 robots.
la source
java MAD 43 "5 5 5 5"
semble ne rien produire.Sadique
python
Sa priorité est de causer de la douleur et des blessures aux grenades. Il tire le premier tour. Il aime tuer quand on ne peut pas attaquer. Il joue avec les SSS (tireurs simples simples) en esquivant et en tirant pour prolonger la domination. Il a même choisi d'attaquer les premiers qui n'ont rien fait à personne.
Comme il utilise des grenades, il (et tous les autres) ne survivra généralement pas au deuxième ou au troisième round. S'il est jumelé avec un autre grenade, tout le monde mourra. Cela signifie que je ne m'attends pas à gagner mais que j'ai écrit ceci pour apprendre le python (je ne l'avais jamais utilisé auparavant et j'essaie de me familiariser avec de nouvelles langues). Il existe plusieurs autres "premiers tirages", donc si vous pensez que c'est trop similaire, faites-le-moi savoir. Les autres ne semblent cependant pas disposés à tirer et à esquiver.
la source
raw_input
va marcher.sys.argv[2]
semble être le consensus pour les entrées Python. Vous pourriez également trouver une utilisation pourpop
, ce qui vous permettrait de condenserthisisme=player[0];player.remove(player[0])
dans le plus simplethisisme=player.pop(0)
.raw_input
tire deSTDIN
, mais l'historique du joueur est passé à votre programme sous forme d'argument de ligne de commande, c'est pourquoi vous en avez besoinsys.argv
. À des fins de test, vous pouvez simplement le définir manuellement avecsys.argv = ["sadist.py", "0", "5 5 5 5"]
. Ensuite, vous devriez pouvoir appelerplayer=sys.argv[2].split()
. Si l'importationsys
est vraiment impossible, vous pouvez même laisser tomber le point et appeler le tableau à des fins de testsysargv
. Tant que tout le reste fonctionne et que vous revenezsys.argv
dans votre soumission, ça devrait aller.