fundo
O jogo de Morra é um jogo simples. Na versão "original", vários jogadores jogam simultaneamente um número 0-5 com as mãos, enquanto adivinha a soma total das mãos de todos. A versão que vou usar aqui foi modificada para aumentar o potencial de estratégia não trivial e está descrita abaixo:
- Existem dois jogadores.
- Como na pedra-papel-tesoura, os jogadores se movem simultaneamente.
- A cada turno, cada jogador escolhe um número de 0-5 e também adivinha a escolha de 0-5 de seus oponentes. Isso significa que dois números são emitidos a cada turno. Para esclarecer, a saída de ambos os números deve estar no intervalo de 0 a 5, inclusive.
- Se você adivinhar a escolha do seu oponente corretamente, mas seu oponente não adivinhou corretamente, você ganha um certo número de pontos igual à soma dos dois números jogados. Por exemplo, se os números jogados fossem 3 e 5, um palpite correto valeria 8 pontos.
- Se ambos ou nenhum dos jogadores acertarem, nenhum ponto será concedido.
- A pessoa com mais pontos após 1000 rodadas vence o jogo.
O torneio
O torneio será realizado no estilo round-robin e será realizado com a criação de cada possível par de participantes. Para cada vitória, o competidor ganha 2 pontos de vitória. Cada empate resulta em 1 ponto de vitória. Nenhum ponto de vitória é ganho por uma perda.
Intuitivamente, o vencedor do torneio será o competidor com mais pontos de vitória contra os outros.
Como entrar
Haverá dois métodos para enviar bots para competir. O primeiro, e muito preferido método, é implementar uma interface Java fornecida pelo controlador. O segundo método é escrever um programa independente.
Vamos abordar o método Java primeiro. A interface que você precisará implementar é Player
e define dois métodos: public String getName()
identifica seu bot e public int[] getMove(String[] args)
usa args
como uma matriz de seis strings mychoices myguesses myscore opponentchoices opponentguesses opponentscore
. Um exemplo é o seguinte:
042 045 0 324 432 6
Isso significa que eu escolhi 0 no primeiro turno e adivinhei que meu oponente jogaria um 0. Meu oponente jogou um 3 e adivinhou que eu jogaria um 4. Na terceira rodada, meu oponente fez o palpite correto de que eu jogaria a 2, o que significa que ele ganha 2 + 4 = 6 pontos.
Seu método retornará uma matriz de dois números inteiros, que são sua escolha e suposição, respectivamente. Um exemplo é {4,2}
para uma escolha de 4 e um palpite de 2.
Aqui está um exemplo de um bot Java completo escrito como um método. Se você quiser, seu envio deve incluir apenas o que está acontecendo no 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 um programa independente
Atualmente, estou limitado no meu suporte a idiomas adicionais. Além do Java, posso aceitar programas escritos em Python 3.4, Perl 5 ou Ruby 2.1.5. Se houver um idioma que várias pessoas parecem querer, farei o possível para adicioná-lo.
A entrada para o seu programa serão argumentos na linha de comando. Pode ficar assim:
perl awesomebot.plx 042 045 0 324 432 6
A saída do seu programa deve ser a sua escolha, seguida pelo seu palpite, cada um seguido pelo espaço em branco.
Inclua na sua resposta o comando exato necessário para executá-lo. Lembre-se de que estou executando o Windows 8.1.
Regras Extra
Salvando estado e tempos limite
Seu programa poderá criar um arquivo de texto no diretório local, onde você pode armazenar informações. Esta informação será mantida durante todo o torneio, mas excluída posteriormente. Dê ao arquivo um nome que eu possa identificar.
Há um limite de tempo de 500 milissegundos para o seu código responder. A falta de resposta no prazo (ou a movimentação inválida) resultará na perda dessa partida em particular. Os envios de Java atualmente têm um tempo limite passivo (que eu posso atualizar para ativo), enquanto os envios que não são de Java têm um tempo limite ativo em que seu processo é encerrado após 500 milissegundos.
Mais regras de envio
- Você pode enviar vários envios, desde que respeitem as regras e não participem da equipe de tags.
- Cada entrada deve ser exclusiva. Você não pode fazer uma cópia exata da lógica de outro bot em um idioma diferente.
- Os bots não podem interagir entre si (para formar uma equipe de qualquer tipo).
- Você não pode usar a lógica dos outros bots dentro do seu bot para, por exemplo, identificar seu concorrente e prever suas ações. Você pode, é claro, tentar determinar a estratégia do seu oponente.
- Não tente mexer com o controlador, outros concorrentes ou meu computador. Não conecte a fontes de informação externas.
O controlador
A versão atual do controlador é encontrada aqui . Está escrito em Java 8. O arquivo "Tournament" é o controlador principal, que também contém a lista de concorrentes (se você deseja hospedar suas próprias competições).
Entre os melhores
Não tenho conseguido atualizar a tabela de classificação com muita frequência. Estou bastante ocupado neste fim de semana. Por "bastante ocupado", quero dizer que não há acesso a um computador das 6:30 às 21:30. Aqui estão as pontuações após 5 corridas. O bot "Echo" continuou perdendo por algum motivo (pode ser minha culpa, ainda não investiguei).
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
Muito obrigado a Rainbolt e Peter Taylor por sua ajuda com o controlador.