2017-10-20 178 views
0

我正在做一个纸牌游戏作为一个任务,我卡在最后一关。我遇到的问题是我需要一个条件控制来查看并确定取决于结果的卡的价值。在这场比赛中ACE可能值1或14取决于对结果最有利的因素。游戏是某种黑色插孔,但每张卡的面值除ACE之外都可以是1和14.我可以检查并将值设置为1或14,如果所选卡的总数为7或减。 7 + 14 = 21,对于比赛最有利。但是我无法得到相反的代码:如果第一张牌是ACE并且其值设置为14,并且第二张牌是9,那么结果将是23并且玩家被破坏。我需要的ACE是值得1然后......一个ACE的默认值是1。我到目前为止的代码是:与条件子句相反的设置值

this.dealCard = function() { 
    this.dealedHand.push(shuffledDeck.shift()) 
    let sum = 0 
    this.dealedHand.forEach(function (card) { 
    if (card.value === 1 && sum <= 7) { 
     card.value = 14 
    } //Another condition clause to reverse that and let the ACE be 1 again... 
    sum = sum + card.value 
    }) 
    this.dealedHandSum = sum 
} 

for (let i = 0; i < 2; i++) { 
    this.dealCard() 
} 

while (this.dealedHandSum < player.stopAtValue) { 
    this.dealCard() 
} 

这是总结的函数卡的手移动。

其他一切工作,因为它应该,但我想避免这种情况发生:

Johanna: A♠ K♣ 27 
Johanna got 27 and is busted! 
+2

的[有一种优雅的方式来处理与Ace在大酒杯?]可能的复制(https://开头计算器.com/questions/837951/is-there-an-elegant-way-to-deal-the-ace-in-blackjack) – GottZ

回答

1

只是算在其最高值尖子,然后降低他们,如果玩家被捣毁。这意味着你必须跟踪他们有多少尖子,但是这并不难:

this.dealCard = function() { 
    this.dealedHand.push(shuffledDeck.shift()) 
    let sum = 0 
    let aces = [] // Keep track of each ace in the hand 
    this.dealedHand.forEach(function (card) { 
     if (/* Card is Ace */) { 
      card.value = 14 // Count each ace at its highest value 
      aces.push(card) 
     } 
     sum = sum + card.value 
    }) 
    while (aces.length && sum > 21) { // If busted, and we have aces, reduce their value 
     sum -= 13 
     let ace = aces.shift() 
     ace.value = 1 
    } 
    this.dealedHandSum = sum 
} 
+0

好吧,我们差不多在那里。它的工作原理应该如此,但是如果我运行调试器,并且一张ace显示该卡片获得card.value = 14且numAces = 1。如果我们然后被剔除,它会从总和中减去13,但卡片仍然保留它的值如果14和最后总结起来,我们仍然被捣毁。 –

+0

我已编辑帖子以反映这一点。我想我们需要自己追踪真实的卡片,而不是只保留一些ace。所以如果你得到一个ace,把它推入一个数组,然后如果被破坏,减少总和,从阵列中移除一个ace,然后将它的值改回1。 – CRice

+0

谢谢。在一手牌中表现非常出色,但有两个我们可以得到:A♠A♥10♥25应该是1 + 1 + 10 = 12代替1 + 14 + 10 = 25 –