Dados do Mentiroso é um jogo de dados bastante simples. Eu já vi algumas variações diferentes das regras, mas aqui está a versão com a qual estou mais familiarizado:
- Cada jogador começa com 5d6
- Exceto ao somar os dados no final de uma rodada, cada jogador pode ver seus próprios dados, mas não os de qualquer oponente
- No início de qualquer rodada, todos os jogadores jogam os dados que possuem atualmente
- Então, um jogador (normalmente, este é o vencedor da rodada anterior OU o jogador à esquerda do jogador que iniciou a última vez; usaremos o primeiro para este KotH; com um jogador aleatório iniciando a primeira rodada) faz um palpite sobre quantos números estão em cima da mesa (OS SÃO SELVAGENS)
- Os lances continuam à direita, aumentando cada vez mais (por exemplo; 3 cincos, 3 seis e 4 duplas são todos maiores que 3 quatrocentos, mas 3 três não é; 4 outros também são mais altos, mas a licitação de um provavelmente o coloca em um nível desvantagem); até que um jogador chame o mentiroso que o precede
- Neste ponto, todos os jogadores revelam seus dados e contam o número do último lance de número na mesa.
- Se o total for menor do que o lance, o jogador que fez o lance deve dar um dado ao jogador que os chamou de mentiroso; caso contrário, o jogador que chamou o lance de mentiroso deve dar um dado ao licitante (para que o licitante vença se eles tiverem pelo menos o número que ele havia solicitado, não precisa ser o número exato)
- Quando você fica sem dados, você perde
- O último jogador em pé vence
Por exemplo:
O jogador um tem 1,1,2,4,6 O jogador dois tem 1,2,2,3,5 O jogador três tem 1,3,3,4,6 Jogador um: três seis. Jogador dois: quatro pares. Jogador três: quatro trios. Jogador um: cinco duplas. Jogador dois: seis dois. Jogador três: seis trios. Jogador um: seis e quatro. Jogador dois: Mentiroso! Eles revelam seus dados e contam os (porque são selvagens) e os quatro. Acontece que existem, de fato, exatamente seis quatros. Então, o jogador dois dá ao jogador um um dado. Eles re-rolam e o jogador um começa a próxima rodada.
Você deve escrever um bot para jogar este jogo. Ele deve implementar a seguinte classe java abstrata:
public abstract class Player {
public Player() {}
public String toString() {
return this.getClass().getSimpleName();
}
public abstract String bid(int yourId, int[] diceEachPlayerHas, int[] yourDice, String[] bids);
}
- Você deve implementar o método de lance
- O primeiro argumento é a posição atual do seu bot na ordem do turno, o segundo é uma matriz que mostra quantos dados cada jogador (incluindo você) possui atualmente, o terceiro é uma matriz que mostra os valores atualmente exibidos em seus próprios dados e a quarta é uma matriz de todos os lances feitos desde o início da rodada atual - terá o comprimento 0 se você estiver fazendo o primeiro lance da rodada
- A saída deve ser uma sequência do formato "número da face" ou a sequência "Mentiroso!" chamar o licitante anterior de mentiroso.
- Se sua saída for formatada ilegalmente, você será eliminado.
- Você pode substituir o método toString, mas não é necessário. No entanto, você não pode editá-lo de qualquer maneira que interfira na legibilidade da saída do controlador.
- Você tem permissão para chamar qualquer outro método público do controlador, mas não o método principal.
- Você pode ler e editar apenas arquivos no diretório em execução prefixado com o nome do seu bot
- Você não tem permissão para receber informações de nenhuma outra fonte
- Variáveis de instância são redefinidas no início de cada novo jogo, mas variáveis estáticas não são.
Pontuação
- Um conjunto de 1.000 jogos, com 3-5 jogadores em cada, será simulado cada vez que um bot for adicionado (assim que três ou mais bots forem enviados), pontuados conforme mostrado na fonte do controlador (em qualquer jogo, você receba 1 no início de cada turno, 10 sempre que capturar um dado e 1.000 de bônus se vencer); impor um limite de 5.000 TURNS (não rodadas) a cada jogo.
- Seu bot será pontuado pela pontuação do último conjunto de jogos; mais dez vezes sua pontuação de voto, se não negativo. (É improvável que este último tenha um efeito significativo na pontuação)
A fonte do controlador pode ser encontrada aqui.
Pontuações a partir de 19/06/2015:
Badnomial: 434,924 + 6x10 = 424,984
Nobody: 282,329 + 6x10 = 282,389
StraightShooter: 265,205 + 5x10 = 265,255
MostlyHonestAbe: 158,958 + 4x10 = 158,998
The Pirate: 157,005 + 1x10 = 157,015
Statistician: 144,012 + 2x10 = 144,032
Fidelio: 49,973 + 2x10 = 49,993
Absurd Bot: 6,831
DrHouse: 2,638 + 3x10 = 2,668
popularity-contest
king-of-the-hill
java
SuperJedi224
fonte
fonte
diceEachPlayerHas[yourId]
= seus dados contam ebids[yourId]
é sua primeira oferta (ou nulo se for sua primeira vez). Isso está correto?Respostas:
Ninguém
Tenta adivinhar os dados de outros jogadores. Chama outros bots mentirosos se não souber o que fazer.
Edit: Corrigido um problema em que ninguém faria lances para sempre, nunca chamando de mentiroso.
fonte
Badnomial, o bot que toma más decisões com base em distribuições binomiais: Edit: Corrigido um erro estúpido nos cálculos de probabilidade, agora é responsável pelo próximo Licitante e também pelo anterior.
Ele tenta determinar se deve blefar ou chamar o mentiroso com base nas distribuições binomiais acumuladas estimadas para si e nas chances dos concorrentes anteriores e seguintes de ter os dados necessários presentes.
Basicamente, ele chama Mentiroso se o Licitante anterior é muito provável que seja um Mentiroso ou se sente que tanto ele quanto o Licitante seguinte provavelmente estão mentindo.
fonte
Straight Shooter
Ele joga direto e não blefa. Ele também é ingênuo o suficiente para pensar que outros o fazem, então ele nunca chama mentiroso, a menos que o lance ultrapasse o número total de dados em jogo (menos seus próprios dados que não correspondem ao lance).
Para ser um pouco mais conservador do que o número exato esperado para cada dado, ele não conta sua própria natureza, mas assume que outros têm uma distribuição uniforme. Com os quatro jogadores atuais, ele ou MostlyHonestAbe surgiram primeiro a cada vez, com pontuações bastante próximas.
Estou assumindo que o lance mínimo é
2 2
. Se uma licitação de um dado (ou licitações) for permitida, informe-me para que eu possa fazer essa alteração.fonte
MostlyHonestAbe
Abe faz suposições conservadoras sobre o resto dos oponentes morrerem, e depois permanece honesto até que ele não pense que haja dados suficientes para vencer a oferta atual. Nesse ponto, ele blefa uma vez e depois chama mentiroso na próxima vez.
fonte
Dr. House
Todos mentem!
fonte
Fidelio
Esse bot sabe que apenas seu valor mais recorrente o levará à vitória, então ele permanece com ele. Ele assume que há uma porção dos dados de todos iguais aos dele, se alguém oferecer mais do que essa parte, ele assume que é um mentiroso.
Espero que ele faça um bom trabalho :).
fonte
Estatístico
Você tem 1/3 de chance de ter outro número que não seja ases. Um cara me disse uma vez que não checar seus dados e apenas saber as probabilidades pode fazer você ganhar este jogo. EDIT: O lance estava muito alto. Mas isso não melhora muito a pontuação.
fonte
Bot absurdo
Defende que todos os dados são 6, a menos que não possam. Se o bot não puder fazer isso, significa que esta é uma situação impossível ou quase impossível. Por isso, chama mentiroso. Estou curioso para saber como esse bot será eficaz.
fonte
O pirata
Fiz alguns bots simples ao testar o controlador, e este é o único que é realmente bom.
Provavelmente será melhorado mais tarde.
fonte