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.
fonte
Controller.toString()
ao público, pois retorna as mãos de todos os jogadores e a pilha de descarte.Respostas:
Vigarista
ConMan observa todas as cartas que passam por sua mão, chamando BS quando uma jogada não é possível devido ao local onde as cartas estão.
Reproduz a verdade quando possível, mas mente de maneira inteligente usando a última carta para uma vitória.
Passei muito tempo ajustando uma técnica para chamar BS quando a probabilidade era alta de que o oponente estivesse mentindo, ou quando chamar BS era benéfico (como obter cartas úteis da pilha de descarte), mas na prática, não chamava BS de maneira alguma. eu mais pontos.
fonte
Jogador 3131961357_10
Seleciona um jogador aleatório a cada jogo e sempre chama BS nesse jogador.
fonte
Truthy
Ainda não está terminado, já que não sei dizer o resultado de chamar BS (se eles pegaram a pilha, ou alguém em caso de empate, ou eu).
No momento, ligue para a BS apenas se eu puder provar. Não minta, a menos que eu precise. Eu preciso melhorar o algoritmo de mentir. Estou tentando torná-lo o mais próximo possível de como jogo BS contra outros jogadores (menos colocar aleatoriamente cartas extras por baixo para jogar 5 ou 6 sem que eles saibam.)
fonte
cards = cards.get(0)
.cards
é uma lista, portanto você não pode atribuir aCard
a aList<Card>
. Você está tentando remover tudo, exceto o primeiro elemento?numberOfCards
porque eles já são descartadas quandobs
é chamado)CalculatingLiar
Este tenta jogar a verdade. Se ele mentir, ele usa um cartão que não usará em um futuro próximo. Ele também tenta ganhar através de call BS em outros jogadores, já que a última carta quase nunca se encaixa.
fonte
Hoarder
Estratégia muito simples, coleciona cartões até que possa seguir uma sequência de honestidade e vencer. Não foi possível testá-lo, espero que meu Java não esteja muito enferrujado.
fonte
remainingCards.remove(card)
deve ter uma conversão paraInteger
, caso contrário, Java pensa que você está chamando.remove(int)
, que é removido pelo índice.LiePlayer
Estabelece pelo menos 2 cartões, mesmo que isso signifique esticar a verdade.
fonte
Card[] hand = getHand();
é necessário na parte superior debs(..)
(Player.hand
é privado). Além disso, isso trava se você tiver menos de 2 cartas na sua mão.i<cards.length
; mão não está definida emCard c : hand
. E às vezes entra em um loop infinito porque você não faz++i
o loop. Eu os adicionaria, mas não sei se é exatamente como você os deseja.