BS , oyunun amacının tüm kartlarınızı kaybetmek olduğu bir kart oyunudur.
Bir oyun dört oyuncu ve 52 kart desteden oluşur. Her oyuncu rastgele 13 kart alır. Normalde, kartlar 2 - 10, Ace, Jack, Queen, King olarak etiketlenir, ancak basit olması için, kartlar 0 - 12 dahil olmak üzere bir numara ile etiketlenir. Bir oyuncunun elindeki kart sayısı halka açık olsa da, elinde hangi kartların olduğunu sadece oyuncu bilir.
Oyun olarak gider izler: Birçok kartları gibi ilk oyuncu yerleri etiketli 0 kendisine tüm kartları etiketli oynamak için gerekli olmadığını kazık atmak içinde (nota istediği gibi 0 olsa genellikle bunu yapmak için elinden geleni yararına olduğunu, ). En az bir kart oynamalıdır. İkinci oyuncu 1 olarak etiketlemek istediği kadar kart oynar , üçüncü oyuncu 2 vb. Oynar. 12'den sonra, 0'a sıfırlar.
Çalmanız gereken kartlardan hiçbirine sahip değilseniz ne olur? Unutmayın, en az bir kart oynamalısınız - aslında, istediğiniz kartları oynayabilirsiniz! (Aslında, doğru karta sahip olsanız bile, farklı bir kartla yalan söyleyebilir ve oynatabilirsiniz). Ancak, birileri sizi arayabilir ve "BS!" Diyebilir. Eğer o kişi haklıysa ve yalan söylemişseniz, atılan kağıttaki bütün kartları almalısınız; bir ödül olarak, sizi rasgele çağıran oyuncu, kartlarından birini atılan kağıt yığınına yerleştirir. Ancak, kullanıcı yanlışsa, atma kartındaki tüm kartları elden çıkarması gerekir. Oynadığınız kart sayısı hakkında yalan söyleyemeyeceğinizi unutmayın .
Daha detaylı bilgi:
- Oyunun başında, dört rastgele oyuncu oynamak için seçilir. En az 1000 maç olacağından, her oyuncu oynama şansına sahip olacak. Dönüş sırasına oyunun başında rastgele karar verilir.
- Bir doğru kart ve bir yanlış kart döndürürseniz, o zaman yalan sayılır (yani, 2 s vermeniz gerekiyorsa ve bir 2 ve bir 1 verdiniz , o zaman yalan söyler)
- Eğer iki veya daha fazla oyuncu aynı anda BS diyorsa, o zaman bir tanesi rastgele seçilir.
- Puanınız, kazandığınız oyunların yüzdesidir.
- Her oyuncunun bir kez oynadığı bir raundun olduğu maksimum 1000 tur var. Genellikle, bundan önce birileri kazanır. Eğer kimse kazanmazsa, oynanan toplam oyun sayısına sayılır, fakat kimse kazanmaz.
spec:
Uzanan bir sınıf yazmalısınız Player
. Gibi görünecek:
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";
}
}
requestCards
Sıra sizde olduğunda yöntem çağrılır. Argüman card
, sağlamanız gereken kart numarasıdır. Atma yığına koymak istediğiniz kartların bir listesini döndürürsünüz. Yukarıdaki oyuncu, istediği kart tipinde herhangi bir kartın olup olmadığını kontrol eder; eğer değilse, ilk kartını oynar ve kimsenin kontrol etmemesini umar.
Bu yöntem bs
, bir başkası bir kart çaldığında çağrılır. İlk argüman oyuncu, ikincisi - oynaması gereken kart ve üçüncüsü - oynadığını iddia ettiği kartın sayısı. true
"BS" yi aramak istiyorsanız geri dönün . Yukarıdaki kodda, oyuncu diğer oyuncu istenen tipte 3 veya daha fazla karta sahip olduğunu iddia ettiğinde "BS" yi çağırır.
Her iki yöntem için de son argüman controller
, oyunu kontrol eden sadece denetleyici. Denetleyiciden, atılan kağıttaki kart sayısı veya liste gibi oyuncuların sıralaması gibi daha genel bilgileri alabilirsiniz.
Bu toString
yöntem isteğe bağlıdır.
GitHub'daki kontrolcü: https://github.com/prakol16/bs
Java dışı bir çözüm göndermek istiyorsanız, https://github.com/LegionMammal978/bs adresindeki arayüzü kullanabilirsiniz (LegionMammal978’e verilen krediler) ve ben onu birleştirmeye çalışacağım.
Şu ana kadar skorbord:
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 kazanıyor, ancak CalculatingLiar çok yakın bir zamanda. Bu puanlar tutarlı görünüyor - her seferinde oldukça aynı.
Controller.toString()
Tüm oyuncuların ve atılan kazıkların ellerini geri getirdiği için halka maruz bırakılmaması tavsiye edilebilir .