BS è un gioco di carte in cui l'oggetto del gioco è perdere tutte le tue carte.
Una partita è composta da quattro giocatori e un mazzo da 52 carte. Ogni giocatore riceve 13 carte a caso. Normalmente, le carte sono etichettate 2 - 10, Asso, Jack, Regina, Re, ma per semplicità le carte saranno etichettate con un numero compreso tra 0 e 12 inclusi. Sebbene il numero di carte nella mano di un giocatore sia un'informazione pubblica, solo il giocatore sa quali carte specifiche sono nella sua mano.
Il gioco va come segue: i primi posti giocatore come tante carte etichettati 0 come vuole nella pila degli scarti (nota che non è necessario per giocare tutte le sue carte etichettati 0 , anche se di solito è nel suo migliore interesse a farlo ). Deve giocare almeno una carta. Il secondo giocatore gioca quante carte vuole etichettare 1 , il terzo giocatore gioca 2 e così via. Dopo 12, si reimposta su 0.
Cosa succede se non hai nessuna delle carte che dovresti giocare? Ricorda, devi giocare almeno una carta - infatti, puoi giocare tutte le carte che vuoi! (In realtà, anche se hai la carta giusta, puoi mentire e giocare una carta diversa). Tuttavia, qualcuno può chiamarti e dire "BS!" Se quella persona ha ragione e tu hai mentito, allora devi prendere tutte le carte nella pila degli scarti; come ricompensa, il giocatore che ti ha chiamato mette casualmente una delle sue carte nella pila degli scarti. Se l'accusatore ha torto, tuttavia, deve prendere tutte le carte nella pila degli scarti. Nota che non puoi mentire sul numero di carte che giochi.
Informazioni più dettagliate:
- All'inizio del gioco, vengono scelti quattro giocatori a caso. Dal momento che ci saranno almeno 1000 partite, ogni giocatore avrà la possibilità di giocare. L'ordine dei turni viene deciso casualmente all'inizio del gioco
- Se restituisci una carta corretta e una carta errata, allora si considera mentire (cioè se dovessi dare 2 s, e tu hai dato uno 2 e uno 1 , allora sta mentendo)
- Se due o più giocatori dicono entrambi BS contemporaneamente, ne viene scelto uno a caso.
- Il tuo punteggio è la percentuale di partite che vinci.
- C'è un massimo di 1000 round, in cui un round è ogni giocatore che va una volta. Di solito, qualcuno vince prima di questo. Se nessuno vince, viene conteggiato per il numero totale di partite giocate, ma nessuno vince.
Spec:
Dovresti scrivere una classe che si estende Player
. Sembrerà che:
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";
}
}
Il metodo requestCards
viene chiamato quando è il tuo turno. L'argomento card
è il numero della carta che dovresti fornire. Restituisci un elenco di carte che vuoi mettere nella pila degli scarti. Il giocatore sopra controlla se ha carte del tipo di carta richiesto; in caso contrario, gioca semplicemente la sua prima carta e spera che nessuno controlli.
Il metodo bs
viene chiamato ogni volta che qualcun altro gioca una carta. Il primo argomento è il giocatore, il secondo - la carta che avrebbe dovuto giocare, e il terzo - il numero di quel tipo di carta che afferma di aver giocato. Ritorna true
se vuoi chiamare "BS". Nel codice sopra, il giocatore chiama "BS" solo quando l'altro giocatore afferma di avere 3 o più carte del tipo richiesto.
L'ultimo argomento per entrambi i metodi è controller
, che è solo il controller che controlla il gioco. Dal controller, puoi ottenere più informazioni pubbliche, come il numero di carte nella pila degli scarti o l'elenco e l'ordine di turno dei giocatori.
Il toString
metodo è facoltativo
Conroller su GitHub: https://github.com/prakol16/bs
Se vuoi pubblicare una soluzione non java, puoi utilizzare l'interfaccia fornita in https://github.com/LegionMammal978/bs (crediti per LegionMammal978) e proverò a integrarla.
Quadro di valutazione finora:
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 sta vincendo, ma CalculatingLiar è al secondo posto. Questi punteggi sembrano coerenti - sono sempre gli stessi ogni volta.
Controller.toString()
al pubblico, poiché restituisce le mani di tutti i giocatori e la pila degli scarti.