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

C# Visual Studio黑杰克游戏:如何阻止Dealer超21时重复弹窗?

解决黑杰克游戏重复弹窗的问题

嘿,我明白你遇到的问题了——当庄家(Dealer)得分超过21爆牌时,系统同时弹出“Dealer bust. Player wins”和“dealer wins”的消息框,这确实很闹心!

问题根源

你当前的代码里用了多个独立的if语句,这些语句会被依次执行,哪怕前面的条件已经满足。举个例子:如果DealerScore是22(爆牌),同时你的total(玩家得分)是15,那么:

  1. 第一个if (DealerScore > 21)成立,弹出玩家胜利的提示;
  2. 紧接着if (DealerScore > total)也成立(22>15),又弹出庄家胜利的提示。

这就是重复弹窗的核心原因——独立的if不会互相排斥,只要条件满足就会触发。

解决方案:用else if串联判断

我们需要把这些条件改成互斥的判断链,用else if连接,这样一旦某个条件满足,后面的判断就会被直接跳过,不会重复触发。修改后的代码如下:

private void BtnHold_Click(object sender, EventArgs e) {
    // declarations
    int DealerScore;
    Random randomizer = new Random();
    // get random dealer score (17-24)
    DealerScore = randomizer.Next(17, 25);
    // dealer scores blackjack
    if (DealerScore == 21) {
        MessageBox.Show("Dealer Scored blackjack");
    }
    // dealer busts (loses immediately)
    else if (DealerScore > 21) {
        MessageBox.Show("Dealer bust. Player wins");
    }
    // compare scores only if dealer didn't bust or get blackjack
    else if (DealerScore > total) {
        MessageBox.Show("dealer wins");
    }
    else if (total > DealerScore) {
        MessageBox.Show("Player wins");
    }
    else {
        // handle tie scenario (dealer and player have same score)
        MessageBox.Show("It's a tie!");
    }
    // display dealer's final score
    LblDealerScore.Text = DealerScore.ToString();
}

关键改动说明

  • 把原本独立的if换成else if,形成一个连贯的判断流程:先检查庄家是否拿到黑杰克,再检查是否爆牌,最后才比较双方得分;
  • 新增了else分支处理平局的情况(当庄家和玩家得分相同时),这也是黑杰克游戏里常见的场景;
  • 现在每个条件只会触发一次弹窗,彻底避免了逻辑冲突。

这样修改后,当庄家爆牌时,只会弹出“Dealer bust. Player wins”的提示,后面的得分比较判断不会再执行,完美解决重复弹窗的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:38