我正在尝试学习
scala,并决定创建一个扑克应用程序,让我的头围绕一些类对象.我的甲板工作正常,但我已经到了需要画5张牌的地步.到目前为止,我有:
import util.Random case class Card(value: Int,color: String) class Deck { private var deck = newDeck def draw(amount: Int): List[Card] = { val ret = deck.take(amount) deck = deck.drop(amount) ret } def newDeck: List[Card] = { Random.shuffle((1 to 13).map(x => List(Card(x,"D"),Card(x,"C"),"H"),"S"))).toList.flatten) } override def toString: String = "Deck has " + deck.length + " cards left." }
这个绘图功能看起来似乎没有两个步骤 – 但是我不确定我是否能够(或者应该)拿到顶部多个卡片,并将列表保留在没有这些卡片的状态下?
(顺便说一句,如果某人有更好的甲板创建/洗牌功能,我会全力以赴,这看起来有点像hacky ……但我的主要问题是列表状态)
解决方法
在我看来,你应该重写代码:
(a)具有完全不可变的结构,即NO var,NO可变集合
要么
(b)替换var deck:通过一些可变集合列出[Card],如ListBuffer.
这是(a)解决方案:
import util.Random case class Card(value: Int,color: String) class Deck(private val cards: Seq[Card]) { def draw(amount: Int): (Deck,Seq[Card]) = { val (ret,rem) = cards.splitAt(amount) (new Deck(rem),ret) } override def toString: String = "Deck has " + cards.size + " cards left." } object Deck { def apply(cards: Seq[Card] = Nil): Deck = cards match { case Nil => val ncds = for(v <- 1 to 13; c <- Seq("D","C","H","S")) yield Card(v,c) new Deck(Random.shuffle(ncds)) case _ => new Deck(cards) } }
使用案例:
scala> :paste // Entering paste mode (ctrl-D to finish) //paste code here // Exiting paste mode,now interpreting. import util.Random defined class Card defined class Deck defined object Deck scala> val d1 = Deck() d1: Deck = Deck has 52 cards left. scala> val (d2,cards) = d1.draw(4) d2: Deck = Deck has 48 cards left. cards: Seq[Card] = Vector(Card(3,H),Card(2,S),Card(11,Card(8,C))