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";
}
}
requestCardsSı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 toStringyö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 .