用 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 的职责就很清晰了:既展示胜负卡片,也把双方点数交代清楚。

三、运行测试:验证点数输出
保存代码后运行一局。这一局结束时终端输出如下:
- 玩家点数是 20
- 庄家点数是 23
- 庄家爆掉了,玩家赢
可以看到,点数被正确打印出来,而且和胜负判定是一致的——庄家 23 点超过 21 点爆牌,玩家 20 点胜出。到这里,显示点数的功能就验证通过了。

四、别忘了把测试做全
功能跑通不代表没有 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 实战课程」。
查看课程详情