用面向对象实现 21 点游戏:从规则到代码
21 点(Blackjack)是练习面向对象编程的经典小项目:有明确的实体(牌、牌堆、玩家、庄家)、有清晰的状态(点数、是否爆牌)和流程(发牌、要牌、停牌、比大小)。

本文先用一个带界面的版本演示游戏规则,再带你用面向对象的方式把核心逻辑写出来。界面部分后续用 pygame 套壳即可,本文聚焦逻辑本身。
一、先搞清楚 21 点怎么玩
视频里演示的是一个 pygame 做的图形界面版本,操作流程如下:
- 点击出牌,庄家(dealer)发两张牌,其中一张是暗牌(隐藏);玩家发两张牌,全部明牌展示。
- 玩家有两个选择:
- hit:继续要牌;
- stand:停牌,结束本局并比大小。
- 点数规则:
- 2~10 按牌面数值计算;
- J、Q、K 都算 10 点;
- A 比较特殊:既可以当 1 点,也可以当 11 点,需要根据手牌情况自动选择不会爆牌的那种。
演示中出现的几种典型局面:
- 玩家拿到 K + Q,共 20 点,直接 stand,庄家亮牌后点数更小,玩家赢;
- 玩家 6 + 9 = 15 点,hit 一张后正好 20 点,stand 后赢下庄家的 3 + 6;
- 玩家 14 点继续 hit,来了一张 9,超过 21 点直接爆牌,判负;
- 手牌中出现 A 时,程序会自动判断:如果按 11 算会超过 21 点,就按 1 算。


规则理清之后,就可以开始写代码了。整体思路是:先用面向对象把游戏流程和逻辑实现出来,最后再套一层 pygame 的壳,就能得到上面演示的效果。
五、小结
- 21 点的规则要点:J/Q/K 记 10 点,A 可记 1 或 11 点,超过 21 点即爆牌。
- 面向对象拆分的关键是职责清晰:
Card管单张牌数值,Hand管计点(含 A 的降级处理),Deck管洗牌发牌,Player/Dealer管各自行为,Game管流程与胜负判定。 - 先实现并测试纯逻辑,再套 GUI 外壳,是这类小游戏推荐的开发顺序。
想系统学习这门课程?
你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。
查看课程详情