Este es un desafío del rey de la colina para Dots and Boxes (también conocido como Pen the Pig). El juego es simple, en tu turno solo dibuja una línea en una cerca vacía. Cada vez que completas un cuadrado obtienes un punto. Además, dado que estamos jugando según las reglas del campeonato , si completas al menos una casilla en tu turno, obtienes un turno adicional. Este es un torneo round robin, donde cada bot juega entre sí dos veces 12 veces en una cuadrícula de 9x9. Echa un vistazo a este partido entre dos titanes de peso pesado, donde ChainCollector hace carne picada del actual co-campeón Asdf:
Reglas
- Límite de tiempo de 0.5 segundos por movimiento.
- No interferir con otros bots.
- Use PigPen.random () y PigPen.random (int) para aleatoriedad.
- No escribir en archivos.
- Bot y todos sus datos persistentes se restablecerán cada vez que el oponente cambie (cada 12 rondas).
Bots
Cada bot extiende Player.java:
package pigpen;
public abstract class Player {
public abstract int[] pick(Board board, int id, int round);
}
Board
es el tablero de juego, que sirve principalmente para darte acceso a Pen
clases, y id
es tu ID de jugador (te dice si eres el primero o el segundo), round
te dice en qué ronda juegas contra el mismo oponente (1 o 2). El valor de retorno es an int[]
, donde el primer elemento es el penID (1 indexado) y el segundo elemento es el fenceID (0 indexado). Vea Pen.pick(int)
una manera fácil de generar este valor de retorno. Vea la página de Github , por ejemplo, reproductores y JavaDoc. Como solo estamos usando una cuadrícula cuadrada, ignoremos las funciones y campos relacionados con los hexágonos.
Como correr
- Descargar Source de Github.
- Escriba su bot controlador (asegúrese de incluir
package pigpen.players
) y póngalo en lasrc/
carpeta; - Compilar con
javac -cp src/* -d . src/*.java
. Ejecutar conjava pigpen.Tournament 4 9 9 false
(los dos últimos números se pueden cambiar para ajustar el tamaño de la cuadrícula. La última variable solo debe establecerse entrue
si desea utilizar el software pp_record).
Puntuaciones
- ChainCollector: 72
- Asdf: 57
- Lazybones: 51
- Finisher: 36
- = LinearPlayer: 18
- = BackwardPlayer: 18
- RandomPlayer: 0
Ver también:
Nota : este juego es un desafío competitivo y no es fácil de resolver, debido a que les da a los jugadores un turno adicional para completar un cuadro.
¡Gracias a Nathan Merrill y Darrel Hoffman por consultar sobre este desafío!
Actualizaciones :
- Se agregó un
moves(int player)
método a la clase Tablero para obtener una lista de cada movimiento que un jugador ha realizado.
Recompensa indefinida (100 Rep) :
Primera persona en publicar una solución que gana cada ronda, y utiliza la estrategia (ajustar el juego en función de observar cómo juega el oponente).
fuente
Respuestas:
Vago
Este bot es vago. Elige un lugar y una dirección al azar y continúa construyendo en esa dirección sin moverse demasiado. Solo hay 2 casos en los que hace algo diferente:
fuente
pen.n(Pen.LEFT)
(función de vecino).pick()
método ahora tiene unint round
parámetro al final, así que si pudiera agregarlo.ChainCollector
A este bot le gustan las cadenas 1 . Él quiere tanto de ellos como sea posible. A veces incluso sacrifica una pequeña parte de una cadena para ganar una más grande.
[1] Una cadena consiste en plumas conectadas por cercas abiertas, donde cada pluma tiene 1 o 2 cercas abiertas. Si se puede terminar un solo bolígrafo que pertenece a la cadena, entonces, debido a la regla del campeonato, también se puede terminar toda la cadena.
fuente
Acabador
Utiliza un comparador para elegir el bolígrafo con la mayor cantidad de cercas disponibles, pero le da prioridad al bolígrafo con solo 1 cerca disponible. (7 se usa en lugar de 5 para permitir que este código funcione también en modo hexágono)
fuente
Asdf
Asigna un puntaje a cada cerca y luego saca lo mejor de ellos. Por ejemplo: un bolígrafo con una valla abierta tiene una puntuación de 10, mientras que un bolígrafo con 2 vallas abiertas tiene una puntuación de -8.
Parece que Lazybones usa una estrategia similar, porque se vincula con este bot.
fuente
Jugador lineal
La forma más fácil de escribir este bot es en realidad
return null
, porque una entrada no válida seleccionará automáticamente la primera cerca disponible. Este código no utiliza ningún método de acceso directo y genera manualmente el valor de retorno.fuente
BackwardPlayer
Este código utiliza el método de acceso directo
Pen.pick(int)
para generar el valor de retorno. Si la cerca superior no está disponible, elegirá la cerca disponible más cercana en sentido horario.fuente
RandomPlayer
La misma idea que BackwardPlayer, pero selecciona aleatoriamente un lápiz. Tenga en cuenta que los
+1
Pen son indexados en 1.fuente