Jeu de la faim - Manger ou mourir
Si tu ne manges pas, tu meurs. Si vous mangez, vous vivez (jusqu'à votre mort). Vous allez mourir, alors essayez de mourir en dernier.
Vue d'ensemble
Il y a une île peuplée d'un troupeau de proies. Vous contrôlez un groupe de cinq prédateurs. Votre but est de garder votre sac en vie. Faites cela en mangeant une proie. La proie a tendance à fuir les prédateurs et à essayer de rester dans un troupeau autrement. Bien sûr, votre paquet sera sur le même terrain que tous les autres , alors la compétition essaiera de les manger avant que vous puissiez. Ne laissez pas cela vous décourager, sinon vous mourrez de faim.
Comment jouer
Créez et soumettez un programme en ligne de commande pour diriger votre pack. Il recevra les informations d'état du programme de contrôle sur STDIN et les commandes de sortie sur STDOUT. Le format est décrit en détail ci-dessous. Chaque programme ne sera exécuté qu'une seule fois et doit rester actif jusqu'à ce qu'il ne reste plus aucun membre du pack en vie. Vous devrez lire les commentaires dès leur réception et réagir rapidement. Il y a un délai d'attente strict de 200 ms pour chaque réponse. Si vous n'avez pas répondu à ce moment-là, votre pack ne recevra pas de nouvelles instructions pour le tour en cours.
Si votre programme ne peut pas être exécuté par le contrôleur, il ne sera pas considéré comme valide. Veuillez inclure la chaîne de ligne de commande que je devrai utiliser pour exécuter votre soumission. S'il y a des instructions spéciales (pour installer les compilateurs, etc.), veuillez les inclure. Si je ne parviens pas à le faire fonctionner, je vous demanderai de l’aide pour vos commentaires. Si vous ne répondez pas, je ne serai pas en mesure d'accepter votre soumission.
Le tournoi se déroulera sur un système Linux 64 bits. Gardez cela à l'esprit lorsque vous donnez les instructions nécessaires.
Détails
La position et la direction de chaque créature se présentent sous la forme d'une paire de nombres à virgule flottante double précision (p
double
. Ex. ) Représentant leurs coordonnéesx
ety
.Chaque créature est considérée comme un point. Cela signifie qu'ils peuvent se chevaucher et occuper le même espace. Vous ne serez pas mis de côté et il n'y a pas de concept de collision avec d'autres créatures.
L'île est une place, 500 unités sur le côté. Si vous essayez d'aller au-delà de ces limites, vous serez coincé sur le bord. L'origine
{0,0}
est en haut à gauche, avec unex
augmentation à droite ety
une diminution. Encore une fois, la carte ne se termine pas .Le jeu commence avec plus de 1500 proies (packCount * 50) . Ils seront rassemblés au centre de l'île, mais décident rapidement de commencer à bouger.
Les paquets seront disposés dans un cercle uniformément espacé autour du périmètre. La commande du paquet est mélangée, alors ne comptez pas commencer dans un endroit particulier.
Les animaux proies peuvent voir tous les autres animaux dans un rayon de 30 unités. Ils peuvent se déplacer à un maximum de 6,0 unités par tour.
Les prédateurs peuvent voir tous les autres animaux dans un rayon de 50 unités. Ils peuvent se déplacer à un maximum de 6,1 unités par tour. Cela signifie qu'ils peuvent voir leurs proies avant d'être vues et (à peine) les distancer.
Les prédateurs vivent et meurent en fonction de leur faim . Il commence à 1000 et diminue d'un tour à chaque tour. Si, après le déplacement, un prédateur se trouve à moins d'une unité de proie, il le mangera automatiquement. Cela supprime la proie et règle la faim du prédateur à 1 000. Chaque prédateur ne peut manger qu'une seule proie par tour. S'il y en a plus d'un dans la plage, il mangera celui que la boucle arrive en premier (pas nécessairement le plus proche). Un prédateur meurt si sa faim atteint zéro.
Les packs commencent par cinq membres chacun. Tous les 5000 tours, tous les packs encore en jeu engendreront un nouveau membre. Il sera placé à portée visible d'un membre du groupe. Assurez-vous que vos entrées peuvent gérer plus de cinq membres.
Tous les 1000 tours, plus de proies vont apparaître. Le nombre de nouvelles proies sera le nombre de prédateurs vivants moins un.
Les prédateurs ne peuvent pas attaquer d'autres prédateurs. Ils mangent des proies quand ils l'attrapent. C'est ça.
L'ordre dans un tour est:
- Toutes les proies prennent des décisions
- Tous les prédateurs prennent des décisions
- Toutes les proies bougent
- Tous les prédateurs bougent / mangent
L'ordre dans lequel chaque pack prend ses décisions / se déplace sera randomisé à chaque tour.
Protocole (général)
Toutes les communications sont effectuées au format chaîne US-ASCII
. Les nombres sont convertis en chaînes avec Java Double.toString()
ou Integer.toString()
. Votre sortie doit être formatée pour pouvoir être lue par Java Double.valueOf(String)
(vous ne produirez pas d’entiers). Pour plus de détails sur les formats analysables, voir la documentation deDouble
. Tous les champs d'une ligne sont séparés par le \t
caractère standard et les nouvelles lignes le sont \n
. La chaîne entière sera terminée sera un octet nul \0
.
Dans les exemples ci-dessous, j'utilise <>
pour marquer les champs à des fins de lisibilité. Ce ne sont pas présents dans les chaînes réelles.
Protocole (entrée)
La longueur de la chaîne d’entrée varie en fonction du nombre de créatures visibles par votre pack. Il peut dépasser 100 000 caractères, alors préparez-vous à cela. La configuration de base est la suivante:
Ligne 0: informations de base sur le jeu.
turn
est le numéro de tour actuel et les comptes représentent le nombre total de proies et de prédateurs laissés sur le terrain. Ce sontinteger
sous forme de chaîne.<turn>\t<preyCount>\t<predatorCount>\n
Ligne 1: Identifiants uniques et niveaux de faim des membres de votre meute. Celles-ci ne sont pas données dans le même ordre pour chaque entrée. Utilisez les identifiants uniques pour suivre les membres individuels, pas l'ordre dans lequel ils apparaissent dans l'entrée. Encore une fois, ce sont des
integer
chaînes. Pour un paquet de deux, ce serait:<id[0]>\t<hunger[0]>\t<id[1]>\t<hunger[1]>\n
Ligne 2: Les positions de vos membres du groupe, dans le même ordre que celui indiqué à la ligne 1 . Ce sont
double
comme chaîne:<x[0]>\t<y[0]>\t<x[1]>\t<y[1]>\n
Les lignes suivantes représentent la visibilité de chaque membre du pack, dans le même ordre que celui indiqué à la ligne 1 . Celles-ci seront données comme deux lignes par membre.
Le premier pour chacun consiste en des emplacements pour la proie qu'il peut voir. La seconde est l’emplacement des prédateurs qu’il peut voir. Ces endroits ne sont pas uniques dans leur ensemble. Par exemple, si deux membres du groupe peuvent voir le même animal, il sera dans la chaîne des deux membres. De plus, vos propres membres du pack seront inclus. Si vous souhaitez les exclure, vous pouvez comparer les emplacements avec vos propres membres. Tous les emplacements sont au double
format chaîne.
Pour chaque membre vivant:
<prey[0].x>\t<prey[0].y>\t<prey[1].x>\t<prey[1].y>\n
<predator[0].x>\t<predator[0].y>\t<predator[1].x>\t<predator[1].y>\n
Enfin, le dernier caractère sera \0
au début de la ligne suivante.
Exception: si vous recevez une entrée dead\0
, votre pack est mort. Terminez votre programme avec grâce, s'il vous plaît. Le contrôleur doit arrêter tous les processus en cours lorsqu'il est fermé, mais je préférerais ne pas avoir de processus zombies partout. Par courtoisie, vous pouvez inclure un délai d’entrée. Par exemple, mon exemple de classe se termine s'il ne reçoit aucune entrée pendant 15 secondes.
Protocole (sortie)
La sortie est simple. Vous donnerez une paire de double
valeurs pour chaque membre du pack live. Ceux-ci représentent le mouvement que vous voudriez qu'ils prennent ce tour-ci. Par exemple, si votre créature est actuellement sur {100.0, 100.0}
et que vous lui en donnez la commande {-1.0, 1.0}
, ils se déplaceront vers {99.0, 101.0}
. Tous les numéros seront sur une seule ligne, séparés par des tabulations.
Par exemple, si vous aviez 3 membres du pack en vie, cette réponse serait valide:
1.0\t-1.0\t2.0\t-2.0\t3.0\t-3.0\0
Cela déplacer vos créatures par {1.0,-1.0}
, {2.0,-2.0}
et {3.0,-3.0}
. L'ordre est le même que celui reçu dans l'entrée. N'oubliez pas la fin \0
!
Si vous donnez une entrée invalide, vous obtiendrez de mauvais résultats. Si un nombre unique ne peut pas être analysé comme un double
, il deviendra zéro. Si la chaîne dans son ensemble ne peut pas être analysée, aucune nouvelle instruction ne sera donnée et l'ensemble de votre pack utilisera les instructions du tour précédent.
Toutes les directions seront serrées à une distance maximale de 6,1 unités. Vous pouvez vous déplacer plus lentement que cela si vous le souhaitez. Par exemple, {1, 0}
vous déplacerez une unité. {6,8}
(distance 10) ne vous déplacera que 6,1 unités et sera réduit à environ {3.66, 4.88}
. La direction reste constante.
Important: le programme de contrôle lit votre STDOUT et votre STDERR. Si vous générez une exception et imprimez sur STDERR, il est très peu probable que le message se présente sous la forme d'une réponse valide. Essayez d'éviter de faire cela.
Programme de contrôle / test
La source du contrôleur peut être trouvée ici à bitbucket.org . Vous aurez besoin de le compiler avant de lancer. La classe principale est Game
, et toutes les classes sont dans le package par défaut. Pour exécuter, incluez la commande de chaque pack en tant qu'argument séparé. Par exemple, si vous souhaitez exécuter un Java ChaserPack et un Python LazyPack.py, vous pouvez utiliser:
java Game "java ChaserPack" "python LazyPack.py"
Sur la carte, les proies apparaissent en vert et les prédateurs en rouge. Cependant, quel que soit le paquet, le premier paquet donné en argument sera coloré en bleu. Ceci est destiné à les distinguer plus facilement à des fins de test. Les prédateurs clignotent également en blanc pendant cinq images lorsqu'ils mangent.
Le jeu se poursuivra jusqu'à ce que le dernier prédateur meure de faim, écrivant sur la console à mesure que des événements de famine ou d'extinction se produisent. Une fois le jeu terminé, le score sera attribué à chaque groupe. Si vous ne voulez pas voir les événements de famine / extinction, vous pouvez utiliser l' -silent
argument. Ensuite, il ne sortira que le score final Vous devez passer ceci comme premier argument :
java Game -silent "java ChaserCat" "./someOtherPack"
Inclus est un pack Java squelette nommé GenericPack
. Il comprend les opérations d'entrée / sortie de base nécessaires. Il est là pour donner un exemple clair de la façon d’analyser et de répondre. Si vous souhaitez ajouter un modèle dans une autre langue, faites-le moi savoir.
Un prédateur basé sur le modèle est également inclus ChaserPack
. Il ne sera pas inclus dans le tournoi et est uniquement inclus à des fins de test. Il fonctionne assez mal en raison d'un défaut de ciblage intentionnel. Si vous ne pouvez pas le battre, continuez d'essayer.
Vous trouverez ci-dessous un exemple d'exécution du programme de contrôle (cliquez pour voir la vidéo). La qualité vidéo n'est pas excellente (désolée), mais vous pouvez avoir une idée de la façon dont la proie bouge. ( attention: audio )
Notation
Le gagnant sera déterminé par tournoi, en gagnant des points à chaque tour.
Chaque tour se poursuit jusqu'à ce que tous les prédateurs soient morts. Chaque meute sera notée en fonction du moment où son dernier membre est décédé de faim. Ils se verront attribuer des points en fonction de la commande. Les points seront cumulés pendant dix tours et le vainqueur est le groupe qui totalise le plus de points.
La première place pour chaque tour recevra 100 points. Après chaque place, la récompense sera réduite de 20% (arrondi à la baisse). Cela continuera jusqu'à ce que les points atteignent zéro (après la 17ème place). Les places de 18 ans et plus ne recevront aucun point pour la ronde. Les packs ex aequo recevront des points égaux. Par exemple:
1st : 100
2nd : 80
3rd : 64 (T)
3rd : 64 (T)
4th : 51
...
17th: 1
18th: 0
19th: 0
Le maximum de points possibles au cours du tournoi est de 1000, de la première place tous les dix fois.
Si plusieurs programmes mettent fin au tournoi à égalité pour la première place, un autre tournoi de dix tours sera organisé avec uniquement les inscriptions de la première place soumises. Cela continuera jusqu'à ce qu'un vainqueur émerge.
Je vais essayer d’organiser un tournoi environ toutes les semaines ou au fur et à mesure de l’arrivée de nouvelles propositions.
Règles additionnelles (fair play!)
Vous ne pouvez pas lire ou écrire sur des ressources externes. Comme vous n'allez pas appeler votre programme plusieurs fois, toute information d'état peut être stockée en interne.
Ne pas interférer avec d'autres processus / soumissions. Cela ne signifie pas qu'il ne faut pas essayer de voler leur proie, de les distancer, etc. Cela ne veut pas nuire au bon déroulement du processus. Ceci est à ma discrétion.
Les candidats sont limités à un maximum de trois inscriptions. Si vous soumettez plus, je ne marquerai que les trois premiers. Si vous souhaitez en révoquer un, supprimez-le.
Les entrées peuvent ne pas exister uniquement pour soutenir d'autres entrées. Chacun devrait jouer pour gagner sur son propre mérite.
Votre programme peut générer au maximum un processus enfant à la fois ( nombre total de descendants et non direct). Quoi qu'il en soit, assurez-vous de ne pas dépasser le délai d'attente. Vous ne pouvez en aucun cas invoquer la
Game
classe elle-même.
Résultats - 29 avril 2014
Voici les résultats du dernier tournoi de dix rounds:
Clairvoyant : 1000
EcoCamels : 752
Netcats : 688
RubySpiders : 436
RubyVultures : 431
CivilizedBeasts : 382
LazyPack : 257
Les packs soumis avant 09h00 EDT le 2014/04/29 sont inclus dans cette analyse.
Vous pouvez également afficher les détails de chaque tour . Pour une raison quelconque, j'ai décidé de numéroter les tours en arrière, donc cela commence par "tour 10".
Mises à jour
2014/04/23: FGreg a signalé un bogue lié aux délais d'attente (merci!). Un correctif a été implémenté. Les testeurs souhaitent donc mettre à jour le code de leur programme de contrôle.
la source
Réponses:
Voyant
Code mis à jour pour faire face à AbleDogs
Woo hoo! Enfin bat que Netcats! J'ai étendu le code existant (crédits à Geobits!) Avec quelques modifications mineures pour créer ce futur pack de prédiction. Rien ne vaut les prédateurs qui savent où la proie va bouger!
Sur deux tests que j'ai faits, mon groupe a toujours vaincu Netcats. Mais cela ne fonctionnera pas aussi bien s'il n'y a pas d'autres packs, car la prédiction échoue toujours s'il y a trop d'autres proies à proximité.
Je peux probablement inclure le truc de CivilizedBeasts pour réduire considérablement le nombre de proies au cours des premiers milliers de tours.
A partir du nom de mon pack, vous devriez savoir quelle stratégie j'utilise = D
Modifier :
Améliorez les cas particuliers lorsque la version précédente était bloquée au coin.flock[ALIGN]
Facteur de proie inclusJ'ai compté combien de proies chaque paquet mange, et voici le résultat:
Mon paquet est très agressif, et la plupart des 916 comptent, je pense que cela provient du vol de proies de Netcats, tout comme RubySpiders.
CivilizedBeasts perd malheureusement à cause du chameau central d'EcoCamel.
Et EcoCamel (avec le seuil critique de la faim 500) est assez efficace, il mange juste assez pour survivre.
Également avec cette mise à jour de Clairvoyant, le jeu atteint à peine 10 000 tours.
Le code:
la source
Netcats
Voici un pack pour vous aider à démarrer. Il étend la
GenericPack
classe incluse dans le programme de contrôle. Il a été amélioré depuis la publication initiale et ne se laisse plus mourir de faim avec un troupeau clairsemé.Les Netcats utilisent une formation de filet en forme de vé pour piéger leurs proies dans un coin, où elles peuvent les manger à loisir. Le filet est formé avec un membre "tête" au centre. Une fois que la tête a mangé, elle change de place avec le membre du sac le plus affamé, car la tête est normalement la première à avoir la possibilité de manger.
Le filet commence plutôt petit, mais s'élargit lorsque le troupeau devient plus petit afin de chaluter le champ plus efficacement.
Si aucune proie n'est visible, la formation s'élargit pour former un modèle de recherche naïf couvrant la majeure partie de l'île.
Une fois que le groupe est réduit à deux membres, le réseau ne fonctionne tout simplement pas. À ce stade, chacun suit son propre chemin, mangeant goulûment la chose la plus proche qu'il peut trouver et faisant une promenade semi-aléatoire autrement.
Cette version survit beaucoup mieux que les Netcats naïfs vus dans la vidéo liée à la question.
la source
Araignées rubis
Comme parfois moins c'est plus et de nombreuses solutions essaieraient probablement de coincer la proie de toute façon ...
Je pensais que mon sac pourrait se séparer et attendre que les autres fassent le travail.
Mise en garde: il ne continue pas réellement à fonctionner, il ne lit pas d'entrée lorsqu'il entre ni ne réagit rapidement. Néanmoins, comme cela fonctionne bien avec le contrôleur, j'espère qu'il sera qualifié sans ajustement supplémentaire.
la source
CivilizedBeasts
Enfin, le temps de montrer mes bêtes!
Ma race pense que la chasse est un peu primitive alors ils travaillent ensemble dans une équipe de 4 et abandonnent ainsi leur cinquième allié, car: moins de prédateurs = plus de proies pour eux-mêmes. Ce qu’ils font, c’est ce que les humains font, ils attrapent des proies et prennent bien soin de leur bétail;)
Il devient assez difficile pour mes seins de survivre avec moins de 200 proies au tour + -12.000 avec seulement les Netcats ennemis dans le match. Vous serez heureux avec cette race car elle dévore des quantités massives de proies avec une rapidité inégalée (aucune autre race ne le peut jamais (les massacres rapides et volumineux n'offrent pas la victoire, mais ils influencent considérablement le temps (long) d'un tour complet).
la source
Vautours Rubis
Voici un paquet de parasites plus actifs . Ils essaient d’ entourer le plus proche prédateur en mouvement pour pouvoir voler sa proie . Ils dépendent un peu de la chance car ils n’ont aucun moyen intelligent de choisir qui va suivre, mais ils battent généralement les poursuivants et parfois les araignées .
Ils ne sont pas tout à fait finis, j'ai posté ceci pour pousser le tempo :)
J'espère:
22 avril 2014: ajout de l' ennui , ce qui les rend moins collants et leur permet de chasser leurs proies par eux-mêmes et de rechercher leurs prédateurs
la source
MauvaisEco ChameauxEdit: Mutation # 2. Oh, non, je suis en retard dans mon implémentation de la prédiction du mouvement des proies, pour être le premier à battre les Netcats. OK, ainsi soit-il.
Cette mutation a une
$hunger_critical
variable (constante). En le changeant à une valeur supérieure à 1000, les chameaux chassent toujours, comme les clairvoyants. Ensuite:Si,
$hunger_critical
par exemple, la valeur est 500 (comme ci-dessous), mes chameaux (après avoir vu les horreurs de la civilisation ) essaient de se comporter de manière respectueuse de l'environnement (ils ont donc changé le nom de leur race), c'est-à-dire qu'ils ne tuent que lorsqu'ils ont faim. S'ils n'ont pas faim, ils patrouillent dans les zones critiques de l'île, au centre et dans les coins, pour empêcher toute chasse inutile à d'autres chasseurs. Eh bien, avec center, cela fonctionne plus ou moins. L’idée de tourner dans les coins était de chasser la proie et de rendre la vie plus difficile pour les chats et les parasites. Ça ne marche pas. Une proie stupide va dans les coins quand même.Il est également intéressant de noter que le
flock[ALIGN]
composant ne peut être deviné que par des prédateurs, et que mon implémentation est différente de celle de la moitié. Je crains qu'il n'y ait un bug mineur dans monarnaquemise en œuvre du code de Geobits, regarder / comparer la chasse individuelle des Chameaux vs clairvoyants.Et le programme est un peu long maintenant, désolé.
Edit: Mutation # 1. L’île s’avère très radioactive (ce qui explique le manque de végétation et la nature inexplicable des créatures «proies»), voici donc la première mutation de mes chameaux. Chacun d'entre eux peut devenir chasseur solo, s'il a faim ou s'il n'y a pas de coin libre pour tout le monde. Hunter tente de poursuivre activement sa proie à proximité. S'il n'y en a pas, il patrouille en grand cercle autour du centre de l'île, puis poursuit la créature la plus proche lorsqu'il la trouve. Malheureusement, la direction de la proie devient imprévisible quand elle est près de son essaim (il est intéressant de se renseigner ...), la chasse en solo n'est donc pas très efficace. Mais si cela réussit, le chameau va digérer le coin libre le plus proche (le cas échéant). Lorsque le niveau de faim est inférieur à un certain niveau, un chameau abandonne son coin (probablement en maudissant Netcats ("où est la nourriture?" )) et se déplace librement en itinérance. Etc.
La même blague racontée deux fois n’est pas drôle, mais (1) je dois commencer quelque part et je suis novice dans ce domaine, (2) honnête, j’ai pensé à la tactique du corner (et qui ne l’a pas fait?), En regardant Netcats, avant Ruby Les araignées sont apparues sur l'île.
Alors, déjà entendu parler de chameaux carnivores? De pauvres animaux se sont réveillés un jour sur cette île abandonnée pour ne trouver ni herbe ni arbre, mais plein de choses étranges, vertes mais comestibles, bougeant rapidement (plutôt gênantes). N'ayant pas d'habitudes de chasse (mais ils muteront bientôt, j'espère), mes chameaux ont développé un stratagème très diabolique pour survivre: ils se sont divisés en quatre coins, et le cinquième va au centre (y mourir le premier, il s'avère). Sur leurs destinations, ils attendent patiemment, exécutant une sorte de danse de guerre de chameaux, ou peut-être essaient-ils simplement de ne pas marcher sur les autres animaux déjà présents, araignées et autres ...
la source
vec
propriété est fondamentalement juste le déplacement du tour précédent au tour actuel. Et comme je le disais, nous faisons la correspondance du tour précédent pour savoir quelle proie va dans quel sens, nous ne pouvons pas compter sur l'ordre des proies. Ceci est possible parce que les proies gardent généralement une distance suffisante (> 12 unités), de sorte que la plupart du temps, nous pouvons faire correspondre les proies du tour précédent au tour actuel.AbleDogs - PHP
Ces gentils chiens ont appris à mordre les mollets d'une proie pour l'aiguiller le long des murs. Ils aiment aussi errer dans les pâturages à la recherche de nouvelles proies. Enfin, ils ont appris à s'abstenir de manger sauf s'ils ont réellement besoin de calories.
Mettez le code dans un
AbleDogs
fichier et exécutez-le avecphp AbleDogs
Considérations générales
C'est la finale qui compte. Vous pouvez avoir l'algorithme de chasse le plus intelligent de tous les temps, si vous ne repérez pas et ne capturez pas les dernières proies plus rapidement que l'opposition, vous perdez.
Si vos prédateurs ne peuvent attraper une proie seuls (ou au moins deux par deux), vous êtes grillé dès que la densité de leurs proies est suffisamment basse pour que vous puissiez compter soit sur la chance aveugle, soit sur le blocage des proies.
Un prédicteur du mouvement des proies est fondamentalement obligatoire. Je ne peux pas imaginer battre un programme basé sur un prédicteur sans avoir votre propre prédicteur.
Chasse à la queue
Le moyen le plus inefficace d'attraper une proie est de la chasser à sa poursuite. En supposant qu'un seul prédateur poursuive une seule proie et qu'aucune influence externe (murs, autres proies, etc.) ne soit exercé, une poursuite en queue pourrait durer éternellement. Dès que vous entrez dans le rayon de vision de la proie de 30 unités, la proie s'enfuit à la vitesse 6 de votre 6.1, vous gagnez donc une distance d'un tour: en ligne droite, vous avez besoin d'environ 300 tours pour l'obtenir.
En prenant en compte la taille de l'arène, une proie se déplacera au maximum dans la diagonale d'un carré de 500 unités avant de heurter un mur ou un coin, ce qui prendra au plus 117 tours.
La stratégie gagnante consiste évidemment à trouver un moyen de ralentir les proies, notamment en ayant soit un autre prédateur, soit un mur / un coin en face de celui-ci.
Prédicteur
Avec une vitesse de proie de 6, une proie peut se déplacer sur une zone de 36 * pi carrés. Avec un rayon de capture de 1, une estimation à l'aveugle de la prochaine destination de la proie a une chance de réussir de 1/36 * pi (environ 1%). Il est clair que quelque chose doit être fait pour améliorer cela!
En regardant le code du moteur de simulation, vous pouvez voir que les entrées sont:
Bien que toutes les positions soient disponibles, les vitesses précédentes des proies ne le sont pas. Le seul moyen de calculer ces vitesses serait de suivre chaque proie d'un tour à l'autre, ce qui est presque impossible à faire (à moins de mettre en œuvre un algorithme de suivi du mouvement très intelligent). Ainsi, un prédicteur peut facilement reproduire tous les termes du calcul, à l'exception de la contribution de vitesse qu'il faut deviner.
Dans le cas d'une seule proie, la vitesse peut être suivie sans trop de problèmes, ce qui permet de créer un prédicteur "parfait" pour attraper une proie isolée du troupeau. Ce qui est fondamentalement tout ce dont vous avez besoin pour la phase finale, lorsque les proies sont trop peu nombreuses pour interagir les unes avec les autres. Lorsque les proies sont abondantes et que l'effet de troupeau est assez puissant pour tromper le prédicteur, sa densité même de proies compensera les erreurs (si vous n'attrapez pas celle que vous visiez, il est probable que vous obtiendrez l'un de ses meilleurs amis ).
Goading proies
Avec la connaissance exacte du calcul de la vitesse des proies, il est possible de "diriger" une proie donnée vers une direction souhaitée, en ajustant la position du prédateur.
Cela permet de coincer une proie contre un mur ou de la diriger vers un autre membre de la meute. J'ai essayé des stratégies raffinées, comme pincer une proie entre deux membres de la meute. Malheureusement, cela s’est avéré moins efficace que la routine actuelle consistant à «épingler et scanner», car garder deux prédateurs occupés à chasser une seule proie laisse l’opposition trop libérée pour explorer le pâturage.
Voler des proies
L'une des caractéristiques du comportement des proies est que l'influence d'un prédateur augmente proportionnellement à sa distance par rapport à la proie (à condition qu'il reste dans le rayon de vision de la proie). Plus un prédateur s'approche d'une proie, moins la proie s'en éloignera.
Cela signifie que lorsque deux prédateurs se font concurrence pour attraper une proie, le plus proche est obligé de l'attraper en premier. Même un concurrent extrêmement intelligent qui parviendrait à se positionner juste devant l'axe de chasse / proie effrayerait en fait la proie dans la gueule du concurrent.
Pour réussir à voler une proie, il faut au moins deux prédateurs. L'un ira chercher la mise à mort, et l'autre restera juste dans le rayon de vision de la proie, aussi loin que possible de la proie pour maximiser l'influence et guider la proie vers le chasseur.
En outre, chaque changement de direction permettra à la compétition de couper le coin de la proie, et rester derrière le concurrent n'est possible que si le "goader" était suffisamment proche de la proie au début de l'action.
Le vol de proie n'a donc qu'une chance de réussir si les positions initiales des "voleurs" sont favorables et que vous pouvez épargner au moins un deuxième prédateur. D'après mon expérience, cela ne vaut pas la complexité.
Changements suggérés
Pour permettre des stratégies plus complexes, déplacer le prédateur au-dessus de la vitesse de pointe de la proie pourrait avoir un coût en points de famine, proportionnel à l'excès de vitesse. Par exemple, par exemple, passer à la vitesse 6 est gratuit et chaque point de vitesse supérieur à 6 coûte 100 points de faim (aller à 6,3 coûte 30 points de faim par tour, brûler 1000 points de faim permettrait d'atteindre la vitesse 16 pour un tour attraper une proie le faisant!).
Au lieu de donner la mort à un prédateur au hasard lorsque plusieurs sont suffisamment proches pour manger une proie, je suggère de diviser le gain (par exemple, 3 prédateurs obtiendraient 333,33 points de faim chacun). Cela permettrait des stratégies de fin de partie plus intrigantes (par exemple, l'observation d'un prédateur ennemi deviendrait utile si vous pensez avoir plus de points à craindre).
La couleur spéciale pour le premier paquet est plutôt difficile à voir. Je suggère le cyan ou l'orange au lieu du bleu.
la source
Lazy Pack Haskell
Vous aurez besoin de la plate-forme haskell pour exécuter cela. Ensuite, vous utilisez la
runhaskell
commande pour l'exécuter. Ma meute attend que la proie vienne à eux.la source
-silent
option, cependant ...Ce n'est pas une entrée, je suis toujours intéressé à ajouter une couleur personnalisée pour chaque entrée participante dans king-of-the-hill ;)
De plus, le processus alimentaire ne se visualise pas en changeant de couleur, mais en modifiant sa taille afin que nous puissions voir plusieurs événements alimentaires en peu de temps.
Game.java
Predator.java
la source