Skip to content

Instantly share code, notes, and snippets.

@dragon0
Created December 2, 2017 00:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dragon0/99192544e596136c93d32259a809f77a to your computer and use it in GitHub Desktop.
Save dragon0/99192544e596136c93d32259a809f77a to your computer and use it in GitHub Desktop.
Card deck using case classes
import scala.annotation.tailrec
abstract class Suit { val value: Int }
case object Clubs extends Suit { val value = 0 }
case object Diamonds extends Suit { val value = 1 }
case object Hearts extends Suit { val value = 2 }
case object Spades extends Suit { val value = 3 }
abstract class Rank { val value: Int }
case object Ace extends Rank { val value = 0 }
case object Deuce extends Rank { val value = 1 }
case object Three extends Rank { val value = 2 }
case object Four extends Rank { val value = 3 }
case object Five extends Rank { val value = 4 }
case object Six extends Rank { val value = 5 }
case object Seven extends Rank { val value = 6 }
case object Eight extends Rank { val value = 7 }
case object Nine extends Rank { val value = 8 }
case object Ten extends Rank { val value = 9 }
case object Jack extends Rank { val value = 10 }
case object Queen extends Rank { val value = 11 }
case object King extends Rank { val value = 12 }
class Card(val rank: Rank, val suit: Suit) {
override def toString(): String = {
rank.toString() + " of " + suit.toString()
}
def toId = {
suit.value * 13 + rank.value
}
}
object Card {
def apply(rank: Rank, suit: Suit): Card = {
new Card(rank, suit)
}
}
def makeDeck:Seq[Card] = {
for(
suit <- List(Clubs, Diamonds, Hearts, Spades);
rank <- List(Ace, Deuce, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King)
) yield { Card(rank, suit) }
}
def printDeck(deck: Seq[Card]) = {
for(card <- deck){ printf("%s\t%s\n", card.toId, card) }
}
def shuffle(deck: Seq[Card]) = {
require(deck.hasDefiniteSize)
val (first, last) = deck.splitAt(deck.size / 2)
@tailrec
def tail(cards:Seq[(Card, Card)], list: List[Card]): Seq[Card] = {
if(cards.isEmpty) list
else {
var (card1, card2) = cards.head
tail(cards.tail, list :+ card1 :+ card2)
}
}
tail((first zip last), Nil)
}
var deck = makeDeck
println("Initial Deck")
printDeck(deck)
println()
println("First Shuffle")
var shuffledDeck = shuffle(deck)
printDeck(shuffledDeck)
println()
deck = shuffledDeck
var count = 1
while(count < 8){
deck = shuffle(deck)
count = count + 1
}
println("After 8 perfect shuffles")
printDeck(deck)
println()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment