BS est un jeu de cartes où le but du jeu est de perdre toutes vos cartes.
Un jeu se compose de quatre joueurs et d'un jeu de 52 cartes. Chaque joueur reçoit au hasard 13 cartes. Normalement, les cartes sont étiquetées 2 - 10, Ace, Jack, Queen, King, mais pour plus de simplicité, les cartes seront étiquetées avec un nombre compris entre 0 et 12 inclus. Bien que le nombre de cartes dans la main d'un joueur soit une information publique, seul le joueur sait quelles cartes spécifiques sont dans sa main.
Le jeu se déroule comme suit: le premier joueur place autant de cartes étiquetées 0 qu'il le souhaite dans la défausse (notez qu'il n'est pas obligé de jouer toutes ses cartes étiquetées 0 , bien qu'il soit généralement dans son intérêt de le faire ). Il doit jouer au moins une carte. Le deuxième joueur joue autant de cartes qu'il veut étiqueter 1 , le troisième joueur joue 2 , et ainsi de suite. Après 12, il revient à 0.
Que se passe-t-il si vous n'avez aucune des cartes que vous êtes censé jouer? N'oubliez pas, vous devez jouer au moins une carte - en fait, vous pouvez jouer toutes les cartes que vous voulez! (En fait, même si vous avez la bonne carte, vous pouvez mentir et jouer une autre carte). Cependant, quelqu'un peut vous appeler et dire: "BS!" Si cette personne a raison et que vous avez menti, vous devez prendre toutes les cartes de la défausse; en récompense, le joueur qui vous a appelé place au hasard une de ses cartes dans la défausse. Si l'accusateur a tort, cependant, il doit prendre toutes les cartes de la pile de défausse. Notez que vous ne pouvez pas mentir sur le nombre de cartes que vous jouez.
Informations plus détaillées:
- Au début du jeu, quatre joueurs aléatoires sont choisis pour jouer. Puisqu'il y aura au moins 1000 parties, chaque joueur aura une chance de jouer. L'ordre du tour est décidé au hasard en début de partie
- Si vous retournez une carte correcte et une carte incorrecte, cela est considéré comme un mensonge (c'est-à-dire si vous étiez censé donner 2 s et que vous en avez donné un 2 et un 1 , alors c'est mentir)
- Si deux joueurs ou plus disent tous les deux BS en même temps, alors l'un est choisi au hasard.
- Votre score est le pourcentage de parties que vous gagnez.
- Il y a un maximum de 1000 tours, où un tour est joué par chaque joueur une fois. Habituellement, quelqu'un gagne avant cela. Si personne ne gagne, il est compté dans le nombre total de parties jouées, mais personne ne gagne.
Spec:
Vous devez écrire une classe qui s'étend Player
. Cela ressemblera à:
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";
}
}
La méthode requestCards
est appelée quand c'est votre tour. L'argument card
est le numéro de carte que vous êtes censé fournir. Vous retournez une liste de cartes que vous souhaitez mettre dans la pile de défausse. Le joueur ci-dessus vérifie s'il a des cartes du type de carte demandé; sinon, il joue simplement sa première carte et espère que personne ne vérifie.
La méthode bs
est appelée chaque fois que quelqu'un d'autre joue une carte. Le premier argument est le joueur, le second - la carte qu'il était censé jouer, et le troisième - le numéro de ce type de carte qu'il prétend avoir joué. Revenez true
si vous voulez appeler "BS". Dans le code ci-dessus, le joueur n'appelle "BS" que lorsque l'autre joueur prétend avoir 3 cartes ou plus du type demandé.
Le dernier argument pour les deux méthodes est controller
, qui est juste le contrôleur qui contrôle le jeu. À partir du contrôleur, vous pouvez obtenir plus d'informations publiques, telles que le nombre de cartes dans la pile de défausse ou la liste et l'ordre des tours des joueurs.
La toString
méthode est facultative.
Contrôleur sur GitHub: https://github.com/prakol16/bs
Si vous souhaitez publier une solution non java, vous pouvez utiliser l'interface fournie dans https://github.com/LegionMammal978/bs (crédits à LegionMammal978) et je vais essayer de l'intégrer.
Tableau de bord jusqu'à présent:
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 en train de gagner, mais CalculatingLiar est de près. Ces scores semblent cohérents - ils sont à peu près les mêmes à chaque fois.
la source
Controller.toString()
au public, car cela rend les mains de tous les joueurs et la pile de défausse.Réponses:
Escroc
ConMan surveille chaque carte qui passe dans sa main, appelant BS lorsqu'un jeu n'est pas possible en raison de l'emplacement des cartes.
Joue la vérité quand il le peut, mais ment intelligemment en utilisant la dernière carte en cas de victoire.
J'ai passé beaucoup de temps à régler une technique pour appeler BS lorsque la probabilité était élevée que l'adversaire mentait, ou lorsque appeler BS était bénéfique (comme obtenir des cartes utiles de la pile de défausse), mais en pratique, ne pas appeler BS du tout en filet moi le plus de points.
la source
Player 3131961357_10
Choisit un joueur au hasard à chaque partie et appelle toujours BS sur ce joueur.
la source
Truthy
Pas tout à fait fini, car je ne sais pas comment dire le résultat de l'appel de BS (s'ils ont pris la pile, ou quelqu'un d'autre en cas d'égalité, ou je l'ai fait).
Pour le moment, n'appelez BS que si je peux le prouver. Ne mentez pas, sauf si je le dois. J'ai besoin d'améliorer l'algorithme de mensonge. J'essaie de me rapprocher le plus possible de la façon dont je joue BS contre les autres joueurs (moins de mettre au hasard des cartes supplémentaires en dessous pour jouer 5 ou 6 à leur insu.)
la source
cards = cards.get(0)
.cards
est une liste, vous ne pouvez donc pas attribuer unCard
à unList<Card>
. Essayez-vous de supprimer tout sauf le premier élément?numberOfCards
parce qu'ils sont déjà mis au rebut lorsque l'bs
on appelle)CalculatingLiar
Celui-ci essaie de jouer la vérité. S'il ment, il utilise une carte qu'il n'utilisera pas dans un avenir proche. Il essaie également de gagner des appels à BS sur les autres joueurs, car la dernière carte ne correspond presque jamais.
la source
Hoarder
Stratégie très simple, collecte des cartes jusqu'à ce qu'il puisse continuer sur une ligne d'honnêteté et gagner. Je n'ai pas pu le tester, j'espère que mon Java n'est pas trop rouillé.
la source
remainingCards.remove(card)
devrait avoir un transtypage enInteger
, sinon Java pense que vous appelez.remove(int)
, ce qui est supprimé par index.LiePlayer
Fixe au moins 2 cartes, même si cela signifie étirer la vérité.
la source
Card[] hand = getHand();
est nécessaire en haut debs(..)
(Player.hand
est privé). En outre, cela se bloque si vous avez moins de 2 cartes en main.i<cards.length
; la main n'est pas définie àCard c : hand
. Et parfois, il entre dans une boucle infinie parce que vous ne le faites pas++i
dans la boucle. J'ajouterais ceux-ci, mais je ne suis pas sûr que c'est exactement ce que vous voulez.