跳到主要内容

用 Python 实现 21 点游戏:显示点数与整体逻辑收尾

在前面几篇里,我们已经把 21 点游戏的核心流程搭起来了:发牌、要牌、判断胜负都能跑通。但有个小麻烦——每次结束都得自己心算点数。这篇我们就把「点数显示」补上,并顺带梳理一下整个项目的类结构,方便你后续继续扩展。

一、目标:让程序自己报点数​

当前 show_result 只负责把结果卡片打印出来,玩家和庄家各自是多少点,全靠人脑算。我们要做的是:在展示结果的同时,把双方的最终点数一并打印出来,省去手动计算。

二、代码实现:在 show_result 中输出点数​

打开 Game 类里的 show_result 方法,在原有卡片内容输出之后,追加两行打印。

先输出玩家点数,取的是玩家手牌对象 self.player_hand,调用它的 get_value() 拿到总点数:

print("玩家点数是", self.player_hand.get_value())

同理,紧接着输出庄家点数,对象换成 self.dealer_hand:

print("庄家点数是", self.dealer_hand.get_value())

改完后 show_result 的职责就很清晰了:既展示胜负卡片,也把双方点数交代清楚。

在 show_result 方法中追加打印玩家点数和庄家点数的代码

三、运行测试:验证点数输出​

保存代码后运行一局。这一局结束时终端输出如下:

  • 玩家点数是 20
  • 庄家点数是 23
  • 庄家爆掉了,玩家赢

可以看到,点数被正确打印出来,而且和胜负判定是一致的——庄家 23 点超过 21 点爆牌,玩家 20 点胜出。到这里,显示点数的功能就验证通过了。

运行后终端显示玩家点数20、庄家点数23,庄家爆牌玩家赢

四、别忘了把测试做全​

功能跑通不代表没有 bug。字幕里特别提醒:每一种点数情况都要测到,包括庄家爆掉、玩家爆掉、双方都不爆比大小等分支。写代码时很容易漏掉某些边界情况,只有逐个场景跑一遍,才能把隐藏问题揪出来。

五、整体逻辑回顾与代码拆分建议​

至此,21 点的主体逻辑已经完整。回看整个项目,结构是这样一层层搭起来的:

类职责
Card一张牌
Deck一副牌
Hand手牌(玩家或庄家通用)
Game总逻辑,调用以上各类

入口处定义一个 Game 类实例,调用它的 play 方法,play 内部再实例化并组合其他类。

不过现在所有类都堆在一个文件里,一百多行看着有点长。建议把和牌相关的类(Card、Deck、Hand)提取到单独模块,主文件里用 import 导入,只保留 Game 类。这样代码更清爽,后续维护也方便。

小结​

  • 在 show_result 中调用 get_value() 打印双方点数,免去手动计算;
  • 运行验证:玩家 20 点、庄家 23 点爆牌,玩家获胜,输出与判定一致;
  • 测试要覆盖爆牌、比大小等各种分支,避免遗漏 bug;
  • 项目类结构为 Card → Deck → Hand → Game,建议按职责拆分成多文件。

下一步,如果你想把这个命令行版本变成带界面的小游戏,可以继续学习 Pygame,或者用 PyQt/PySide 做出可视化的牌桌效果。

课程推荐

想系统学习这门课程?

你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。

查看课程详情