Chasse aux oeufs de Pâques
Bot trouver oeuf avant lapin trouver oeuf. Bot heureux.
Aperçu
Il s'agit d'un défi du roi de la colline en l'honneur de Pâques et de la tradition de la chasse aux œufs de Pâques!
Votre bot a une vision de deux espaces dans toutes les directions, y compris des diagonales, créant un carré 5x5 autour de vous que vous pouvez voir. Il recherche des œufs et celui qui en trouve le plus gagne!
Le tableau
Le plateau sera composé de o
s, qui sont des œufs de Pâques, #
s, qui sont des murs, *
s, qui sont d'autres joueurs, et s, qui sont des espaces vides.
- Ce sera un carré avec une longueur de bord
(number of entries) * 3
. - Il sera entouré de murs.
- À l'intérieur des murs, il y aura un assortiment de murs en ligne droite placés au hasard
#
, qui auront une longueur aléatoire entre 2 et 10 inclus. Il y en aura(number of entries) * 3
. - Les œufs seront ensuite placés au hasard. Il y en aura
(number of entries) * 4
, et ils ne seront générés que sur descarrés blancs ( ).
- Il doit y avoir au moins 7 entrées pour que le processus de génération de carte fonctionne correctement.
Voici un JSFiddle qui générera une carte aléatoire pour que vous puissiez tester. Voici un exemple, avec (number of entries) = 7
:
#####################
# o ##
# # o ##
# #o ###### ##
###### # ##
## o # # ##
## o# #o# o o##
## #o # # o # #
## # o # # # #
## ## # # o # #
## # # o # # #
## # o # ## # # #
## # # # #
# o # ## # #
# o oo ##o #
#o ####### oo ## #
# # # #
# o o o# #
# o #### o o#
# #
#####################
Une fois le plateau généré, chaque joueur est placé sur une case aléatoire (espace vide).
Contribution
Vous prendrez six lignes d'entrée. Les cinq premières lignes sont votre champ de vision (les espaces hors limites du plateau seront représentés par X
, et l'espace du milieu le sera toujours *
, vous), et la sixième ligne sera vide (au début).
Production
Vous allez produire trois lignes. Tout d'abord, la direction dans laquelle vous souhaitez vous déplacer:
1 2 3
8 YOU 4
7 6 5
(9 est un no-op si vous ne voulez pas bouger), second, un de A
ttack, C
lounter ou N
othing (cela sera expliqué en profondeur bientôt), et la troisième ligne sera n'importe quelle chaîne de longueur jusqu'à 1024 Ce sera la mémoire de votre bot. Vous pouvez l'utiliser pour tout ce que vous souhaitez, ou vous pouvez le laisser vide. Cette mémoire sera alors la sixième ligne d'entrée de votre programme lors de la prochaine exécution.
Toutes les autres lignes de sortie sont ignorées et s'il n'y a qu'une seule ligne, la seconde est supposée vide.
En mouvement
Le processus suivant est utilisé pour déterminer où vous avez déménagé:
- Si, lorsque vous vous déplacez, vous vous retrouvez dans un espace vide (
), votre joueur est placé dans cet espace.
- Si vous vous retrouvez dans un mur (
#
), votre coup est ignoré et vous perdez votre tour. - Si vous vous retrouvez dans un œuf (
o
) ou sur un joueur (*
), ces informations sont stockées et seront utilisées une fois que tout le monde aura déménagé.
Une fois que tout le monde a déménagé, les ambiguïtés sont résolues.
S'il y a deux joueurs qui ont atterri sur le même espace, un combat se produit! C'est là que le A
/ C
/ N
entre en jeu. A
ttack bat thing N
(attaque normale), othing N
beats C
ounter (vous ne pouvez rien contrer) et C
ounter beats A
ttack (contre-attaque). Le joueur qui remporte ce combat reste sur sa case et le joueur qui perd retourne sur la case d'origine sur laquelle il a commencé. En cas d'égalité, les deux joueurs retournent où ils étaient.
Si un joueur perdant ou à égalité retourne là où il était et qu'il y a un autre joueur là-bas, il n'y a pas de combat et l'autre joueur reviendra également à sa case d'origine. Si cet espace a un autre joueur, ce joueur revient en arrière, et cela continue jusqu'à ce que tous les joueurs soient dans des espaces différents.
S'il y a trois joueurs ou plus sur une case, ils retournent tous à leur position d'origine.
Si un joueur est toujours debout sur un œuf ...
- Si le joueur le choisit
A
, l'œuf est détruit. - Si le joueur a choisi
C
, rien ne se passe et le joueur revient à son espace d'origine. - Si le joueur a choisi
N
, le joueur ramasse l'œuf! Le score du joueur est incrémenté de un et l'œuf est retiré.
Les langues
Vous pouvez utiliser n'importe quelle langue disponible gratuitement sur Windows, OSX et Linux, pour assurer l'équité entre chaque candidat. Si le code n'est pas librement exécutable mais peut être compilé ou empaqueté dans un format qui est, veuillez également inclure ce format dans votre réponse. Idéalement, si vous pouvez compiler votre code dans un langage plus courant (par exemple CoffeeScript -> JavaScript), veuillez le faire.
Notation
Votre score sera le nombre moyen d'oeufs que vous collectez sur dix courses. Une course se termine lorsque tous les œufs sont collectés ou lorsque les (number of entries * 25)
tours sont passés. Je vais m'assurer manuellement qu'il est possible d'atteindre tous les œufs pour chaque carte (en générant continuellement des cartes jusqu'à ce que tous les œufs soient accessibles).
Tableau d'affichage
Un tableau de bord sera ajouté lorsque toutes les conditions suivantes seront remplies:
- Au moins sept entrées valides avec un score positif ou nul (non sous-évalué) ont été soumises
- Au moins 48 heures se sont écoulées depuis la création de ce défi (UTC 14:23)
Les règles ne changeront pas pendant cette période pré-concours, sauf pour ajouter des clarifications là où une règle n'était pas claire. Une fois le tableau de bord mis en place, le programme de test sera également affiché ici afin que vous puissiez tester vos entrées. Le code de test pour cela est toujours en cours, mais il est jouable et cela fonctionne. Voici le dépôt GitHub.
la source
9
, il ne pourra jamais être attaqué de manière significative. Si un autre joueur (B) marche sur cette case et gagne, A sera replacé sur sa case d'origine (qui est la même). Mais maintenant, il y a un affrontement parce que A et B sont là, donc B doit retourner sur sa propre place. Le résultat est donc indépendant du combat réel, B revient toujours au carré initial et A reste toujours sur place. Cela me permettrait d'écrire les deux qui pourraient aider une autre soumission en bloquant un chemin pour tout le monde.Réponses:
Cart'o'Gophers
Voici une autre soumission - et celle-ci est en fait censée être compétitive. Encore une fois, c'est en Ruby. Alors lancez-le avec
ruby cartogophers.rb
. Cela a pris beaucoup plus de temps que prévu ...Ce bot se souvient de ce qu'il a vu auparavant et essaie de construire une carte plus grande à chaque tour. Il utilise ensuite une recherche en premier pour l'œuf le plus proche et se dirige de cette façon. S'il n'y a pas d'oeuf qui peut être atteint sur la carte actuelle, le bot se dirige vers le bord ouvert le plus proche de sa carte (afin d'étendre rapidement la carte dans une direction qu'il peut encore déplacer).
Ce bot n'a pas encore de concept d'autres bots et aucune stratégie de combat non plus. Étant donné que je n'ai pas trouvé de moyen fiable de déterminer si mon déménagement a réussi, cela peut entraîner des problèmes. Je suppose simplement que le déplacement a réussi - donc s'il ne s'agissait pas de nouveaux correctifs, ils seront chargés dans la carte aux mauvais endroits, ce qui peut ou non nuire à la recherche de chemin.
Le bot utilise la mémoire pour stocker la carte et sa nouvelle position sur la carte (en supposant que le déplacement sera réussi). La carte est stockée sans sauts de ligne, zippée et encodée en base64 (avec le nombre de lignes de la carte, afin que les sauts de ligne puissent être réinsérés). Cette compression ramène la taille à environ un tiers de la carte non compressée, donc ayant une teinte supérieure à 1000 octets, je pouvais stocker une carte d'environ 3000 cellules, ce qui correspond à peu près à l'exploration complète d'une carte avec 18 bots. Tant qu'il n'y a pas beaucoup de soumissions, je ne pense pas que je puisse être dérangé pour trouver une solution à ce cas.
Après quelques essais contre 5dumbbot
s et 1naivebot
(mon autre soumission), il a très mal fonctionné (comme 1 ou 2 œufs) ou a surperformé les autres d'une marge considérable (7 à 9 œufs). Je pense peut-être à une meilleure stratégie de combat et à la façon dont je peux déterminer si j'ai réellement déménagé ou non. Les deux pourraient peut-être améliorer quelque peu le score.Oh et si vous vous interrogez sur le nom du bot, vous devriez lire The Order of The Stick ( dernier panneau de cette bande dessinée ).
EDIT: Il y avait quelques bugs avec la détection des bords de la carte découverte. Maintenant que je les ai corrigés, ce bot obtient toujours des scores d'environ
20
5dumbbot
s et 1naivebot
. C'est plus comme ça! Si vous ajoutez$stderr.puts map
à mon bot maintenant, vous pouvez vraiment voir comment il découvre systématiquement la carte et recueille tous les œufs en attendant. J'ai également décidé de choisirA
au lieu deN
ne pas monter sur un œuf, pour réduire la probabilité de revenir à la cellule d'origine du bot (ce qui fout en partie la carte).(Il ne fonctionne pas aussi bien contre 6
naivebot
s, d'autant plus qu'il est très possible de se retrouver dans une "impasse" avec un autre bot quand ils veulent tous les deux à plusieurs reprises attraper un œuf et choisirN
. J'ai besoin d'y penser ... )la source
Java Bunny
Ce lapin n'a pas encore fini de grandir (j'ai toujours l'intention de faire des changements), mais c'est un point de départ pour le moment. Il cherche l'œuf le plus proche et se dirige vers lui. Il n'y a pas encore de détection de mur ou de détection hors limites. Il ira chercher l'œuf sur lequel il atterrit, mais sinon il essaiera de se frayer un chemin et d'attaquer autre chose. S'il n'y a pas d'œufs à proximité, il commencera à suivre le lapin le plus proche. Ils pourraient savoir quelque chose qu'il ne sait pas. Sinon, il choisira simplement une direction aléatoire pour marcher. Et il est assez oublieux (pas d'utilisation de la variable mémoire).
Plans pour aller de l'avant:
Mise à jour 1 Mon lapin suivra d'autres lapins s'il ne voit pas d'oeuf. A également refactorisé le code "trouver l'œuf le plus proche" dans sa propre méthode.
la source
N
aiveBot (en Ruby)Voici un bot très simpliste pour faire rouler les œufs (nous voulons frapper ces 7 soumissions rapidement, non?). Mon Ruby n'est pas très idiomatique, donc ce code peut faire grincer des dents de bons rubis. Lisez à vos risques et périls.
Courez avec
ruby naivebot.rb
.Je code simplement en dur quelques cas, où un œuf est visible et non obstrué par un mur. Il ne va même pas pour l'œuf le plus proche, mais choisit le premier mouvement qui a du sens. Si aucun œuf n'est trouvé, le bot fait un mouvement aléatoire. Il ignore tous les autres joueurs et n'attaque ni ne contre.
la source
WallFolower
(jeu de mots délibéré) en Python 3 :
Se déplace vers un œuf s'il y a un œuf en vue, mais seulement s'il est plus proche de cet œuf qu'un autre robot. S'il y a égalité dans la distance, ça vaut quand même le coup. Sinon, un mur LH suit-il (pas actuellement bien implémenté).
J'ai encore besoin de travaux sur le mur, mais je posterai tout de même ici.
la source
sys.exit(0)
àexit(0)
? De plus, j'ai besoin de travailler là-dessus (en ce moment, il suppose que c'est un ``), mais je n'ai pas vraiment le temps. Quand j'en aurai le temps, je viendrai réparer ça.