Este desafio do rei da colina é baseado no game show, Weakest Link . Para aqueles que não estão familiarizados com o programa, o cerne desse desafio lida com quem você vota :
- Se os outros jogadores são mais espertos que você, você tem menos chances de ganhar o pote.
- Se os outros jogadores são mais burros que você, você tem menos pote para ganhar.
No início de cada rodada, o pote começa com $ 0. Um grupo de 9 jogadores é formado e cada jogador recebe uma Inteligência única de 1 a 9.
No início de cada turno, Pot += Smartness
para cada jogador ainda na rodada. Em seguida, os jogadores votam no jogador que desejam remover. O jogador com mais votos é removido. Em caso de empate, o jogador mais esperto é mantido.
Quando restam apenas 2 jogadores na rodada, eles se enfrentam em uma batalha de inteligência. A chance do jogador vencer é Smartness/(Smartness+OpponentSmartness)
. O jogador vencedor recebe o pote inteiro.
O jogador que recebeu mais dinheiro no final do jogo vence.
Entrada / Saída
A cada turno, você receberá a lista atual de oponentes. Você terá acesso à sua inteligência e a todo o histórico de votação de todos os jogadores da rodada por meio de funções na classe Player.
Como saída, você deve retornar um único número inteiro, representando o jogador no qual deseja votar (representando sua inteligência). Votar em si mesmo é permitido (mas não recomendado).
As rodadas de 9 serão repetidas até que todos os jogadores tenham jogado pelo menos 1000 10000 rodadas, e todos os jogadores tenham jogado no mesmo número de rodadas.
Você pode encontrar o controlador aqui: https://github.com/nathanmerrill/WeakestLink
Para criar um jogador, você precisa estender a classe Player e adicioná-lo à classe PlayerFactory. Sua turma deve seguir as seguintes regras:
É estritamente proibida a comunicação ou interferência com qualquer outro jogador (incluindo outros jogadores do mesmo tipo).
Variáveis de reflexão e estáticas (exceto constantes) não são permitidas.
Se você deseja usar a aleatoriedade, forneci uma
getRandom()
função na classe Player. Use-o para que as simulações possam ser determinísticas.
Eu forneci muitas funções na classe Player para facilitar o acesso aos dados. Você pode encontrá-los online no Github . Seu jogador será instanciado a cada nova rodada. Jogadores "burros / suicidas" são permitidos (mas não jogadores com a mesma estratégia).
Pontuações
377195 WeakestLink.Players.PrudentSniper
362413 WeakestLink.Players.Sniper
353082 WeakestLink.Players.VengefulSniper
347574 WeakestLink.Players.AntiExtremist
298006 WeakestLink.Players.BobPlayer
273867 WeakestLink.Players.MedianPlayer
247881 WeakestLink.Players.TheCult
240425 WeakestLink.Players.Leech
235480 WeakestLink.Players.SniperAide
223128 WeakestLink.Players.Guard
220760 WeakestLink.Players.Anarchist
216839 WeakestLink.Players.RevengePlayer
215099 WeakestLink.Players.IndependentVoter
213883 WeakestLink.Players.SniperKiller
210653 WeakestLink.Players.MaxPlayer
210262 WeakestLink.Players.Bandwagon
209956 WeakestLink.Players.MeanPlayer
208799 WeakestLink.Players.Coward
207686 WeakestLink.Players.Spy
204335 WeakestLink.Players.Hero
203957 WeakestLink.Players.MiddleMan
198535 WeakestLink.Players.MinPlayer
197589 WeakestLink.Players.FixatedPlayer
197478 WeakestLink.Players.HighOrLowNotSelf
181484 WeakestLink.Players.RandomPlayer
165160 WeakestLink.Players.BridgeBurner
fonte
src\WeakestLink
eu costumavajavac Game\*.java Players\*.java Main.java
compilar ejava -cp .. WeakestLink.Main
executar.Respostas:
Franco atirador
A idéia geral é manter um dos jogadores estúpidos (ou seja, aqueles com maior probabilidade de derrotar no confronto) para roubar os pontos. Depois disso, tentamos remover os outros jogadores de baixo valor para aumentar o pote. Mas quando chegamos aos jogadores inteligentes, optamos por remover os mais perigosos, caso nosso jogador estúpido seja removido. Dessa forma, se não temos alguém para furtar, devemos arranjar alguém com quem pelo menos tenhamos uma chance. Além disso, como sempre votamos com um jogador mínimo ou máximo, espero que sejamos razoavelmente eficazes em conseguir o que queremos.
fonte
PrudentSniper
Atirador de elite , mas com dois comportamentos de casos especiais. Uma é que, se restarem três bots, e o PrudentSniper for o mais inteligente, ele votará no bot do meio em vez do menos inteligente. Isso permite ganhar mais alguns confrontos. O outro comportamento é que, se o bot mais inteligente está buscando por ele (votou nele ou no bot análogo da última vez) e o menos inteligente, não votará no mais inteligente em defesa pessoal.
fonte
O culto
Os jogadores de culto têm um esquema de votação levemente esotérico, pelo qual tentam se identificar e votar como um grupo, usando apenas o registro de votação. Como cada membro do culto sabe votar, qualquer pessoa que vote de forma diferente é revelada como não-membro e, por fim, alvo de eliminação.
Resumo do esquema de votação:
O código:
Pensamentos finais:
O culto agora passa a votar nos jogadores mais perigosos quando há apenas dois ou menos membros do culto restantes no confronto. Eu testei várias vezes com
cult_cnt>1
ecult_cnt>2
condições e as vitórias posteriores com mais freqüência.Ainda assim, isso é uma precaução e o culto realmente não foi projetado para funcionar como um jogador solitário, portanto, à medida que o número de novos jogadores aumenta, o culto ainda deve perder eventualmente.
fonte
unusedPlayers.addAll(allPlayers);
no Game.java fosse duplicado cerca de nove vezes, para que todos os jogadores pudessem ocorrer em multiplicidade variada (como embaralhar vários baralhos) ... não, é claro, é uma solicitação totalmente tendenciosa, mas é interessante ver o quão poderosa a estratégia baseada em equipe ainda pode ser se eles tiverem uma pequena chance de ficarem juntos.BridgeBurner
Não é um lugar onde eu possa testar isso agora, e isso saiu como um código realmente feio / idiota, mas deve funcionar.
Este bot só quer ser odiado. Ele vota em quem menos votou contra . Em caso de empate, ele escolhe quem ficou mais tempo sem votar a favor. No caso de outro empate, ele escolhe o mais inteligente (provavelmente porque eles serão o pior inimigo). Ele não vai votar em si mesmo, porque ninguém realmente odeia quando não está por perto.
fonte
-1
votação do jogador . Mas deve ser corrigido agora.Bandwagon
Segue a multidão na votação, a menos que ele seja o alvo.
Suponho que este apenas tornará os franco-atiradores mais fortes, seguindo-os, mas também evita ser alvo dos cultos e auxiliares de franco-atirador de uma maneira ligeiramente eficaz. Também pode ser um campo de manufatura para assassinos de atiradores de elite ou ajudá-los se houver mais deles. (Precisa testar com as atualizações mais recentes).
Usando os recursos do java 8, porque o jogo precisa ser executado de qualquer maneira.
fonte
RevengePlayer
Este bot votará em quem votou nele mais vezes, sendo o desempate o jogador mais inteligente. A teoria é que um jogador que votou em você no passado provavelmente votará em você novamente.
fonte
MeanPlayer
Não vote nem nos jogadores mais estúpidos nem nos mais inteligentes, e ele está carregando uma arma (passou pela segurança)
fonte
AntiExtremist
Esse socialista extremo acredita que todas as pessoas devem ter igual inteligência. Ele tenta matar aqueles que são muito mais espertos ou mais burros do que ele. Ele considera os dois, mas prefere o burro em geral. Ele prefere pessoas burras no começo e inteligentes no final, mas é ponderado com base no quão extremas são essas pessoas.
NOTA: De acordo com Linus, ele votará da mesma forma que o atirador de elite na grande maioria das vezes (525602: 1228).
fonte
static Sniper S = new Sniper()
estatic long agrees=0, disagrees=0;
. No seu método de votação, acrescentoS.setSmartness(getSmartness()); int sniper_answer=S.vote(currentOpponents);
que calcula como um atirador votaria em sua posição e, em seguida, coloque sua resposta em uma variável para contar se concordou ou discordou antes de retornar sua resposta. Quando o jogo terminar, você pode imprimir concorda: desagregar, que era 525602: 1228.Espião
O espião é reservado. Ele não gosta de atirar nas pessoas mais inteligentes. Da mesma forma, ele não gosta de pegar idiotas indefesos do
quartata. Então, ele gosta de eliminar as pessoas mais próximas a ele em inteligência.Você acabou de ser apunhalado, mes amis . Ele não se importa se ele ganha. Ele gosta do som da faca nas suas costas enquanto ele vota com sucesso.
fonte
Math.abs(enemyIntel - selfIntel) < closestIntel
deveria serMath.abs(enemyIntel - selfIntel) < Math.abs(closestIntel - selfIntel)
.MedianPlayer
Este jogador tenta ser o pior (bem, mediano) que resta.
Ele vota para eliminar os oponentes mais inteligentes e burros (com um leve viés para votar nos mais inteligentes), dependendo se há mais ou menos mais esperto / mais burro do que eles.
estrutura flagrantemente roubada do @Linus acima.
fonte
Covarde
Como não quer ser eliminado, os votos para o oponente mais parecido com o jogador que foi eliminado na última rodada, a fim de maximizar a chance de estar no time vencedor.
Não está indo muito bem agora, mas pode muito bem misturá-lo.
fonte
Herói
Vota nos que apanham os fracos ... ou o irritam.
fonte
Prumo
Bob é apenas o cara comum que pensa que é mais esperto do que realmente é. Não é possível vencer a família de atiradores, mas obter o top 5 nas minhas simulações na maioria das vezes.
fonte
FixatedPlayer
Escolhe um alvo aleatório e depois vota neles até que eles desapareçam. Mas não vai votar em si mesmo.
fonte
Estatisticas
Esta não é uma entrada para o concurso. Esta é apenas uma maneira de obter estatísticas úteis de um jogo. Essas estatísticas mostram a probabilidade percentual de um determinado jogador ser eliminado em uma rodada.
Para fazer isso, adicione as seguintes linhas para
Round.java
que a parte superior do arquivo fique assim:Em seguida, modifique o método de votação para ficar assim:
Saída de exemplo:
fonte
MaxPlayer
Um sabe-tudo. Prefere remover qualquer pessoa com alta inteligência (que pode, portanto, desafiar seu intelecto incomparável)
fonte
Guarda
Votos para aqueles que atacam os fortes ... ou para aqueles que o irritam.
fonte
Sanguessuga
Confia em outros bots para votar nos caras mais inteligentes e idiotas ... mais ou menos.
Ele está satisfeito em aparecer em algum lugar no meio e, eventualmente, dividir o pote com o vencedor (já que ele é um
caramuito decente ).fonte
SniperKiller
Outra resposta descaradamente roubada do código de Linus . Este aqui matará todos os atiradores, não os protegerá. Se souber que não há atiradores, ele atuará como um atirador de elite.
fonte
RandomPlayer
fonte
MinPlayer
Um elitista. Prefere remover alguém com pouca inteligência.
fonte
VengefulSniper
Isso começou como algo que eu pensava ser chamado original
StupidBuffering
(um nome que eu odiava desistir) e acabou sendo apenas um PrudentSniper que não se importava se ele estava sendo alvo. Este também parecia ser o único motivo pelo qual ele não podia vencer o PrudentSniper, então eu mudei um pouco as coisas para fazer desse seu foco.Agora, isso é basicamente um atirador de elite, mas se o bot mais inteligente ou mais idiota mirar nele, ele mirará o que tiver mais votos na última rodada. Se ambos obtiveram o mesmo número de votos e o atacaram, ele volta ao comportamento normal de atirador de elite. Nos meus testes, isso supera o PrudentSniper de vez em quando.
fonte
Intermediário
O MiddleMan tenta o seu melhor para maximizar os lucros, mantendo um olhar cauteloso para que ele não seja cortado do jogo. Ele mantém competidores menores para melhorar sua chance de chegar à próxima rodada (e deixar um final fácil). Ele votará em alguém mais inteligente do que ele somente se houver mais concorrentes mais inteligentes do que concorrentes menores. Qualquer que seja o grupo, ele sempre vota no mais baixo do grupo para manter o pote subindo.
PS espero que compile, eu não sou um cara de Java.
Teve esse esquema em mente antes de ler as outras entradas. Então fiquei surpreso com a proximidade (mas criticamente diferente) do Sniper, então fui em frente e o usei como um ponto de partida, pois não conheço a sintaxe Java. Obrigado @Linus
fonte
ApproximatePosition
Esse bot está tentando disparar aproximadamente em torno dos valores de inteligência ausentes, assumindo que o grupo continue com o mesmo padrão, o que significa que terá como alvo o mesmo tipo de alvo. Ele sempre vota no mais inteligente dos dois jogadores quando há uma escolha.
Faz tempo que não uso Java, e atualmente estou trabalhando ... Não posso testá-lo, espero que não seja muito complicado, seja gentil, por favor :).
A propósito, ele usa o awt.Point apenas porque tenho preguiça de implementar uma tupla n_n.
fonte
emptyPosition[emptyPosition.length]=j;
sempre fornecerá uma matriz fora dos limites. Finalmente, não sei por que, mas você votará nos jogadores que não estão na rodada.emptyPosition[emptyPosition.length]
isso, é um erro estúpido, pois o comprimento é sempre um sobre o último índice ^^. Obrigado pelas alterações, vou usar esta nova versão para corrigi-la. Sobre o bloco ternário ... sim, senti vontade de usá-lo, e talvez muito acostumado a escrever para mim, não foi útil para ler, eu acho. Fazendo as correções e atualizando-o.SniperAide
Antes da adição do PrudentSniper , escrevi um bot para ajudar o Sniper a vencer o AntiExtremist e outras fraudes (eu uso a palavra com amor). O bot, SniperAide, procura jogadores que votam como franco-atiradores e votam como eles pensariam quando há um consenso. Se todos os jogadores parecem atiradores de elite, ele vota no máximo, protegendo atiradores mais baixos (que também mudariam para o máximo neste momento), mesmo que seja ele próprio.
O Código :
Atualmente, ele não é de grande ajuda contra o PrudentSniper.
fonte
HighOrLowNotSelf
Remove aleatoriamente o jogador de inteligência mais baixo ou mais alto (mas não o próprio).
fonte
long
, nãoint
. Em segundo lugar,ops
não se contém. (Se você quiser votar em si mesmo, precisará explicitamente incluí-lo). Finalmente, o if / else que você incluiu não é Java válido. Eu fixo o seu código, e acrescentou que para o GitHubAnarquista
O anarquista não gosta de regimes.
O anarquista tentará matar o atual presidente.
Se o anarquista é presidente, ele decide abusar de seu poder e matar camponeses inúteis. A menos que ele fosse alvejado por um de seus inferiores, pois eles deveriam queimar.
fonte
IndependentVoter
Este bot sabe que a população em geral está sempre errada! Por isso, vota em quem recebe menos votos.
O código é quase idêntico ao "Bandwagon" da SolarAaron, mas a lógica final é invertida.
fonte