C# Visual Studio黑杰克游戏:如何阻止Dealer超21时重复弹窗?
解决黑杰克游戏重复弹窗的问题
嘿,我明白你遇到的问题了——当庄家(Dealer)得分超过21爆牌时,系统同时弹出“Dealer bust. Player wins”和“dealer wins”的消息框,这确实很闹心!
问题根源
你当前的代码里用了多个独立的if语句,这些语句会被依次执行,哪怕前面的条件已经满足。举个例子:如果DealerScore是22(爆牌),同时你的total(玩家得分)是15,那么:
- 第一个
if (DealerScore > 21)成立,弹出玩家胜利的提示; - 紧接着
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
相关产品推荐
相关产品推荐

