【发布时间】:2019-10-27 05:15:23
【问题描述】:
我有这些步骤:
trait BlackjackSteps {
def gamerTakesTwoCards(gamerName:String): State[Deck, Gamer]
def dealerTakesTwoCards: State[Deck, Dealer]
def isBlackjack(gamer: Gamer, dealer: Dealer): Option[Player]
def gamerDrawsCards(gamer: Gamer): State[Deck, Gamer]
def dealerDrawsCards(dealer: Dealer, gamer: Gamer): State[Deck, Dealer]
def determineWinner(gamer: Gamer, dealer: Dealer): Player
def program(gamerName:String): State[Deck, Player] = for {
gamer <- gamerTakesTwoCards(gamerName)
dealer <- dealerTakesTwoCards
//winner = isBlackjack(gamer, dealer)
gamerFinal <- gamerDrawsCards(gamer)
dealerFinal <- dealerDrawsCards(dealer, gamerFinal)
winnerFinal = determineWinner(gamerFinal, dealerFinal)
} yield winnerFinal
}
两个问题:
如何获得由 gamerTakesTwoCards 产生的牌组并将其传递给 DealerTakesTwoCards?
isBlackjack 可能会导致赢家,在这种情况下,我需要停止并返回赢家。我怎样才能改变上面的代码来做到这一点?
游戏:
- 游戏玩家和庄家游戏
- 他们都抽两张牌
- 如果没有 21 名获胜者
- 玩家一直抽牌直到 17 点
- 不超过 21 分的最高玩家获胜!
完整代码在这里:https://bitbucket.org/jameskingconsulting/blackjack-scala/src/master/
编辑:
我已经去糖化了,只是为了弄清楚发生了什么:
def program(gamerName:String): State[Deck, Player] =
gamerTakesTwoCards(gamerName).flatMap( gamer =>
dealerTakesTwoCards.flatMap(dealer =>
isBlackjack(gamer, dealer).fold(
gamerDrawsCards(gamer).flatMap( gamerFinal =>
dealerDrawsCards(dealer, gamerFinal).map( dealerFinal =>
determineWinner(gamerFinal, dealerFinal)
)
)
)(State.pure[Deck, Player])
))
【问题讨论】:
标签: scala functional-programming monads scala-cats for-comprehension