BS é um jogo de cartas em que o objetivo do jogo é perder todas as suas cartas.
Um jogo consiste em quatro jogadores e um baralho de 52 cartas. Cada jogador recebe aleatoriamente 13 cartas. Normalmente, os cartões são rotulados de 2 a 10, Ás, Valete, Rainha, Rei, mas, para simplificar, os cartões serão rotulados com um número de 0 a 12, inclusive. Embora o número de cartas na mão de um jogador seja uma informação pública, somente o jogador sabe quais cartas específicas estão em sua mão.
O jogo é o seguinte: o primeiro jogador coloca o maior número de cartas rotuladas como 0 na pilha de descarte (observe que ele não precisa jogar todas as cartas rotuladas como 0 , embora geralmente seja do seu interesse fazer isso ) Ele deve jogar pelo menos uma carta. O segundo jogador joga quantas cartas quiser rotular 1 , o terceiro jogador joga 2 e assim por diante. Após 12, ele é redefinido para 0.
O que acontece se você não tiver nenhuma das cartas que deveria jogar? Lembre-se, você deve jogar pelo menos uma carta - na verdade, você pode jogar todas as cartas que desejar! (Na verdade, mesmo se você tiver a carta certa, você pode mentir e jogar uma carta diferente). No entanto, alguém pode ligar para você e dizer: "BS!" Se alguém está correto e você mentiu, você deve pegar todas as cartas da pilha de descarte; como recompensa, o jogador que chamou você aleatoriamente coloca uma de suas cartas na pilha de descarte. Se o acusador estiver errado, no entanto, ele deve levar todas as cartas da pilha de descarte. Note que você não pode mentir sobre o número de cartas que joga.
Informações mais detalhadas:
- No início do jogo, quatro jogadores aleatórios são escolhidos para jogar. Como haverá pelo menos 1000 jogos, cada jogador terá a chance de jogar. A ordem do turno é decidida aleatoriamente no início do jogo
- Se você devolver uma carta correta e uma incorreta, é considerado mentiroso (ou seja, se você deveria dar 2 s e você deu um 2 e um 1 , então isso é mentira)
- Se dois ou mais jogadores dizem BS ao mesmo tempo, então um é escolhido aleatoriamente.
- Sua pontuação é a porcentagem de jogos que você ganha.
- Há um máximo de 1000 rodadas, onde uma rodada é cada jogador que vai uma vez. Geralmente, alguém ganha antes disso. Se ninguém vencer, será contabilizado para o número total de jogos disputados, mas ninguém vence.
Especificação:
Você deve escrever uma classe que se estenda Player
. Será parecido com:
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";
}
}
O método requestCards
é chamado quando é a sua vez. O argumento card
é o número do cartão que você deve fornecer. Você retorna uma lista de cartas que deseja colocar na pilha de descarte. O jogador acima verifica se ele possui cartas do tipo solicitado; caso contrário, ele simplesmente joga sua primeira carta e espera que ninguém dê check.
O método bs
é chamado sempre que alguém jogar uma carta. O primeiro argumento é o jogador, o segundo - a carta que ele deveria jogar e a terceira - o número desse tipo de carta que ele afirma ter jogado. Retorne true
se você quiser chamar "BS". No código acima, o jogador chama apenas "BS" quando o outro jogador afirma ter 3 ou mais cartas do tipo solicitado.
O último argumento para ambos os métodos é controller
, que é apenas o controlador que controla o jogo. No controlador, você pode obter mais informações públicas, como o número de cartões na pilha de descarte ou a lista e a ordem dos turnos dos jogadores.
O toString
método é opcional.
Controlador no GitHub: https://github.com/prakol16/bs
Se você deseja publicar uma solução não-java, pode usar a interface fornecida em https://github.com/LegionMammal978/bs (créditos para LegionMammal978) e tentarei integrá-la.
Painel de avaliação até agora:
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á ganhando, mas CalculatingLiar está em segundo. Essas pontuações parecem consistentes - elas são praticamente as mesmas todas as vezes.
Controller.toString()
ao público, pois retorna as mãos de todos os jogadores e a pilha de descarte.