Este desafío del rey de la colina se basa en el programa de juegos, Weakest Link . Para aquellos que no están familiarizados con el programa, el quid de este desafío es con quién votar :
- Si los otros jugadores son más inteligentes que tú, entonces tienes menos posibilidades de obtener el bote.
- Si los otros jugadores son más tontos que tú, entonces tienes menos bote para conseguir.
Al comienzo de cada ronda, el bote comienza con $ 0. Se forma un grupo de 9 jugadores, y cada jugador recibe una Inteligencia única del 1 al 9.
Al comienzo de cada turno, Pot += Smartness
para cada jugador aún en la ronda. Luego, los jugadores votan sobre el jugador que desean eliminar. El jugador con más votos es eliminado. En caso de empate, se mantiene al jugador más inteligente.
Cuando solo quedan 2 jugadores en la ronda, se enfrentan en una batalla de ingenio. La posibilidad de que el jugador gane es Smartness/(Smartness+OpponentSmartness)
. El jugador ganador recibe el bote completo.
El jugador que ha recibido la mayor cantidad de dinero al final del juego gana.
De entrada y salida
Cada turno, recibirás la lista actual de oponentes. Tendrá acceso a su inteligencia y al historial de votación completo de todos los jugadores para la ronda a través de funciones en la clase Jugador.
Como resultado, debe devolver un número entero único, que represente al jugador por el que desea votar (que representa su inteligencia). Votar por ti mismo está permitido (pero no recomendado).
Las rondas de 9 se repetirán hasta que todos los jugadores hayan jugado al menos 1000 10000 rondas, y todos los jugadores hayan jugado en la misma cantidad de rondas.
Puede encontrar el controlador aquí: https://github.com/nathanmerrill/WeakestLink
Para crear un jugador, debe extender la clase Player y agregar su jugador a la clase PlayerFactory. Su clase debe seguir las siguientes reglas:
La comunicación o interferencia con cualquier otro jugador (incluidos sus otros jugadores del mismo tipo) está estrictamente prohibida.
La reflexión y las variables estáticas (excepto las constantes) no están permitidas.
Si desea utilizar la aleatoriedad, he proporcionado una
getRandom()
función en la clase Player. Úselo, por lo que las simulaciones pueden ser deterministas.
He proporcionado muchas funciones en la clase Player para facilitar el acceso a los datos. Puede encontrarlos en línea en Github . Su jugador será instanciado en cada nueva ronda. Se permiten jugadores "tontos / suicidas" (pero no jugadores con la misma estrategia).
Puntuaciones
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
fuente
src\WeakestLink
solíajavac Game\*.java Players\*.java Main.java
compilar yjava -cp .. WeakestLink.Main
correr.Respuestas:
Francotirador
La idea general es mantenerse cerca de uno de los jugadores estúpidos (es decir, los que tenemos más probabilidades de vencer en el enfrentamiento) para obtener los puntos. Después de eso tratamos de eliminar a los otros jugadores de bajo valor para aumentar el bote. Pero cuando llegamos a los jugadores inteligentes, optamos por eliminar a los más peligrosos en caso de que eliminen a nuestro estúpido jugador . De esa manera, si no tenemos a alguien a quien atacar, deberíamos encontrar a alguien contra quien al menos tengamos una oportunidad. Además, dado que siempre votamos con un jugador mínimo o máximo, espero que seamos bastante efectivos para saludarnos.
fuente
Francotirador Prudente
Francotirador , pero con dos comportamientos de casos especiales. Una es que si quedan tres bots y PrudentSniper es el más inteligente, votará por el bot del medio en lugar del menos inteligente. Esto le permite ganar algunos enfrentamientos más. El otro comportamiento es que si el robot más inteligente lo está disparando (votó por él o el bot análogo la última vez) y el menos inteligente no lo es, votará por el más inteligente en defensa propia.
fuente
El culto
Los jugadores de culto tienen un esquema de votación levemente esotérico mediante el cual intentan identificarse entre sí y votar en grupo, utilizando solo el registro de votación. Dado que cada miembro del culto sabe votar, cualquiera que vote de manera diferente se revela como no miembro y eventualmente es objetivo de eliminación.
El esquema de votación de un vistazo:
El código:
Pensamientos finales:
El culto ahora cambia a votar por los jugadores más peligrosos cuando solo quedan dos o menos miembros del culto para el enfrentamiento. Lo probé varias veces con
cult_cnt>1
ycult_cnt>2
condiciones y el último gana con más frecuencia.Aún así, esto es una precaución y el culto realmente no está diseñado para funcionar como un jugador solitario, por lo que a medida que aumenta el número de nuevos jugadores, el culto aún debería perder con el tiempo.
fuente
unusedPlayers.addAll(allPlayers);
en Game.java se duplique unas nueve veces, para que todos los jugadores puedan ocurrir en una multiplicidad variada (como barajar varias barajas de cartas) ... no, por supuesto, es una solicitud totalmente sesgada, pero Es interesante ver cuán poderosa puede ser la estrategia basada en el equipo si tienen incluso una pequeña posibilidad de ponerse juntos.BridgeBurner
No en un lugar donde pueda probar esto en este momento, y salió como un código realmente feo / tonto, pero debería funcionar.
Este bot solo quiere ser odiado. Se vota por el que ha votado en contra del menos . En caso de empate, elige a quien haya pasado más tiempo sin votar por él. En caso de otro empate, elige al más inteligente de ellos (presumiblemente porque serán el peor enemigo). No votará por sí mismo, porque nadie realmente lo odiará cuando no esté cerca.
fuente
-1
fuera votado. Pero debería ser arreglado ahora.Carro
Sigue a la multitud en la votación, a menos que él sea el objetivo.
Supongo que este solo hará que los francotiradores sean más fuertes al seguirlos, pero también evitará que el culto y los ayudantes de francotiradores sean el objetivo de una manera ligeramente efectiva. También podría ser un escudo de carne para los asesinos de francotiradores o ayudarlos si hay más de ellos. (Necesita probar con las últimas actualizaciones).
Uso de las funciones de Java 8 porque el juego necesita que se ejecute de todos modos.
fuente
VenganzaJugador
Este bot votará por quien haya votado por él la mayoría de las veces, siendo el desempate el jugador más inteligente. La teoría es que un jugador que votó por ti en el pasado probablemente volverá a votar por ti.
fuente
MeanPlayer
No vote ni a los jugadores más estúpidos ni a los más inteligentes, y él lleva una pistola (se escapó de la seguridad)
fuente
AntiExtremista
Este socialista extremo cree que todas las personas deberían ser de igual inteligencia. Intenta matar a aquellos que son mucho más inteligentes o más tontos que él. Considera ambos, pero en general prefiere los tontos. Favorece a las personas tontas al principio e inteligentes al final, pero está ponderado en función de cuán extremas son esas personas.
NOTA: Según Linus, esto votará igual que el francotirador la gran mayoría de las veces (525602: 1228).
fuente
static Sniper S = new Sniper()
ystatic long agrees=0, disagrees=0;
. En tu método de votación agregoS.setSmartness(getSmartness()); int sniper_answer=S.vote(currentOpponents);
que calcula cómo votaría un francotirador en su posición, luego pongo su respuesta en una variable para contar si estuvo de acuerdo o en desacuerdo antes de devolver su respuesta. Una vez que el juego ha terminado, puede imprimir acepta: desacuerdo que era 525602: 1228.Espía
El espía está reservado. No le gusta disparar a las personas más inteligentes. Del mismo modo, no le gusta
meterse conidiotas indefensosquartata. Entonces, le gusta eliminar a los más cercanos a él en inteligencia.Te acaban de apuñalar por la espalda, mes amis . No le importa si gana. Simplemente le gusta el sonido del cuchillo en tu espalda mientras te vota con éxito.
fuente
Math.abs(enemyIntel - selfIntel) < closestIntel
debería serMath.abs(enemyIntel - selfIntel) < Math.abs(closestIntel - selfIntel)
.Jugador mediano
Este jugador intenta ser el más malo (bueno, la mediana) que queda.
Vota para eliminar a los oponentes más inteligentes y tontos (con un ligero sesgo hacia la votación de los más inteligentes), dependiendo de si hay más o menos más inteligentes / tontos que ellos mismos.
marco robado descaradamente de @Linus arriba.
fuente
Cobarde
Simplemente no quiere ser votado, por lo que vota por el oponente más similar al jugador que fue votado en la última ronda para maximizar las posibilidades de estar en el equipo ganador.
No le va particularmente bien en este momento, pero también podría incluirlo en la mezcla.
fuente
Héroe
Vota a los que molestan al débil ... o lo molestan.
fuente
Mover
Bob es el tipo promedio que piensa que es más inteligente de lo que realmente es. No puedo ganar la familia de francotiradores, pero obtengo el top 5 en mis simulaciones la mayor parte del tiempo.
fuente
FixatedPlayer
Elige un objetivo aleatorio, luego vota por ellos hasta que se hayan ido. Sin embargo, no votará por sí mismo.
fuente
Estadística
Esta no es una entrada al concurso. Esta es simplemente una forma de obtener estadísticas útiles de un juego. Estas estadísticas imprimen el porcentaje de probabilidad de que un jugador en particular sea votado en una ronda.
Para hacer esto, agregue las siguientes líneas para
Round.java
que la parte superior del archivo se vea así:Luego modifique el método de votación para que se vea así:
Salida de ejemplo:
fuente
MaxPlayer
Un sabelotodo. Prefiere eliminar a cualquiera con alta inteligencia (que por lo tanto puede desafiar su intelecto sin igual)
fuente
Guardia
Vota a los que molestan al fuerte ... o a los que lo molestan.
fuente
Sanguijuela
Se basa en otros robots para votar a los tipos más inteligentes y tontos ... más o menos.
Está satisfecho con aparecer en algún lugar en el medio y, finalmente, dividir el bote con el ganador (ya que en realidad es un
chicobot realmente decente ).fuente
SniperKiller
Otra respuesta robada descaradamente del código de Linus . Este en matará a todos los francotiradores, no los protegerá. Si sabe que no quedan francotiradores, actuará como un francotirador.
fuente
RandomPlayer
fuente
MinPlayer
Un elitista. Prefiere eliminar a cualquiera con poca inteligencia.
fuente
Francotirador vengativo
Esto comenzó como algo que pensé que era original llamado
StupidBuffering
(un nombre que odié renunciar), y luego terminó siendo solo un PrudentSniper a quien no le importaba si estaba siendo atacado. Esta también parecía ser la única razón por la que no podía vencer a PrudentSniper, por lo que modifiqué un poco las cosas para centrarme en eso.Ahora, esto es básicamente un francotirador, pero si el robot más inteligente o más tonto se dirige a él, apuntará al que tenga más votos en la última ronda. Si ambos obtuvieron el mismo número de votos y ambos lo atacaron, él vuelve al comportamiento normal de francotirador. En mis pruebas, esto realmente supera a PrudentSniper en ocasiones.
fuente
Intermediario
El MiddleMan hace todo lo posible para maximizar las ganancias mientras se mantiene cauteloso de que no está excluido del juego. Se mantiene cerca de los concursantes menores para mejorar sus posibilidades de llegar a la siguiente ronda (y dejar un final fácil). Votará a alguien más inteligente que él solo si hay concursantes más inteligentes que concursantes menores. Cualquiera de los dos grupos, siempre vota por el más bajo del grupo para mantener la olla subiendo.
PD: espero que se compile, no soy un chico de Java.
Tenía este esquema en mente antes de leer las otras entradas. Luego me sorprendió lo cerca que estaba (pero críticamente diferente) de Sniper , así que seguí adelante y lo usé como punto de partida ya que no conozco la sintaxis de Java. Gracias @Linus
fuente
Posición aproximada
Este bot está tratando de disparar aproximadamente en torno a los valores de inteligencia faltantes, suponiendo que el grupo continuará con el mismo patrón, lo que significa que apuntará al mismo tipo de objetivo. Siempre vota por el más inteligente de los dos jugadores cuando hay una opción.
Hace mucho tiempo que no uso Java, y actualmente estoy en el trabajo, así que ... No puedo probarlo, espero que no sea demasiado defectuoso, sé amable, por favor :).
Por cierto, usa awt.Point solo porque soy demasiado vago para implementar una tupla n_n.
fuente
emptyPosition[emptyPosition.length]=j;
siempre te dará una matriz fuera de los límites. Finalmente, no estoy seguro de por qué, pero votará a los jugadores que no están en la ronda.emptyPosition[emptyPosition.length]
, es un error tonto ya que la longitud es siempre una sobre el último índice ^^. Gracias por los cambios, usaré esta nueva versión para corregirlo. Sobre el bloque ternario ... sí, tenía ganas de usarlo, y tal vez demasiado acostumbrado a escribir por mí mismo, no fue útil para leer, supongo. Haciendo las correcciones y actualizándolo.SniperAide
Antes de la adición de PrudentSniper , escribí un bot para ayudar a Sniper a vencer a AntiExtremist y otros fraudes (uso la palabra con amor). El bot, SniperAide, busca jugadores que voten como francotiradores y vota como cree que lo harían cuando hay consensos. Si todos los jugadores parecen francotiradores, vota por el máximo, protegiendo a los francotiradores inferiores (que también cambiarían al máximo en este punto), incluso si es él mismo.
El código :
Actualmente no es de mucha ayuda contra PrudentSniper.
fuente
HighOrLowNotSelf
Elimina aleatoriamente el jugador de inteligencia más bajo o más alto (pero no uno mismo).
fuente
long
, noint
. En segundo lugar,ops
no te contengas. (Si quisieras votar por ti mismo, deberías incluirlo explícitamente). Finalmente, el if / else que incluiste no es Java válido. ArregléAnarquista
Al anarquista no le gustan los regímenes.
El anarquista intentará matar al actual presidente.
Si el anarquista es presidente, decide abusar de su poder y matar a los inútiles. A menos que fuera el objetivo de uno de sus inferiores, ya que deberían quemarse.
fuente
Votante independiente
¡Este bot sabe que la población general siempre está equivocada! Por lo tanto, vota por quien obtenga la menor cantidad de votos.
El código es casi idéntico al "Bandwagon" de SolarAaron, pero la lógica final es invertida.
fuente