BS es un juego de cartas donde el objetivo del juego es perder todas tus cartas.
Un juego consta de cuatro jugadores y un mazo de 52 cartas. Cada jugador recibe 13 cartas al azar. Normalmente, las tarjetas se etiquetan 2 - 10, As, Jack, Queen, King, pero por simplicidad, las tarjetas se etiquetarán con un número del 0 al 12 inclusive. Aunque el número de cartas en la mano de un jugador es información pública, solo el jugador sabe qué cartas específicas hay en su mano.
El juego es el siguiente: el primer jugador coloca tantas cartas etiquetadas con 0 como quiera en la pila de descarte (tenga en cuenta que no está obligado a jugar todas sus cartas etiquetadas con 0 , aunque generalmente le conviene hacerlo) ) Debe jugar al menos una carta. El segundo jugador juega tantas cartas como quiera etiquetadas como 1 , el tercer jugador juega 2 , y así sucesivamente. Después de 12, se restablece a 0.
¿Qué sucede si no tienes ninguna de las cartas que se supone que juegas? Recuerda, debes jugar al menos una carta; de hecho, ¡puedes jugar las cartas que quieras! (En realidad, incluso si tienes la carta correcta, puedes mentir y jugar una carta diferente). Sin embargo, alguien puede llamarte y decirte "¡BS!" Si ese alguien está en lo correcto y usted mintió, entonces debe tomar todas las cartas en la pila de descarte; Como recompensa, el jugador que te llamó al azar coloca una de sus cartas en la pila de descarte. Sin embargo, si el acusador está equivocado, debe tomar todas las cartas en la pila de descarte. Tenga en cuenta que no puede mentir sobre la cantidad de cartas que juega.
Información más detallada:
- Al comienzo del juego, se eligen cuatro jugadores aleatorios para jugar. Como habrá al menos 1000 juegos, cada jugador tendrá la oportunidad de jugar. El orden de turno se decide al azar al comienzo del juego.
- Si devuelve una tarjeta correcta y una tarjeta incorrecta, entonces se considera mentirosa (es decir, si se suponía que debía dar 2 s, y dio una 2 y una 1 , entonces eso es mentira)
- Si dos o más jugadores dicen BS al mismo tiempo, se elige uno al azar.
- Tu puntaje es el porcentaje de juegos que ganas.
- Hay un máximo de 1000 rondas, donde una ronda es cada jugador que va una vez. Por lo general, alguien gana antes de esto. Si nadie gana, se cuenta para el número total de juegos jugados, pero nadie gana.
Especulación:
Deberías escribir una clase que se extienda Player
. Se verá así:
package players;
import java.util.ArrayList;
import java.util.List;
import controller.*;
public class Player1 extends Player {
@Override
protected List<Card> requestCards(int card, Controller controller) {
Card[] hand = getHand();
List<Card> ret = new ArrayList<Card>();
for (Card c : hand) {
if (c.getNumber() == card) {
ret.add(c);
}
}
if (ret.size() == 0) ret.add(hand[0]);
return ret;
}
@Override
protected boolean bs(Player player, int card, int numberOfCards, Controller controller) {
return numberOfCards >= 3;
}
protected void update(Controller controller) {
// This method gets called once at the end of every round
}
protected void initialize(Controller controller) {
// This method gets called once at the beginning once all the cards are dealt
}
public String toString() {
return "Player 1";
}
}
El método requestCards
se llama cuando es tu turno. El argumento card
es el número de tarjeta que se supone que debe proporcionar. Devuelve una lista de cartas que desea poner en la pila de descarte. El jugador de arriba verifica si tiene alguna carta del tipo de carta solicitada; si no, simplemente juega su primera carta y espera que nadie la controle.
Se bs
llama al método cada vez que alguien más juega una carta. El primer argumento es el jugador, el segundo, la carta que se suponía que debía jugar, y el tercero, el número de ese tipo de carta que dice haber jugado. Regrese true
si desea llamar "BS". En el código anterior, el jugador solo llama "BS" cuando el otro jugador afirma tener 3 o más cartas del tipo solicitado.
El último argumento para ambos métodos es controller
, que es solo el controlador que controla el juego. Desde el controlador, puede obtener más información pública, como el número de cartas en la pila de descartes o la lista y el orden de turnos de los jugadores.
El toString
método es opcional.
Conroller en GitHub: https://github.com/prakol16/bs
Si desea publicar una solución que no sea Java, puede usar la interfaz provista en https://github.com/LegionMammal978/bs (créditos para LegionMammal978) e intentaré integrarla.
Marcador hasta ahora:
class players.PlayerConMan: 2660/4446 = 59.82905982905983%
class players.CalculatingLiar: 2525/4426 = 57.049254405784005%
class players.PlayerTruthy: 1653/4497 = 36.75783855903936%
class players.Player4: 1446/4425 = 32.67796610169491%
class players.Player1: 536/4382 = 12.23185759926974%
class players.Player3: 493/4425 = 11.141242937853107%
class players.Player2: 370/4451 = 8.312738710402156%
class players.LiePlayer: 317/4432 = 7.152527075812275%
class players.Hoarder: 0/4516 = 0.0%
PlayerConMan está ganando, pero CalculatingLiar está en un segundo lugar. Estos puntajes parecen consistentes: son bastante iguales siempre.
fuente
Controller.toString()
al público, ya que devuelve las manos de todos los jugadores y la pila de descarte.Respuestas:
Estafador
ConMan observa cada carta que pasa por su mano, llamando a BS cuando no es posible una jugada debido a dónde están las cartas.
Juega la verdad cuando puede, pero miente de manera inteligente usando la última carta si se produjera una victoria
Pasé mucho tiempo ajustando una técnica para llamar a BS cuando la probabilidad era alta de que el oponente estuviera mintiendo, o cuando llamar a BS era beneficioso (como obtener cartas útiles de la pila de descarte), pero en la práctica, no llamar a BS en absoluto Yo la mayoría de los puntos.
fuente
Jugador 3131961357_10
Elige a un jugador aleatorio en cada juego y siempre llama a BS en ese jugador.
fuente
Verdad
No del todo terminado, ya que no sé cómo decir el resultado de llamar a BS (si tomaron la pila, o alguien más en caso de empate, o lo hice).
Por el momento, solo llame a BS si puedo probarlo. No mientas a menos que tenga que hacerlo. Necesito mejorar el algoritmo de mentira. Estoy tratando de acercarme lo más posible a la forma en que juego BS contra otros jugadores (menos poner al azar cartas adicionales debajo para jugar 5 o 6 sin que ellos lo sepan).
fuente
cards = cards.get(0)
.cards
es una lista, por lo que no puede asignar unCard
a aList<Card>
. ¿Estás tratando de eliminar todo excepto el primer elemento?numberOfCards
porque ya se descartan cuandobs
se llama)Mentiroso
Este intenta jugar a la verdad. Si miente, usa una carta que no usará en el futuro cercano. También trata de ganar a través de BS llamando a otros jugadores, ya que la última carta casi nunca encaja.
fuente
Acaparador
Estrategia muy simple, recoge cartas hasta que pueda ir en una racha de honestidad y ganar. No pude probarlo, espero que mi Java no esté demasiado oxidado.
fuente
remainingCards.remove(card)
debe tener una conversión aInteger
, de lo contrario, Java cree que está llamando.remove(int)
, que se elimina por índice.LiePlayer
Establece al menos 2 cartas, incluso si eso significa estirar la verdad.
fuente
Card[] hand = getHand();
se necesita en la parte superior debs(..)
(Player.hand
es privado). Además, esto se bloquea si tienes menos de 2 cartas en tu mano.i<cards.length
; la mano no está definida enCard c : hand
. Y a veces entra en un bucle infinito porque no lo haces++i
en el bucle. Añadiría estos, pero no estoy seguro de que los quiera exactamente así.