C'est un roi du défi de la colline pour Dots and Boxes (alias Pen the Pig). Le jeu est simple, à votre tour, tracez une ligne sur une clôture vide. Chaque fois que vous terminez un carré, vous obtenez un point. De plus, puisque nous jouons selon les règles du championnat , si vous terminez au moins une case à votre tour, vous obtenez un tour supplémentaire. Il s'agit d'un tournoi à la ronde, où chaque bot se joue deux fois 12 fois sur une grille 9x9. Découvrez ce match entre deux titans lourds, où ChainCollector fait de la viande hachée du co-champion en titre Asdf:
Règles
- 0,5 seconde limite de temps par coup.
- Aucune interférence avec d'autres robots.
- Utilisez PigPen.random () et PigPen.random (int) pour l'aléatoire.
- Pas d'écriture dans les fichiers.
- Le bot et toutes ses données persistantes seront réinitialisés à chaque fois que l'adversaire change (tous les 12 tours).
Bots
Chaque bot étend Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
est le plateau de jeu, qui sert principalement à vous donner accès aux Pen
classes, et id
votre ID joueur (vous indique si vous êtes premier ou deuxième), round
vous indique le tour de votre jeu contre le même adversaire (1 ou 2). La valeur de retour est un int[]
, où le premier élément est le penID (indexé 1) et le deuxième élément est le fenceID (indexé 0). Voir Pen.pick(int)
pour un moyen simple de générer cette valeur de retour. Voir la page Github pour les exemples de joueurs et JavaDoc. Puisque nous n'utilisons qu'une grille carrée, ignorez toutes les fonctions et tous les champs liés aux hexagones.
Comment exécuter
- Téléchargez la source depuis Github.
- Écrivez votre robot contrôleur (assurez-vous de l'inclure
package pigpen.players
) et placez-le dans lesrc/
dossier; - Compilez avec
javac -cp src/* -d . src/*.java
. Exécuter avecjava pigpen.Tournament 4 9 9 false
(les deux derniers nombres peuvent être modifiés pour ajuster la taille de la grille. La dernière variable ne doit être définie quetrue
si vous souhaitez utiliser le logiciel pp_record.)
Les scores
- ChainCollector: 72
- Asdf: 57
- Paresseux: 51
- Finisseur: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Voir également:
Remarque : ce jeu est un défi compétitif et difficile à résoudre, car il donne aux joueurs un tour supplémentaire pour compléter une boîte.
Merci à Nathan Merrill et Darrel Hoffman pour avoir consulté ce défi!
Mises à jour :
- Ajout d'une
moves(int player)
méthode à la classe Board pour obtenir une liste de chaque mouvement effectué par un joueur.
Prime indéfinie (100 Rep) :
Première personne à publier une solution qui gagne à chaque tour et utilise la stratégie (ajuster le jeu en fonction de l'observation du jeu de l'adversaire).
la source
Réponses:
Fainéant
Ce bot est paresseux. Il choisit un endroit et une direction aléatoires et continue de construire dans cette direction sans trop bouger. Il n'y a que 2 cas où il fait quelque chose de différent:
la source
pen.n(Pen.LEFT)
(fonction voisine).pick()
méthode a maintenant unint round
paramètre à la fin, donc si vous pouviez ajouter cela.ChainCollector
Ce bot aime les chaînes 1 . Il en veut autant que possible. Parfois, il sacrifie même une petite partie d'une chaîne pour en gagner une plus grande.
[1] Une chaîne se compose de enclos reliés par des clôtures ouvertes, où chaque enclos a 1 ou 2 clôtures ouvertes. Si un seul stylo appartenant à la chaîne peut être terminé, alors en raison de la règle du championnat, toute la chaîne peut également être terminée.
la source
Finisseur
Utilise un comparateur pour choisir le stylo avec les clôtures les plus disponibles, mais donne la priorité aux stylos avec une seule clôture disponible. (7 est utilisé au lieu de 5 pour permettre à ce code de fonctionner également en mode hexagone)
la source
Asdf
Attribue un score à chaque clôture, puis sélectionne le meilleur d'entre eux. Par exemple: un stylo avec une clôture ouverte a un score de 10, tandis qu'un stylo avec 2 clôtures ouvertes a un score de -8.
Il semble que Lazybones utilise une stratégie similaire, car elle est liée à ce bot.
la source
LinearPlayer
La façon la plus simple d'écrire ce bot est en fait
return null
, car une entrée non valide sélectionnera automatiquement la première clôture disponible. Ce code n'utilise aucune méthode de raccourci et génère manuellement la valeur de retour.la source
BackwardPlayer
Ce code utilise la méthode de raccourci
Pen.pick(int)
pour générer la valeur de retour. Si la clôture supérieure n'est pas disponible, elle sélectionnera la clôture disponible la plus proche dans le sens des aiguilles d'une montre.la source
RandomPlayer
Même idée que BackwardPlayer, mais sélectionne au hasard un stylo. Notez le
+1
parce que les stylos sont indexés 1.la source