BS ist ein Kartenspiel, bei dem es darum geht, alle Karten zu verlieren.
Ein Spiel besteht aus vier Spielern und einem Kartenspiel mit 52 Karten. Jeder Spieler erhält zufällig 13 Karten. Normalerweise sind die Karten mit 2 - 10, Ass, Bube, Dame, König beschriftet, aber der Einfachheit halber werden die Karten mit einer Zahl von 0 - 12 einschließlich beschriftet. Obwohl die Anzahl der Karten in der Hand eines Spielers eine öffentliche Information ist, weiß nur der Spieler, welche spezifischen Karten in seiner Hand sind.
Das Spiel läuft wie folgt ab: Der erste Spieler legt so viele Karten mit der Aufschrift 0 auf den Ablagestapel, wie er möchte (beachten Sie, dass er nicht alle Karten mit der Aufschrift 0 spielen muss , obwohl dies normalerweise in seinem besten Interesse liegt ). Er muss mindestens eine Karte spielen. Der zweite Spieler spielt so viele Karten, wie er mit 1 beschriften möchte , der dritte Spieler spielt 2 und so weiter. Nach 12 wird es auf 0 zurückgesetzt.
Was passiert, wenn Sie keine der Karten haben, die Sie spielen sollen? Denken Sie daran, dass Sie mindestens eine Karte spielen müssen - Sie können sogar jede beliebige Karte spielen! (Selbst wenn Sie die richtige Karte haben, können Sie lügen und eine andere Karte spielen.) Jemand kann Sie jedoch anrufen und sagen: "BS!" Wenn dieser Jemand Recht hat und Sie gelogen haben, müssen Sie alle Karten auf dem Ablagestapel nehmen. als Belohnung legt der Spieler, der dich gerufen hat, zufällig eine seiner Karten auf den Ablagestapel. Wenn sich der Ankläger irrt, muss er jedoch alle Karten auf dem Ablagestapel nehmen. Beachten Sie, dass Sie nicht über die Anzahl der Karten lügen können, die Sie spielen.
Nähere Infos:
- Zu Beginn des Spiels werden vier zufällige Spieler zum Spielen ausgewählt. Da es mindestens 1000 Spiele geben wird, hat jeder Spieler die Möglichkeit zu spielen. Die Zugreihenfolge wird zu Beginn des Spiels zufällig festgelegt
- Wenn Sie eine richtige und eine falsche Karte zurückgeben, wird dies als Lüge betrachtet (dh wenn Sie 2 s geben sollten und Sie eine 2 und eine 1 gaben , dann lügt dies).
- Wenn zwei oder mehr Spieler gleichzeitig BS sagen, wird einer nach dem Zufallsprinzip ausgewählt.
- Ihre Punktzahl ist der Prozentsatz der Spiele, die Sie gewinnen.
- Es gibt maximal 1000 Runden, wobei jeder Spieler eine Runde einmal spielt. Normalerweise gewinnt jemand davor. Wenn niemand gewinnt, wird dies auf die Gesamtzahl der gespielten Spiele angerechnet, aber niemand gewinnt.
Spec:
Sie sollten eine Klasse schreiben, die erweitert Player
. Es wird so aussehen:
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";
}
}
Die Methode requestCards
wird aufgerufen, wenn Sie an der Reihe sind. Das Argument card
ist die Kartennummer, die Sie angeben sollen. Sie geben eine Liste der Karten zurück, die Sie in den Ablagestapel legen möchten. Der Spieler oben prüft, ob er Karten des gewünschten Kartentyps hat. Wenn nicht, spielt er einfach seine erste Karte aus und hofft, dass niemand nachschaut.
Die Methode bs
wird aufgerufen, wenn eine andere Person eine Karte ausspielt. Das erste Argument ist der Spieler, die zweite - die Karte , die er wurde angeblich zu spielen, und die dritte - die Zahl dieser Art von Karte , die er behauptet , dass er gespielt hat. Zurück, true
wenn Sie "BS" anrufen möchten. Im obigen Code nennt der Spieler nur "BS", wenn der andere Spieler behauptet, 3 oder mehr Karten des angeforderten Typs zu haben.
Das letzte Argument für beide Methoden ist controller
, dass nur der Controller das Spiel steuert. Über den Controller können Sie öffentlichere Informationen abrufen, z. B. die Anzahl der Karten im Ablagestapel oder die Liste und die Reihenfolge der Spieler.
Die toString
Methode ist optional.
Conroller auf GitHub: https://github.com/prakol16/bs
Wenn Sie eine Nicht-Java-Lösung veröffentlichen möchten, können Sie die in https://github.com/LegionMammal978/bs (Credits für LegionMammal978) bereitgestellte Schnittstelle verwenden, und ich werde versuchen, sie zu integrieren.
Anzeiger bisher:
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 gewinnt, aber CalculatingLiar steht kurz bevor. Diese Werte scheinen konsistent zu sein - sie sind jedes Mal ziemlich gleich.
quelle
Controller.toString()
öffentlich zu machen, da es die Hände aller Spieler und den Ablagestapel zurückgibt.Antworten:
Bauernfänger
ConMan beobachtet jede Karte, die seine Hand durchläuft, und ruft BS auf, wenn ein Spiel aufgrund der Position der Karten nicht möglich ist.
Spielt die Wahrheit, wenn es geht, aber lügt intelligent mit der letzten Karte, wenn ein Sieg eintrifft.
Ich habe viel Zeit damit verbracht, eine Technik zu optimieren, um BS zu callen, wenn die Wahrscheinlichkeit hoch war, dass der Gegner lügt, oder wenn es von Vorteil war, BS zu callen (z. B. nützliche Karten vom Ablagestapel zu bekommen), aber in der Praxis wurde BS überhaupt nicht gecallt mir die meisten punkte.
quelle
Spieler 3131961357_10
Wählt bei jedem Spiel einen zufälligen Spieler und ruft bei diesem Spieler immer BS auf.
quelle
Wahrheit
Nicht ganz fertig, da ich nicht weiß, wie ich das Ergebnis eines Anrufs bei BS beurteilen soll (wenn sie den Stapel genommen haben, oder jemand anderes im Falle eines Unentschieden, oder ich).
Im Moment rufe BS nur an, wenn ich es beweisen kann. Lüge nicht, wenn ich nicht muss. Ich muss den Lügenalgorithmus verbessern. Ich versuche, es so nah wie möglich zu machen, wie ich BS gegen andere Spieler spiele (abzüglich zufällig unterlegter zusätzlicher Karten, um 5 oder 6 zu spielen, ohne dass sie es wissen).
quelle
cards = cards.get(0)
.cards
ist eine Liste , so dass Sie eine nicht zuordnen können ,Card
um einList<Card>
. Versuchen Sie, alles außer dem ersten Element zu entfernen?numberOfCards
bs
CalculatingLiar
Dieser versucht die Wahrheit zu spielen. Wenn er lügt, benutzt er eine Karte, die er in naher Zukunft nicht mehr benutzen wird. Es wird auch versucht, durch Calling BS bei anderen Spielern zu gewinnen, da die letzte Karte so gut wie nie passt.
quelle
Hamsterer
Sehr einfache Strategie, sammelt Karten, bis es auf eine Ehrlichkeitssträhne gehen und gewinnen kann. Konnte es nicht testen, hoffentlich ist mein Java nicht zu rostig.
quelle
remainingCards.remove(card)
sollte eine Umwandlung in habenInteger
, sonst denkt Java, dass Sie anrufen.remove(int)
, die durch Index entfernt wird.LiePlayer
Legt mindestens 2 Karten ab, auch wenn das bedeutet, die Wahrheit zu sagen.
quelle
Card[] hand = getHand();
wird am oberen Rand benötigtbs(..)
(Player.hand
ist privat). Dies stürzt auch ab, wenn Sie weniger als 2 Karten auf der Hand haben.i<cards.length
; Hand ist nicht definiert beiCard c : hand
. Und manchmal geht es in eine Endlosschleife, weil Sie dies nicht tun++i
. Ich würde diese hinzufügen, aber ich bin mir nicht sicher, ob Sie sie genau so wollen.