Blackjack JavaScript程序问题:庄家发牌超2张的解决求助
问题原因与解决方案
问题根源
你代码里的庄家多牌问题,是因为startGame函数里的while (dealerSum < 13)循环——这个逻辑在游戏开局时就自动给庄家补牌,直到牌面总和≥13,完全跳过了“庄家开局只持2张牌,补牌仅在玩家完成操作后进行”的规则。
修复步骤
- 移除开局自动补牌逻辑:删掉
startGame里的while循环,开局只给庄家发2张牌(1张暗牌+1张明牌)。 - 将庄家补牌逻辑移至
stay函数:玩家点击“stay”后,再让庄家按照规则补牌(通常是总和<17时补牌)。
修改后的关键代码
1. 修改startGame函数
function startGame() { hidden = deck.pop(); dealerSum += getValue(hidden); dealerAceCount += checkAce(hidden); // 给庄家发第一张明牌(现在庄家共2张牌:暗牌+明牌) let cardImg = document.createElement("img"); let card = deck.pop(); cardImg.src = "./cards/" + card + ".png"; dealerSum += getValue(card); dealerAceCount += checkAce(card); document.getElementById("dealer-cards").append(cardImg); console.log(dealerSum) // 玩家发牌逻辑保持不变 for (let i = 0; i < 2; i++) { let cardImg = document.createElement("img"); let card = deck.pop(); cardImg.src = "./cards/" + card + ".png"; yourSum += getValue(card); yourAceCount += checkAce(card); document.getElementById("your-cards").append(cardImg); } console.log(yourSum); document.getElementById("refresh").addEventListener("click", refresh); document.getElementById("hit").addEventListener("click", hit); document.getElementById("stay").addEventListener("click", stay); }
2. 修改stay函数,添加庄家补牌逻辑
function stay() { canHit = false; document.getElementById("hidden").src = "./cards/" + hidden + ".png"; // 庄家补牌逻辑:总和<17时继续补牌(可根据需求调整阈值) dealerSum = reduceAce(dealerSum, dealerAceCount); while (dealerSum < 17) { let cardImg = document.createElement("img"); let card = deck.pop(); cardImg.src = "./cards/" + card + ".png"; dealerSum += getValue(card); dealerAceCount += checkAce(card); document.getElementById("dealer-cards").append(cardImg); // 每次补牌后重新计算A的数值,防止爆牌 dealerSum = reduceAce(dealerSum, dealerAceCount); } // 玩家牌面处理与胜负判断保持不变 yourSum = reduceAce(yourSum, yourAceCount); let message = ""; if (yourSum > 21) { message = "You lose! Better luck next time. Refresh to try again!" } else if (dealerSum > 21) { message = "You win! Refresh to play again!" } else if (yourSum == dealerSum) { message = "Tie! Refresh to play again!"; } else if (yourSum > dealerSum) { message = "You win! Refresh to play again!"; } else if (yourSum < dealerSum) { message = "You lose! Better luck next time. Refresh to play again!"; } document.getElementById("dealer-sum").innerText = dealerSum; document.getElementById("your-sum").innerText = yourSum; document.getElementById("result").innerText = message; }
额外说明
- 标准Blackjack规则中,庄家的补牌阈值是总和<17,你可以根据需求调整这个数值(比如改回13),但一定要确保补牌逻辑在玩家点击stay后执行。
- 每次补牌后调用
reduceAce是为了自动调整A的数值(11转1),避免庄家牌面超过21却没处理A的情况。
内容的提问来源于stack exchange,提问作者redmushroomrocket
相关产品推荐
相关产品推荐

