【问题标题】:Reverse set value with condition clause使用条件子句反转设置值
【发布时间】:2018-04-02 00:51:54
【问题描述】:

我正在做一个纸牌游戏作为一项任务,我被困在最后一个障碍。我遇到的问题是我需要一个条件控制来查看和确定取决于结果的卡片的价值。这场比赛中的 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!

【问题讨论】:

标签: javascript if-statement conditional-statements blackjack


【解决方案1】:

只需计算 A 的最高值,然后在玩家被淘汰时减少它们。这意味着您必须跟踪他们有多少 A,但这并不难:

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
}

【讨论】:

  • 好吧,我们快到了。它可以正常工作,但是如果我运行调试器并且出现一张 ace 卡得到 card.value=14 并且 numAces = 1。如果我们随后被破坏,它确实会从总和中减去 13,但卡仍然保留它的价值如果 14 和最终总结起来,我们仍然会被淘汰。
  • 我已经编辑了帖子以反映这一点。我想我们需要跟踪实际的牌本身,而不是仅仅保持 A 的数量。因此,如果你得到一个 ace,将其推入一个数组,然后如果被破坏,则减少总和,从数组中删除一个 ace,并将其值改回 1。
  • 谢谢。手上有一张 A 的情况非常好,但如果有两张,我们会得到:A♠ A♥ 10♥ 25 应该是 1+1+10=12 而不是 1+14+10=25
  • 嗯。我没有看到为什么它不适用于两个 A 的任何原因。是否有一些您尚未发布的额外代码再次执行求和?
  • 此过程收到错误消息:无法设置指向 ace.value = 1 的未定义属性“值” Johanna: 8♠ A♣ A♥ 7♥ 17 我也有这些循环来启动发牌:------------- for (let i = 0; i while (this.dealedHandSum < player.stopAtValue) { this.dealCard() }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2019-08-13
  • 2022-01-14
  • 2012-05-22
  • 1970-01-01
相关资源
最近更新 更多