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(符合预期)
逻辑说明
- 先遍历卡牌,计算所有非A的分数,同时记录A的数量,彻底避免顺序对结果的影响。
- 处理A时,先按11加分,若总分超过21则自动调整为1分,确保最终总分是最接近21且不超过的最优值。
内容的提问来源于stack exchange,提问作者dj92
相关产品推荐
相关产品推荐

