Crazy Eights
Rules summary
| Min players | 2 |
|---|---|
| Max players | 7 |
| Base URI | http://volity.org/games/eights/index.html |
Crazy Eights has players racing to reduce their hand sizes down to zero. Clever play can hurt opponents by forcing them to draw additional cards. It is similar to, but simpler than, the commercial card game Uno. (Some of its variants approach Uno in complexity, however.)
Setup
The game uses a standard 52-card deck. For six- or seven-player games, two identical decks are shuffled together before play.
Each player gets a starting hand of five cards, except in two-player games, where each player instead receives seven cards.
The remainder of the cards become the stock, from which players can draw during the game. The referee flips over the stock's top card to create the discard pile, as well as the first target card that the first player must play against.
Play
On each turn, the current player must, if he can, play one of the following cards from his hand:
- A card whose rank matches that of the target.
- A card whose suit matches that of the target.
- An 8, of any suit.
If the player cannot play of these cards, he must draw a card from the stock and add it to his hand. If this card is playable, it must be played immediately; otherwise, the player continues drawing and growing his hand until drawing a playable card. A player can choose to draw any number of cards from the stock before playing a card, even if he began the turn with a legal play available.
If the stock runs out of cards, the discard pile is reshuffled and becomes the new stock. Should the rare case occur that a player cannot play a card from hand when both the stock and the discard pile are empty, then that player must pass.
Eights are wild. After playing an 8, a player must follow up by announcing a suit. This effectively turns the target into an 8 of that suit; the next player must follow by playing a card of that suit, or another 8.
If a player plays his last card, the game immediately ends and scores are tallied.
Scoring
When the game ends, all players score according to the cards they are left holding. Eights are worth 50 points, face cards 10, aces 1, and spot cards are worth their rank. The fewer points, the better. Note that one player, the one who ended the game, will have a score of zero.
Volity API
Notes
Among the arguments, card refers to a two- or three-character string identifying one of the regular 52 playing cards in shorthand. The first one or two characters expresses the rank, either by a letter (for A, J, Q and K) or a number (2-10). The last character expresses the suit. For example, the King of hearts is represented by KH, the 10 of spades 10S, and the three of clubs 3C.
As with other Volity games, player is a player's table-name (the user's MUC nickname, in Jabber terms).
Referee
The player wishes to play the given card, which must either match the last card in suit or rank, or match the declared suit (if one is active), or be an 8.
If this play succeeds, and the current player is left with no cards, the game immediately ends.
Possible error codes: 901, 902, 903, 907
After playing an 8, a player must (unless it was his last card) follow up by using this function to declare a suit. The turn does not advance until this happens.
The suit argument should be a suit's one-letter initial (C, S, H or D), but a polite referee implementation can be more liberal in what it accepts. If it can't figure out what suit is intended from the argument, it should return an error 906.
Possible error codes: 901, 905, 906
The player wishes to draw the top card from the stock, and add it to his hand.
Possible error codes: 901, 904
Player
Calls to all players
The named player played the given card, which is now the card to match.
Having played an 8, the named player has declared the given suit to be the one to follow.
The named player drew a card from the stock.
The named player, unable to either play or draw, had to pass.
It is now the named player's turn to play.
The named card has been flipped off the deck, to start the game.
Called when the game ends. The given struct is a hashtable of all the game's players, and their score for this game, representing the value of the cards they were left holding at the end.
Sorting the players in ascending order by ther score will reveal the ranking for this game. Exactly one player will have a score of 0, indicating that they held no cards at the end; that player has won this game.
Player-specific calls
The receiver of this call has drawn the given card.
The receiver accepts the given array of cards. This is called only at the start of the game, when cards are dealt.
Error codes
| 901 | It's not your turn. |
|---|---|
| 902 | You don't have that card. |
| 903 | Unknown card. (Malformed play_card() argument.) |
| 904 | You can't draw a card; the stock is empty. |
| 905 | You can't choose a suit; you haven't just played an 8. |
| 906 | Unknown suit. (Malformed choose_suit() argument.) |
| 907 | That card doesn't match the target (nor is it an 8). |
Implementation Notes
Player UI
The player should continuously see his own hand, the last card played, and the declared suit, if there is one. Note that the declared suit, if defined, becomes undefined as soon as a card is played.
The player should be able to easily see the size of all opponents'
hands, even though the specific cards they hold are not
visible. There's nothing in the API that directly defines hand size,
but the UI implementation should nonetheless be able to keep track:
give all opponents a starting hand size of five (or seven,
if there is only one other opponent), then increment or decrement
these numbers in reaction to receiving player_drew_card()
or player_played_card() messages, respectively.
Referee
Passing
If a player starts a turn with no playable cards and the stock is empty, then the referee must automatically pass the turn to the next player.
Drawing cards
If a player starts a turn with no playable cards, the referee can automatically draw for the player, since (if cards are in the stock) drawing is that player's only legal option. If it takes this tack, the referee should continue drawing for the player until the player has a playable card, or the stock runs out (forcing the player to pass).
However, since a player can always choose to draw before playing, a
referee must implement the manual draw_card()
function, regardless of whether or not it also implements the
auto-draw behavior.
Variants
"Coming soon."
Some ideas for future variants:
- Instead of playing a single round (where hand values don't matter but for final ranking), play consective rounds, with players carrying their scores over from one round to the next, until one player's score exceeds some agreed-upon total (such as 100 points). The ranking is then established based on the players' final score totals.
- A player may draw only one card. If, after drawing, he has no legal play, the turn passes to the next player.
- Uno-like rules: playing a 2 forces the following player to draw cards; playing a Jack makes the following player lose his turn.