Created
December 2, 2017 00:11
-
-
Save dragon0/99192544e596136c93d32259a809f77a to your computer and use it in GitHub Desktop.
Card deck using case classes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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