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

Blackjack JavaScript程序问题:庄家发牌超2张的解决求助

问题原因与解决方案

问题根源

你代码里的庄家多牌问题,是因为startGame函数里的while (dealerSum < 13)循环——这个逻辑在游戏开局时就自动给庄家补牌,直到牌面总和≥13,完全跳过了“庄家开局只持2张牌,补牌仅在玩家完成操作后进行”的规则。

修复步骤

  1. 移除开局自动补牌逻辑:删掉startGame里的while循环,开局只给庄家发2张牌(1张暗牌+1张明牌)。
  2. 将庄家补牌逻辑移至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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:15:43