82 lines
2.6 KiB
Ceylon
82 lines
2.6 KiB
Ceylon
import com.vasileff.ceylon.random.api { ... }
|
|
|
|
"""Run the example code for Rosetta Code ["Playing cards" task] (http://rosettacode.org/wiki/Playing_cards)."""
|
|
shared void run() {
|
|
variable value deck = Deck();
|
|
print("New deck (``deck.size`` cards): ``deck``
|
|
");
|
|
|
|
deck = deck.shuffle();
|
|
print("Shuffeled deck (``deck.size`` cards): ``deck``
|
|
");
|
|
|
|
print("Deal three hands: ");
|
|
for (i in 1..3) {
|
|
value [hand, _deck] = deck.deal();
|
|
print("- Dealt ``hand.size`` cards to hand ``i`` : ``join(hand)``");
|
|
deck = _deck;
|
|
}
|
|
|
|
print("
|
|
Deck (``deck.size`` cards) after dealing three hands: ``deck``");
|
|
|
|
}
|
|
|
|
abstract class Suit() of clubs | hearts | spades | diamonds {}
|
|
|
|
object clubs extends Suit() { string = "♣"; }
|
|
object hearts extends Suit() { string = "♥"; }
|
|
object spades extends Suit() { string = "♠"; }
|
|
object diamonds extends Suit() { string = "♦"; }
|
|
|
|
abstract class Pip() of two | three | four | five | six | seven | eight | nine | ten | jack | queen | king | ace {}
|
|
object two extends Pip() { string = "2"; }
|
|
object three extends Pip() { string = "3"; }
|
|
object four extends Pip() { string = "4"; }
|
|
object five extends Pip() { string = "5"; }
|
|
object six extends Pip() { string = "6"; }
|
|
object seven extends Pip() { string = "7"; }
|
|
object eight extends Pip() { string = "8"; }
|
|
object nine extends Pip() { string = "9"; }
|
|
object ten extends Pip() { string = "10"; }
|
|
object jack extends Pip() { string = "J"; }
|
|
object queen extends Pip() { string = "Q"; }
|
|
object king extends Pip() { string = "K"; }
|
|
object ace extends Pip() { string = "A"; }
|
|
|
|
class Card(shared Pip pip, shared Suit suit) {
|
|
string = "``pip`` of ``suit``";
|
|
}
|
|
|
|
|
|
String join(Card[] cards) => ", ".join { *cards };
|
|
|
|
class Deck (cards = [ for (suit in `Suit`.caseValues) for (pip in `Pip`.caseValues) Card(pip, suit) ]) {
|
|
shared Card[] cards;
|
|
|
|
shared Deck shuffle(Random rnd = platformRandom())
|
|
=> if (nonempty cards)
|
|
then Deck( [*randomize(cards, rnd)] )
|
|
else this;
|
|
|
|
shared Integer size => cards.size;
|
|
|
|
shared Boolean empty => cards.empty;
|
|
|
|
string => if (size > 13)
|
|
then "\n " + "\n ". join { *cards.partition(13).map((cards) => join(cards)) }
|
|
else join(cards);
|
|
|
|
shared [Card[], Deck] deal(Integer handSize = 5) {
|
|
if (handSize >= cards.size) {
|
|
return [cards, Deck([])];
|
|
}
|
|
else {
|
|
return [
|
|
cards.initial(handSize),
|
|
Deck(cards.skip(handSize).sequence())
|
|
];
|
|
}
|
|
}
|
|
}
|