KOTH asymétrique: Attrapez le chat
MISE À JOUR : Les fichiers gist sont mis à jour (y compris les nouvelles submisisons) car Controller.java n'a pas détecté d'exceptions (seulement des erreurs). Il détecte désormais les erreurs et exceptions et les imprime également.
Ce défi consiste en deux threads, c'est le thread cat, le thread catcher peut être trouvé ici .
Le contrôleur peut être téléchargé ici .
Il s'agit d'un KOTH asymétrique: chaque soumission est soit un chat, soit un receveur . Il y a des jeux entre chaque paire de chacun un chat et un receveur. Les chats et les attrapeurs ont des classements séparés.
Catcher
Il y a un chat sur une grille hexagonale. Votre tâche consiste à l'attraper le plus rapidement possible. À chaque tour, vous pouvez placer un seau d'eau sur une cellule de la grille afin d'empêcher le chat d'y aller. Mais le chat n'est pas (peut-être) aussi stupide, et chaque fois que vous placez un seau, le chat se déplace vers une autre cellule de la grille. La grille étant hexagonale, le chat peut aller dans 6 directions différentes. Votre objectif est d'entourer le chat de seaux d'eau, le plus vite sera le mieux.
Chat
Vous savez que le receveur veut vous attraper en plaçant des seaux d'eau autour de vous. Bien sûr, vous essayez de vous soustraire, mais comme vous êtes un chat paresseux (comme les chats), vous faites exactement un pas à la fois. Cela signifie que vous ne pouvez pas rester au même endroit que vous, mais vous devez vous déplacer vers l'un des six endroits environnants. Chaque fois que vous voyez que le receveur a placé un nouveau seau d'eau, vous allez dans une autre cellule. Bien sûr, vous essayez d'éviter le plus longtemps possible.
la grille
La grille est hexagonale, mais comme nous n'avons pas de structures de données hexagonales, nous prenons un 11 x 11
tableau carré 2d et imitons le `` comportement '' hexagonal que le chat ne peut déplacer que dans 6 directions:
La topologie est toroïdale, ce qui signifie que si vous marchez sur une cellule «à l'extérieur» de la matrice, vous serez simplement transféré vers la cellule correspondante de l'autre côté de la matrice.
Jeu
Le chat commence à une position donnée dans la grille. Le receveur peut effectuer le premier mouvement, puis le chat et son receveur alternent les mouvements jusqu'à ce que le chat soit attrapé. Le nombre de pas est le score de ce match. Le chat essaie d'obtenir un score aussi élevé que possible, le receveur essaie d'obtenir un score aussi bas que possible. La somme moyenne de tous les jeux auxquels vous avez participé sera le score de votre soumission. Il y a deux classements distincts, un pour le chat, un pour les attrapeurs.
Manette
Le contrôleur donné est écrit en Java. En tant que receveur ou chat, vous devez chacun implémenter une classe Java (il existe déjà quelques exemples primitifs) et la placer dans le players
package (et mettre à jour la liste des chats / catchers dans la classe Controller), mais vous pouvez également écrire fonctions supplémentaires au sein de cette classe. Le contrôleur est livré avec chacun deux exemples pratiques de classes simples chats / catcher.
Le champ est un tableau 11 x 11
2D int
qui stocke les valeurs des états actuels des cellules. Si une cellule est vide, elle a de la valeur 0
, s'il y a un chat, elle a de la valeur -1
et s'il y a un seau, il y en a un 1
.
Il y a quelques fonctions données que vous pouvez utiliser: isValidMove()
/ isValidPosition()
sont pour vérifier si votre mouvement (chat) / position (receveur) est valide.
Chaque fois que c'est votre tour, votre fonction takeTurn()
est appelée. L'argument contient une copie de la grille actuelle et des méthodes telles read(i,j)
que la lecture de la cellule (i,j)
, ainsi isValidMove()/ isValidPosition()
que la vérification de la validité de votre réponse. Cela gère également le recouvrement de la topologie toroïdale, ce qui signifie que même si la grille n'est que de 11 x 11, vous pouvez toujours accéder à la cellule (-5,13).
La méthode doit renvoyer un int
tableau de deux éléments, qui représentent des mouvements possibles. Pour les chats, ce sont ceux {-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}
qui représentent la position relative de l'endroit où le chat veut aller, et les capteurs renvoient les coordonnées absolues de l'endroit où ils veulent placer un seau {i,j}
.
Si votre méthode produit un mouvement invalide, votre soumission sera disqualifiée. Le déplacement est considéré comme invalide, si à votre destination est déjà un seau ou le déplacement n'est pas autorisé / destination déjà occupée (comme un chat), ou s'il y a déjà un seau / chat (comme un receveur). Vous pouvez vérifier cela à l'avance avec les fonctions données.
Votre soumission devrait fonctionner assez rapidement. Si votre méthode dure plus de 200 ms pour chaque étape, elle sera également disqualifiée. (De préférence beaucoup moins ...)
Les programmes sont autorisés à stocker des informations entre les étapes.
Soumissions
- Vous pouvez faire autant de soumissions que vous le souhaitez.
- Veuillez ne pas modifier de manière significative les soumissions que vous avez déjà soumises.
- Veuillez chaque soumission dans une nouvelle réponse.
- Chaque soumission doit de préférence avoir son nom unique.
- La soumission doit comprendre le code de votre classe ainsi qu'une description qui nous indique comment fonctionne votre soumission.
- Vous pouvez écrire la ligne
<!-- language: lang-java -->
avant votre code source afin d'obtenir une coloration syntaxique automatique.
Notation
Tous les chats rivaliseront avec tous les attrapeurs le même nombre de fois. J'essaierai de mettre à jour fréquemment les scores actuels, les gagnants seront déterminés lorsque l'activité aura diminué.
Ce défi est inspiré de ce vieux jeu flash
Merci @PhiNotPi pour les tests et les commentaires constructifs.
Scores actuels (100 matchs par paire)
Name Score Rank Author
RandCatcher 191962 8 flawr
StupidFill 212688 9 flawr
Achilles 77214 6 The E
Agamemnon 74896 5 The E
CloseCatcher 54776 4 randomra
ForwordCatcher 93814 7 MegaTom
Dijkstra 47558 2 TheNumberOne
HexCatcher 48644 3 randomra
ChoiceCatcher 43834 1 randomra
RandCat 77490 9 flawr
StupidRightCat 81566 6 flawr
SpiralCat 93384 5 CoolGuy
StraightCat 80930 7 CoolGuy
FreeCat 106294 3 randomra
RabidCat 78616 8 cain
Dijkstra's Cat 115094 1 TheNumberOne
MaxCat 98400 4 Manu
ChoiceCat 113612 2 randomra
main.Controller
, d'appeler getCatchers()
et de simuler / saboter les réponses des attrapeurs via leurs takeTurn
méthodes?