BS adalah permainan kartu di mana objek permainannya adalah kehilangan semua kartu Anda.
Gim terdiri dari empat pemain dan setumpuk 52 kartu. Setiap pemain diberikan 13 kartu secara acak. Biasanya, kartu diberi label 2 - 10, Ace, Jack, Queen, King, tetapi untuk kesederhanaan, kartu akan diberi label dengan angka dari 0 - 12 inklusif. Meskipun jumlah kartu di tangan pemain adalah informasi publik, hanya pemain yang tahu kartu apa yang ada di tangannya.
Permainan berjalan sebagai berikut: pemain pertama menempatkan kartu yang berlabel 0 sebanyak yang ia inginkan dalam tumpukan kartu (perhatikan bahwa ia tidak diharuskan memainkan semua kartunya yang berlabel 0 , meskipun biasanya itu merupakan kepentingan terbaiknya untuk melakukannya) ). Dia harus memainkan setidaknya satu kartu. Pemain kedua memainkan kartu sebanyak yang dia ingin beri label 1 , pemain ketiga memainkan 2 , dan seterusnya. Setelah 12, itu me-reset ke 0.
Apa yang terjadi jika Anda tidak memiliki kartu yang seharusnya Anda mainkan? Ingat, Anda harus memainkan setidaknya satu kartu - pada kenyataannya, Anda dapat memainkan kartu apa pun yang Anda inginkan! (Sebenarnya, bahkan jika Anda memiliki kartu yang tepat, Anda dapat berbohong dan memainkan kartu yang berbeda). Namun, seseorang dapat memanggil Anda keluar dan berkata, "BS!" Jika seseorang itu benar dan Anda telah berbohong, maka Anda harus mengambil semua kartu di tumpukan dibuang; sebagai hadiah, pemain yang memanggil Anda secara acak menempatkan salah satu kartu mereka di tumpukan kartu buangan. Namun, jika penuduh salah, ia harus mengambil semua kartu di tumpukan kartu buangan. Perhatikan bahwa Anda tidak dapat berbohong tentang jumlah kartu yang Anda mainkan.
Info lebih detail:
- Di awal permainan, empat pemain acak dipilih untuk bermain. Karena akan ada setidaknya 1000 pertandingan, setiap pemain akan mendapatkan kesempatan untuk bermain. Urutan giliran ditentukan secara acak di awal permainan
- Jika Anda mengembalikan satu kartu yang benar dan satu kartu yang salah, maka itu dianggap bohong (yaitu jika Anda seharusnya memberikan 2 s, dan Anda memberikan satu 2 dan satu 1 , maka itu bohong)
- Jika dua atau lebih pemain mengatakan BS secara bersamaan, maka satu akan dipilih secara acak.
- Skor Anda adalah persentase game yang Anda menangkan.
- Ada maksimum 1000 putaran, di mana satu putaran adalah setiap pemain terjadi sekali. Biasanya, seseorang menang sebelum ini. Jika tidak ada yang menang, maka itu dihitung terhadap jumlah total permainan yang dimainkan, tetapi tidak ada yang menang.
Spesifikasi:
Anda harus menulis kelas yang diperluas Player
. Ini akan terlihat seperti:
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";
}
}
Metode requestCards
ini dipanggil saat giliran Anda. Argumennya card
adalah nomor kartu yang seharusnya Anda berikan. Anda mengembalikan daftar kartu yang ingin Anda masukkan ke tumpukan kartu buangan. Pemain di atas memeriksa untuk melihat apakah dia memiliki kartu jenis kartu yang diminta; jika tidak, ia cukup memainkan kartu pertamanya dan berharap tidak ada yang memeriksa.
Metode bs
ini dipanggil setiap kali orang lain memainkan kartu. Argumen pertama adalah pemain, yang kedua - kartu yang seharusnya ia mainkan, dan yang ketiga - jumlah jenis kartu yang ia klaim telah ia mainkan. Kembali true
jika Anda ingin memanggil "BS." Dalam kode di atas, pemain hanya memanggil "BS" ketika pemain lain mengklaim memiliki 3 kartu atau lebih dari jenis yang diminta.
Argumen terakhir untuk kedua metode adalah controller
, yang hanya merupakan pengontrol yang mengontrol permainan. Dari pengontrol, Anda bisa mendapatkan lebih banyak informasi publik, seperti jumlah kartu dalam tumpukan kartu atau daftar dan mengubah urutan para pemain.
The toString
metode adalah opsional.
Conroller di GitHub: https://github.com/prakol16/bs
Jika Anda ingin memposting solusi non-java, Anda dapat menggunakan antarmuka yang disediakan di https://github.com/LegionMammal978/bs (kredit ke LegionMammal978) dan saya akan mencoba mengintegrasikannya.
Papan skor sejauh ini:
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 menang, tetapi CalculatingLiar hampir berakhir. Skor ini tampaknya konsisten - mereka cukup sama setiap saat.
sumber
Controller.toString()
ke publik, karena mengembalikan tangan semua pemain dan tumpukan kartu buangan.Jawaban:
Penipu
ConMan mengawasi setiap kartu yang melewati tangannya, memanggil BS ketika permainan tidak dimungkinkan karena di mana kartu-kartu itu berada.
Memainkan kebenaran saat bisa, tetapi berbohong dengan cerdas menggunakan kartu terakhir jika kemenangan terjadi.
Saya menghabiskan waktu lama menyetel teknik untuk memanggil BS ketika probabilitas tinggi bahwa lawan berbohong, atau ketika memanggil BS menguntungkan (seperti mendapatkan kartu yang berguna dari tumpukan buangan), tetapi dalam praktiknya, tidak memanggil BS sama sekali terjaring saya poin terbanyak.
sumber
Pemain 3131961357_10
Pilihan pemain acak setiap permainan, dan selalu memanggil BS pada pemain itu.
sumber
Sejujurnya
Belum selesai, karena saya tidak tahu bagaimana cara memberitahu hasil pemanggilan BS (jika mereka mengambil tumpukan, atau orang lain dalam kasus dasi, atau saya melakukannya).
Saat ini, panggil saja BS jika saya bisa membuktikannya. Jangan berbohong kecuali aku harus. Saya perlu meningkatkan algoritma berbohong. Saya mencoba membuatnya sedekat mungkin dengan cara saya bermain BS melawan pemain lain (dikurangi secara acak menempatkan kartu tambahan di bawahnya untuk bermain 5 atau 6 tanpa mereka sadari).
sumber
cards = cards.get(0)
.cards
adalah daftar sehingga Anda tidak dapat menetapkan aCard
keList<Card>
. Apakah Anda mencoba menghapus semuanya kecuali elemen pertama?numberOfCards
karena mereka sudah dibuang ketikabs
dipanggil)CalculatingLiar
Yang ini mencoba memainkan kebenaran. Jika dia berbohong, dia menggunakan kartu yang tidak akan dia gunakan dalam waktu dekat. Itu juga mencoba untuk menang melalui memanggil BS pada pemain lain, karena kartu terakhir hampir tidak pernah cocok.
sumber
Penimbun
Strategi yang sangat sederhana, mengumpulkan kartu hingga dapat mencapai garis kejujuran dan menang. Tidak bisa mengujinya, semoga Java saya tidak terlalu berkarat.
sumber
remainingCards.remove(card)
harus dilemparkan keInteger
, jika tidak Java berpikir Anda menelepon.remove(int)
, yang dihapus oleh indeks.LiePlayer
Letakkan setidaknya 2 kartu, meskipun itu berarti merentangkan kebenaran.
sumber
Card[] hand = getHand();
diperlukan di bagian atasbs(..)
(Player.hand
bersifat pribadi). Juga, ini macet jika Anda memiliki kurang dari 2 kartu di tangan Anda.i<cards.length
; tangan tidak didefinisikan padaCard c : hand
. Dan kadang-kadang masuk ke loop tak terbatas karena Anda tidak melakukannya++i
dalam loop. Saya akan menambahkan ini tetapi saya tidak yakin itu yang Anda inginkan sebenarnya.