Fondo
El juego de Morra es un juego simple. En la versión "original", varios jugadores tiran simultáneamente un número 0-5 con sus manos mientras adivinan la suma total de las manos de todos. La versión que usaré aquí se ha modificado para aumentar el potencial de una estrategia no trivial, y se describe a continuación:
- Hay dos jugadores
- Como en piedra, papel o tijera, los jugadores se mueven simultáneamente.
- Cada turno, cada jugador elige un número 0-5 y también adivina la elección de sus oponentes de 0-5. Esto significa que se emiten dos números cada turno. Para aclarar, la salida de ambos números debe estar en el rango 0-5, inclusive.
- Si adivina correctamente la elección de su oponente pero su oponente no adivinó correctamente, gana un cierto número de puntos igual a la suma de los dos números jugados. Por ejemplo, si los números jugados fueron 3 y 5, una suposición correcta valdría 8 puntos.
- Si ambos o ninguno de los jugadores adivinan correctamente, no se otorgan puntos.
- La persona con más puntos después de 1000 rondas gana ese juego.
El torneo
El torneo se realizará en un estilo de todos contra todos y se realizará creando cada posible pareja de concursantes. Por cada victoria, el concursante gana 2 puntos de victoria. Cada empate resulta en 1 punto de victoria. No se ganan puntos de victoria por una pérdida.
Intuitivamente, el ganador del torneo será el concursante con más puntos de victoria contra otros.
Cómo entrar
Habrá dos métodos para enviar bots para competir. El primer método, y muy preferido, es implementar una interfaz Java provista por el controlador. El segundo método es escribir un programa independiente.
Cubramos primero el método Java. La interfaz que tendrá que aplicar es Player
y define dos métodos: public String getName()
identifica su bot, y public int[] getMove(String[] args)
toma args
como una matriz de seis cuerdas, mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Un ejemplo es el siguiente:
042 045 0 324 432 6
Esto significa que elegí 0 en la primera ronda y supuse que mi oponente iba a lanzar un 0. Mi oponente lanzó un 3 y supuso que lanzaría un 4. En la tercera ronda, mi oponente hizo la suposición correcta de que lanzaría un 2, lo que significa que gana 2 + 4 = 6 puntos.
Su método devolverá una matriz de dos enteros, que son su elección y suposición, respectivamente. Un ejemplo es {4,2}
para una elección de 4 y una suposición de 2.
Aquí hay un ejemplo de un bot Java completo escrito como método. Si lo desea, su envío solo debe incluir lo que está pasando en el getMove
método.
import java.util.Random;
/**
* A simple example Morra bot to get you started.
*/
public class ExampleBot implements Player
{
public String getName()
{
return "ExampleBot";
}
public int[] getMove(String [] args)
{
//easiest way I know to break down to create a move history
//(just contains their throw history)
char[] theirThrowsC = args[3].toCharArray();
int[] theirThrows = new int[theirThrowsC.length];
for(int i = 0; i < theirThrowsC.length; i++)
{
theirThrows[i] = Integer.parseInt(Character.toString(theirThrowsC[i]));
}
//get my score
int myScore = Integer.parseInt(args[2]);
Random r = new Random();
int guess = r.nextInt(6);
if(theirThrows.length > 0)
{
guess = theirThrows[theirThrows.length-1];
}
//throws a random number, guesses what they threw last
return new int[] {r.nextInt(6),guess};
}
public static int otherMethod(int example) //you can write additional static methods
{
return 0;
}
}
Como un programa independiente
Actualmente estoy limitado en mi soporte de idiomas adicionales. Además de Java, puedo aceptar programas escritos en Python 3.4, Perl 5 o Ruby 2.1.5. Si hay un idioma que varias personas parecen desear, haré todo lo posible para agregarlo.
La entrada a su programa serán argumentos en la línea de comando. Podría verse así:
perl awesomebot.plx 042 045 0 324 432 6
La salida de su programa debe ser su elección seguida de su conjetura, cada uno seguido de espacios en blanco.
Incluya en su respuesta el comando exacto necesario para ejecutarlo. Tenga en cuenta que estoy ejecutando Windows 8.1.
Reglas extra
Ahorro de estado y tiempos de espera
Su programa podrá crear un archivo de texto en el directorio local, donde puede almacenar información. Esta información se mantendrá durante todo el torneo pero se eliminará después. Dale al archivo un nombre que pueda identificar.
Hay un límite de tiempo de 500 milisegundos para que su código responda. No responder en el límite de tiempo (o dar un movimiento no válido) resultará en la pérdida de ese partido en particular. Los envíos de Java actualmente tienen un tiempo de espera pasivo (que puedo actualizar a activo), mientras que los envíos que no son de Java tienen un tiempo de espera activo donde su proceso finaliza después de 500 milisegundos.
Más reglas de presentación
- Se le permiten múltiples envíos, siempre que cumplan con las reglas y no etiqueten al equipo.
- Cada entrada debe ser única. No puedes hacer una copia exacta de la lógica de otro bot en un idioma diferente.
- Los bots no pueden interactuar entre sí (para formar un equipo de cualquier tipo).
- No puede usar la lógica de los otros bots dentro de su bot para, por ejemplo, identificar a su competidor y predecir sus acciones. Por supuesto, puedes tratar de determinar la estrategia de tu oponente.
- No intente meterse con el controlador, otros concursantes o mi computadora. No se conecte a fuentes de información externas.
El controlador
La versión actual del controlador se encuentra aquí . Está escrito en Java 8. El archivo "Torneo" es el controlador principal, que también contiene la lista de competidores (si desea organizar sus propias competiciones).
Tabla de clasificación
Realmente no he podido actualizar la tabla de clasificación con mucha frecuencia. Estoy bastante ocupado este fin de semana. Por "bastante ocupado" quiero decir que no hay acceso a una computadora de 6:30 a.m. a 9:30 p.m. Aquí están los puntajes después de 5 carreras. El bot "Echo" siguió perdiendo por alguna razón (podría ser mi culpa, aún no lo he investigado).
170 - Quinn and Valor
158 - Historian
142 - DeltaMax
140 - MorraCowbell
132 - Extrapolator
115 - Rainbolt
102 - Popularity
100 - Interpolator
83 - CounterBot
80 - Basilisk
76 - Erratica
65 - Trendy
63 - Scholar
62 - RandomGuesser
60 - KingFisher
59 - NullifierBot
55 - EvolvedBot
48 - Confused
Crédito
Muchas gracias a Rainbolt y Peter Taylor por su ayuda con el controlador.