BS - карткова гра, де метою гри є втрата всіх ваших карт.
Гра складається з чотирьох гравців та колоди на 52 картки. Кожному гравцеві випадковим чином видається 13 карт. Зазвичай картки мають позначення 2 - 10, Туз, Джек, Королева, Кінг, але для простоти картки будуть позначені цифрою від 0 до 12 включно. Хоча кількість карт у руці гравця є загальнодоступною інформацією, тільки гравець знає, які конкретні карти є в його руці.
Гра йде наступним чином: перший гравець розміщує стільки карт із позначкою 0, скільки хоче, щоб відкинути в купі відкидання (зауважте, що йому не потрібно грати всі свої карти з позначкою 0 , хоча зазвичай це в його найкращих інтересах. ). Він повинен грати хоча б одну карту. Другий гравець розігрує стільки карт, скільки хоче, щоб він мітив 1 , третій грає 2 та ін. Після 12 він скидається до 0.
Що станеться, якщо у вас немає жодної карти, в яку ви повинні грати? Пам'ятайте, ви повинні грати хоча б одну карту - насправді ви можете грати в будь-які карти, які хочете! (Насправді, навіть якщо у вас є правильна карта, ви можете брехати і грати в іншу карту). Однак хтось може зателефонувати вам і сказати: "БС!" Якщо хтось має рацію, і ви збрехали, ви повинні взяти всі картки в купі скидання; як винагорода, гравець, який вас зателефонував випадковим чином, поміщає одну зі своїх карт у купу скинутих. Якщо обвинувачувач помиляється, він повинен взяти всі картки в купу скидання. Зауважте, що ви не можете брехати про кількість гральних карт.
Більш детальна інформація:
- На початку гри для гри обрано чотирьох випадкових гравців. Оскільки буде щонайменше 1000 ігор, кожен гравець отримає шанс грати. Порядок повороту визначається випадковим чином на початку гри
- Якщо ви повернете одну правильну карту та одну неправильну карту, вона вважається брехнею (тобто, якщо ви мали дати 2 с, а ви дали одну 2 і одну 1 , то це брехня)
- Якщо два або більше гравців обидва кажуть BS одночасно, то одного вибирають випадковим чином.
- Ваш рахунок - це відсоток ігор, які ви виграєте.
- Максимум 1000 раундів, де один раунд проходить кожен гравець один раз. Зазвичай хтось перемагає перед цим. Якщо ніхто не виграє, то він зараховується до загальної кількості зіграних ігор, але ніхто не виграє.
Специфікація:
Ви повинні написати клас, який розширюється Player
. Це буде виглядати так:
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
називається, коли настає ваша черга. Аргумент card
- номер картки, який ви повинні надати. Ви повертаєте список карток, які ви хочете скласти у купу скидання. Гравець вище перевіряє, чи є у нього картки запитуваного типу картки; якщо ні, то він просто грає свою першу карту і сподівається, що ніхто не перевірить.
Метод bs
викликається, коли хтось інший грає в карту. Перший аргумент - гравець, другий - карта, на якій він повинен був грати, а третій - номер того типу карти, на який він стверджує, що грав. Поверніться, true
якщо хочете зателефонувати "BS". У наведеному вище коді гравець називає "BS" лише тоді, коли інший гравець стверджує, що має 3 або більше карт запитуваного типу.
Останній аргумент для обох методів - controller
це лише контролер, який керує грою. Від контролера ви можете отримати більше загальнодоступної інформації, наприклад, кількість карток у купі скидання або список та порядок чергування гравців.
toString
Метод є необов'язковим.
Conroller на GitHub: https://github.com/prakol16/bs
Якщо ви хочете опублікувати не-java-рішення, ви можете використовувати інтерфейс, наданий у https://github.com/LegionMammal978/bs (кредити LegionMammal978), і я спробую інтегрувати його.
Досі табло:
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 виграє, але CalculationLiar - це найближча секунда. Ці оцінки здаються послідовними - вони щоразу однакові.
Controller.toString()
публіці, оскільки це повертає руки всіх гравців і купу скинутих.