You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Black Jack卡牌值求和函数计算异常问题求技术指导

BlackJack卡牌点数计算函数的顺序依赖问题修复

你的函数核心问题有两个:

  • A的判断逻辑错误:原代码中处理A时,判断条件getScore + cardValue > 21完全错误,getScore已经加了11,再加上cardValue(1)属于无意义的计算,应该直接判断加11后的总分是否超过21。
  • 顺序依赖缺陷:即时处理A的方式会被后续卡牌影响,比如先处理大点数卡牌再加A,会错误地把A从11改成1,但先加A再加大点数却能正确保留11,导致不同顺序结果不一致。

修复思路

正确的计算逻辑应该是先统计所有非A卡牌的总分,再统一处理A的分数——因为A可以是1或11,我们优先按11计算,若总分超过21,则逐个将A的分值从11改为1,直到总分≤21或没有A可调整。

修正后的代码

let score = function (cardObject) {
  let totalScore = 0;
  let aceCount = 0;

  // 第一步:计算非A卡牌分数,统计A的数量
  for (let card of cardObject) {
    const value = card.value;
    if (value >= 10 && value <= 13) {
      totalScore += 10;
    } else if (value >= 2 && value <= 9) {
      totalScore += value;
    } else if (value === 1) {
      aceCount++;
    }
  }

  // 第二步:统一处理A的分数
  for (let i = 0; i < aceCount; i++) {
    totalScore += 11;
    // 若总分超21,将当前A的分值从11改为1(减10)
    if (totalScore > 21) {
      totalScore -= 10;
    }
  }

  return totalScore;
}

// 测试验证
console.log(score([{ suit: 'HEARTS', value: 11 }, { suit: 'SPADES', value: 1 }])); // 输出21(符合预期)
console.log(score([{ suit: 'HEARTS', value: 1 }, { suit: 'SPADES', value: 11 }])); // 输出21(符合预期)
console.log(score([{ suit: 'HEARTS', value: 1 }, { suit: 'SPADES', value: 1 }, { suit: 'SPADES', value: 1 }, { suit: 'SPADES', value: 10 }])); // 输出13(符合预期)
console.log(score([{ suit: 'HEARTS', value: 10 }, { suit: 'SPADES', value: 1 }, { suit: 'SPADES', value: 1 }, { suit: 'SPADES', value: 1 }])); // 输出13(符合预期)

逻辑说明

  1. 先遍历卡牌,计算所有非A的分数,同时记录A的数量,彻底避免顺序对结果的影响。
  2. 处理A时,先按11加分,若总分超过21则自动调整为1分,确保最终总分是最接近21且不超过的最优值。

内容的提问来源于stack exchange,提问作者dj92

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:35:19