Python实现21点游戏:面向对象编程实战
1. 为什么用Python实现Blackjack是个绝佳练习Blackjack21点作为赌场经典游戏规则简单却蕴含丰富策略恰好能全面覆盖面向对象编程的核心概念。我在教学过程中发现用Python实现这个游戏能同时锻炼以下关键能力类设计能力需要抽象出玩家、庄家、牌组、游戏规则等多个实体继承与多态不同角色如普通玩家与AI玩家可共享基础行为封装思想隐藏牌组洗牌、分数计算等实现细节异常处理处理玩家爆牌、无效输入等边界情况class Card: def __init__(self, suit, value): self.suit suit # 花色 self.value value # 牌面值 def get_numeric_value(self): if self.value in [J, Q, K]: return 10 elif self.value A: return 11 # 暂按11计算后续可调整 else: return int(self.value)关键提示Ace牌的特殊处理1或11是游戏策略的核心难点建议先统一按11计算后续在Hand类中实现动态调整2. 核心类结构设计与实现2.1 扑克牌的面向对象建模一套标准的Blackjack游戏需要以下核心类Card类表示单张扑克牌属性花色(suit)、面值(value)方法获取牌面数值(get_numeric_value)Deck类管理整副牌属性牌堆(cards)方法初始化牌组(initialize)、洗牌(shuffle)、发牌(deal)Hand类表示玩家手中的牌属性牌列表(cards)、是否庄家(is_dealer)方法加牌(add_card)、计算分数(calculate_score)、是否爆牌(is_busted)class Deck: suits [♥, ♦, ♣, ♠] values [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K] def __init__(self): self.cards [] self.initialize() def initialize(self): self.cards [Card(suit, value) for suit in self.suits for value in self.values] def shuffle(self): random.shuffle(self.cards) def deal(self): return self.cards.pop() if self.cards else None2.2 游戏流程的状态管理游戏主循环需要处理多个状态转换graph TD A[开始游戏] -- B[初始发牌] B -- C[玩家回合] C -- D{玩家选择} D --|要牌| E[发牌并检查] D --|停牌| F[庄家回合] E -- G{是否爆牌} G --|是| H[游戏结束] G --|否| C F -- I[庄家抽牌逻辑] I -- J{庄家是否继续} J --|是| I J --|否| K[结算胜负]注意实际代码中应避免使用全局状态变量建议用Game类封装游戏状态3. 核心算法实现细节3.1 分数计算的特殊处理Blackjack的分数计算有三大特殊规则Ace可计为1或11两张初始牌为A10/J/Q/K称为Blackjack庄家必须抽牌到17点以上class Hand: def calculate_score(self): score sum(card.get_numeric_value() for card in self.cards) ace_count sum(1 for card in self.cards if card.value A) while score 21 and ace_count: score - 10 # 将A从11转为1 ace_count - 1 return score def is_blackjack(self): return len(self.cards) 2 and self.calculate_score() 213.2 庄家自动决策逻辑庄家的行为由固定规则决定class Dealer(Player): def make_decision(self, deck): while self.hand.calculate_score() 17: self.hit(deck) if self.hand.is_busted(): break4. 完整游戏实现与扩展建议4.1 主游戏循环示例class BlackjackGame: def __init__(self): self.deck Deck() self.player Player() self.dealer Dealer() def start(self): self.deck.shuffle() # 初始发牌 self.player.hand.add_card(self.deck.deal()) self.dealer.hand.add_card(self.deck.deal()) self.player.hand.add_card(self.deck.deal()) self.dealer.hand.add_card(self.deck.deal()) # 玩家回合 while not self.player.hand.is_busted(): action input(要牌(h)或停牌(s)? ) if action.lower() h: self.player.hit(self.deck) print(f当前分数: {self.player.hand.calculate_score()}) else: break # 庄家回合 if not self.player.hand.is_busted(): self.dealer.make_decision(self.deck) # 结算 self.show_result()4.2 常见问题与调试技巧牌组耗尽问题在deal()方法中添加检查if not self.cards: self.initialize(); self.shuffle()输入验证while True: try: bet int(input(请输入下注金额: )) if 0 bet self.chips: break except ValueError: pass测试建议固定随机种子测试特定牌序random.seed(42)单元测试重点Ace计分逻辑、爆牌判断、Blackjack检测5. 项目扩展方向完成基础版本后可以考虑多玩家支持用列表管理多个Player实例下注系统添加Chips类管理筹码AI玩家实现基本策略表硬17点停牌等GUI界面使用Pygame或Tkinter网络对战通过socket实现多人游戏class AIPlayer(Player): BASIC_STRATEGY { (5,2): H, (5,3): H, ..., (20,10): S } def make_decision(self, dealer_up_card): player_score self.hand.calculate_score() dealer_value dealer_up_card.get_numeric_value() return self.BASIC_STRATEGY.get((player_score, dealer_value), S)我在实际开发中发现处理Ace牌的动态计分时最容易出现逻辑错误。建议单独编写测试用例验证以下场景手牌A5A应计为17手牌AAAA7应计为21手牌10ABlackjack与A10的区别处理

相关新闻

虚拟电厂与主从博弈:能源管理的动态定价优化

虚拟电厂与主从博弈:能源管理的动态定价优化

1. 虚拟电厂与主从博弈的能源革命去年参与某省级电网需求响应项目时,我第一次见识到虚拟电厂(Virtual Power Plant, VPP)的实际威力——通过聚合区域内237个分布式能源单元,在用电高峰时段提供了83MW的调节容量。这种打破传统&quo…

2026/8/3 7:41:29阅读更多 →
innovus dbget的用法

innovus dbget的用法

今天介绍一下innovus dbget的用法. common ui的get_db会相对简单很多,在此就不多加赘述了.• 获取设计中已经有的physical only cell的名字 dbGet [dbGet -p top.insts.isphysOnly 1].cell.name -u• 找到对应lib cell的数量 llength [dbGet top.insts.cell.name xxx]• 如果要…

2026/8/3 7:39:29阅读更多 →
HCL模拟器实战:从安装启动到网络配置的完整排错指南

HCL模拟器实战:从安装启动到网络配置的完整排错指南

1. 从“启动失败”到“丝滑运行”:一个网络工程师的HCL模拟器实战心路 如果你正在学习华三(H3C)的网络技术,或者需要搭建一个实验环境来验证配置,那么HCL模拟器几乎是你绕不开的工具。它不像思科的Packet Tracer那样“…

2026/8/3 7:39:29阅读更多 →
拆解DeepSeek V4-Flash:不改模型底座,靠后训练实现Agent能力跨越式提升

拆解DeepSeek V4-Flash:不改模型底座,靠后训练实现Agent能力跨越式提升

文章目录1. 就一行更新日志,怎么就炸圈了1.1 别人家开发布会,它家改日志1.2 轻量版反超旗舰,这剧情我只在武侠剧里见过2. 这次更新到底改了啥?说人话版2.1 底座参数全没动,只练了“干活的后半截”2.2 九项跑分全涨&…

2026/8/3 8:50:23阅读更多 →
Mybatis参数处理机制深度解析与最佳实践

Mybatis参数处理机制深度解析与最佳实践

1. Mybatis参数处理机制核心解析作为Java生态中最受欢迎的ORM框架之一,Mybatis的参数处理机制是其核心竞争力的重要组成部分。ParameterHandler接口作为四大核心接口之一(另外三个分别是Executor、StatementHandler和ResultSetHandler)&#…

2026/8/3 8:50:23阅读更多 →
终极Windows和Office激活指南:KMS_VL_ALL_AIO智能脚本完整教程

终极Windows和Office激活指南:KMS_VL_ALL_AIO智能脚本完整教程

终极Windows和Office激活指南:KMS_VL_ALL_AIO智能脚本完整教程 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗?KMS_VL_ALL_AIO智能激活脚…

2026/8/3 8:50:23阅读更多 →
C语言strtoul函数深度解析与应用实践

C语言strtoul函数深度解析与应用实践

1. 理解strtoul函数的基础定位strtoul这个看似简单的函数名,实际上包含了三个关键信息:"str"代表字符串,"to"代表转换,"ul"代表unsigned long类型。这个标准库函数在C语言中扮演着字符串到无符号长…

2026/8/3 8:50:23阅读更多 →
NBTExplorer:免费开源的Minecraft NBT数据编辑终极指南

NBTExplorer:免费开源的Minecraft NBT数据编辑终极指南

NBTExplorer:免费开源的Minecraft NBT数据编辑终极指南 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款专为Minecraft玩家和开发者设…

2026/8/3 8:50:23阅读更多 →
张雪峰事件揭示的中年危机与抗风险策略

张雪峰事件揭示的中年危机与抗风险策略

1. 从张雪峰事件看中年危机本质 2023年教育领域最富戏剧性的事件,莫过于知名考研导师张雪峰因"孩子报新闻学就打晕"的争议言论被推上风口浪尖。这个看似偶然的公共事件,实则折射出当代中年人面临的典型困境——在职业成就与社会期待的双重夹击…

2026/8/3 8:48:22阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/3 2:32:59阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/3 2:33:01阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/3 2:33:04阅读更多 →