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.
Controller.toString()
al público, ya que devuelve las manos de todos los jugadores y la pila de descarte.