У грі Yahtzee гравці роблять по черзі кочення 5 шестигранних кісток до трьох разів за оборот, можливо, економлячи кістки між рулонами, а потім вибирають категорію, яку бажають використовувати для свого рулону. Це триває, поки не буде більше категорій (що відбувається після 13 витків). Потім підсумовуються підсумки гравців, і виграє гравець з найвищим балом.
Категорії наступні ("сума кубиків" означає додавання кількості піпсів на вказаних кістях):
- Верхній Розділ
- Тузи : сума кістки, що показує 1 піп
- Двічі : сума кістки, що показує 2 піпси
- Трійки : сума кістки, що показує 3 піпси
- Четверть : сума кістки, що показує 4 піпси
- П’ятірки : сума кістки, що показує 5 піпсів
- Шістдесят : сума кістки, що показує 6 піпсів
- Нижній Розділ
- Три види : 3 кістки з однаковим значенням, оцінка - це сума всіх кісток
- Чотири з видів : 4 кістки з однаковим значенням, оцінка - це сума всіх кісток
- Full House : 3 кубики з одним значенням і 2 з іншим, оцінка - 25
- Маленька пряма : 4 послідовні кубики, оцінка - 30
- Велика пряма : 5 послідовних кісток, оцінка 40
- Yahtzee : всі 5 кубиків з однаковим значенням, оцінка 50
- Шанс : будь-яка комбінація кісток, оцінка - це сума всіх кісток
Існує кілька правил щодо вибору категорії:
- Якщо гравець вибирає категорію, яка не відповідає їх рулону, він отримує бал 0 для цієї категорії.
- Якщо гравець заробить бал принаймні 63 у верхній частині, він отримає 35 бонусних балів.
- Якщо гравець прокатав Yahtzee, але категорія Yahtzee вже прийнята (інший Yahtzee - заповнення 0 за промах не зараховується), він отримує бонус у 100 балів. Цей бонус присуджується кожному Yahtzee після першого.
- Крім того, гравець повинен все-таки вибрати, щоб заповнити категорію. Вони повинні вибрати категорію верхнього розділу, що відповідає їх рулону (наприклад, рулон 5 6-х повинен бути розміщений у категорії шістдесят). Якщо відповідна категорія верхнього розділу вже використана, Yahtzee може бути використаний для категорії нижнього розділу (у цьому випадку, вибираючи Full House, Small Straight або Large Straight присвоюється нормальна кількість балів, а не 0). Якщо взяти всі категорії нижнього розділу, то Yahtzee може бути застосований до невикористаної категорії верхнього розділу, з оцінкою 0.
Змагання
У цьому виклику конкуренти зіграють 1000 ігор Yahtzee. В кінці кожної гри представники, які набрали найбільшу суму, отримають 1 бал. Після закінчення всіх ігор, виграш з найбільшою кількістю очок виграє. Якщо є нічия, додаткові ігри будуть грати лише зв'язаними поданнями, поки не буде розірвано нічия.
Контролер
Повний код контролера можна знайти в цьому сховищі GitHub . Ось загальнодоступні інтерфейси, з якими гравці будуть взаємодіяти:
public interface ScorecardInterface {
// returns an array of unused categories
Category[] getFreeCategories();
// returns the current total score
int getScore();
// returns the current Yahtzee bonus
int getYahtzeeBonus();
// returns the current Upper Section bonus
int getUpperBonus();
// returns the current Upper Section total
int getUpperScore();
}
public interface ControllerInterface {
// returns the player's scorecard (cloned copy, so don't try any funny business)
ScorecardInterface getScoreCard(Player p);
// returns the current scores for all players, in no particular order
// this allows players to compare themselves with the competition,
// without allowing them to know exactly who has what score (besides their own score),
// which (hopefully) eliminates any avenues for collusion or sabotage
int[] getScores();
}
public enum Category {
ACES,
TWOS,
THREES,
FOURS,
FIVES,
SIXES,
THREE_OF_A_KIND,
FOUR_OF_A_KIND,
FULL_HOUSE,
SMALL_STRAIGHT,
LARGE_STRAIGHT,
YAHTZEE,
CHANCE;
// determines if the category is part of the upper section
public boolean isUpper() {
// implementation
}
// determines if the category is part of the lower section
public boolean isLower() {
// implementation
}
// determines if a given set of dice fits for the category
public boolean matches(int[] dice) {
// implementation
}
// calculates the score of a set of dice for the category
public int getScore(int[] dice) {
// implementation
}
// returns all categories that fit the given dice
public static Category[] getMatchingCategories(int[] dice) {
// implementation
}
}
public class TurnChoice {
// save the dice with the specified indexes (0-4 inclusive)
public TurnChoice(int[] diceIndexes) {
// implementation
}
// use the current dice for specified category
public TurnChoice(Category categoryChosen) {
// implementation
}
}
public abstract class Player {
protected ControllerInterface game;
public Player(ControllerInterface game) {
this.game = game;
}
public String getName() {
return this.getClass().getSimpleName();
}
// to be implemented by players
// dice is the current roll (an array of 5 integers in 1-6 inclusive)
// stage is the current roll stage in the turn (0-2 inclusive)
public abstract TurnChoice turn(int[] dice, int stage);
}
Крім того, є деякі корисні методи в Util.java
. Вони в основному є для спрощення коду контролера, але їх можуть використовувати гравці, якщо вони бажають.
Правила
- Гравцям заборонено взаємодіяти будь-яким способом, за винятком використання
Scorecard.getScores
методу для перегляду поточних результатів усіх гравців. Сюди входить домовленість з іншими гравцями або саботаж інших гравців за допомогою маніпулювання частинами системи, які не є частиною загальнодоступного інтерфейсу. - Якщо гравець зробить нелегальний хід, він не буде дозволений до участі в турнірі. Будь-які проблеми, що спричиняють нелегальні ходи, повинні бути вирішені до початку турніру.
- Якщо після запуску турніру буде здійснено додаткове подання, новий турнір буде запущений з новими поданнями, і виграш подання буде оновлено відповідно. Однак я не даю жодних гарантій оперативності в проведенні нового турніру.
- Подання можуть не використовувати жодних помилок у коді контролера, які спричиняють його відхилення від фактичних правил гри. Вкажіть на мене помилки (у коментарі та / або у випуску GitHub), і я їх виправлю.
- Використання засобів відображення Java заборонено.
- Будь-яка мова, що працює на JVM або може бути скомпільована в байт-код Java або JVM (наприклад, Scala або Jython), може бути використана, якщо ви надаєте будь-який додатковий код, необхідний для взаємодії з Java.
Заключні коментарі
Якщо є якийсь корисний метод, який ви хотіли б мені додати до контролера, просто запитайте у коментарях та / або зробіть проблему на GitHub, і я додам це, припускаючи, що він не дозволяє порушувати правила або викривати інформацію які гравці неприватні. Якщо ви хочете написати це самостійно і створити запит на тягнення на GitHub, ще краще!
ACES
? Ви маєте на увазіONES
? Це кубики, а не картки.