”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 我的第一个 Python 项目

我的第一个 Python 项目

发布于2024-11-04
浏览:228

My First Python Project

Blackjack 项目:编写和改进 Python 代码的初学者指南

欢迎来到我的二十一点项目!在本教程中,我将引导您完成使用 Python 开发基本二十一点游戏的过程,并向您展示如何通过多次迭代对代码进行增量改进。本教程非常适合希望通过从事有趣且引人入胜的项目来提高 Python 技能的初学者程序员。

您可以在 GitHub 上找到该项目的完整源代码。


目录

  • 二十一点游戏概述
  • 第 1 步:编写初始版本
  • 第 2 步:多次迭代中的代码改进
    • 重构干净的代码
    • 添加面向对象编程(OOP)
    • 实施错误处理
    • 改进用户界面
    • 测试和调试
  • 结论

二十一点游戏概述

Blackjack 是一种流行的纸牌游戏,其目标是让纸牌总数尽可能接近 21 点而不超过 21 点。玩家会收到两张牌,可以“打牌”(抽另一张牌)或“停牌”(保留当前手牌)。玩家与庄家竞争,在不超过 21 点的情况下获得更高的手牌值。

在这个项目中,我使用 Python 实现了 Blackjack 游戏的基本版本。游戏开始时向玩家和庄家发两张牌。玩家可以选择跟牌或停牌,一旦完成回合,庄家就开始玩。根据谁的手牌更接近 21 来确定获胜者。


第 1 步:编写初始版本

该项目的初始版本是二十一点游戏的简单程序实现。该版本专注于以最小的复杂性创建游戏逻辑。该代码使用函数和循环来管理游戏流程。

初始版本的关键方面:

  1. 基本游戏逻辑:我专注于让游戏的核心机制发挥作用,例如发牌、允许玩家击牌或停牌,以及检查输赢。
  2. 随机牌生成:使用Python的随机库洗牌,游戏将随机牌分配给玩家和庄家。
  3. 程序方法:在第一个版本中,游戏是用程序风格编写的,没有使用任何类或对象。

第 2 步:多次迭代中的代码改进

在基本版本运行之后,我开始多次迭代改进代码。以下是我如何使代码更干净、更高效、更易于维护。

重构干净的代码

我做的第一件事就是重构代码以使其更具可读性和可维护性。这包括:

  • 将大型功能分解为更小的、单一用途的功能。
  • 使用有意义的变量名称以增强可读性。
  • 删除任何冗余或重复的代码。

添加面向对象编程 (OOP)

重构之后,我意识到需要更好的结构,因此我重构了代码以使用面向对象编程(OOP)。这改进了组织并使将来更容易扩展游戏。

  • 我创建了一个 Deck 类来管理这副牌。
  • 我添加了一个 Player 类来代表玩家和庄家。
  • 游戏逻辑被移至 BlackjackGame 类中以封装游戏玩法。

实施错误处理

错误处理是使代码健壮的一个重要方面。我添加了检查来处理潜在的问题,例如:

  • 确保玩家输入有效(例如,不接受无效命令)。
  • 处理边缘情况,例如当牌组用完牌时会发生什么情况。

改进用户界面

我对用户界面进行了改进,以增强玩家体验。这包括:

  • 向玩家提供更清晰的反馈(例如,在每个动作后显示当前的牌和得分)。
  • 通过更好的输入提示和输出使游戏流程更加流畅。

测试与调试

最后,我通过玩多轮并识别任何错误或边缘情况来彻底测试游戏。我为分数计算和套牌管理等关键功能添加了一些单元测试,以确保它们按预期工作。


结论

通过多次迭代,我将这个二十一点游戏从基本的程序实现改进为结构良好的面向对象的程序。这些改进使代码更清晰,更易于维护,并且对于未来的功能更加灵活。

如果您是初学者,我鼓励您从编写自己的游戏版本开始,并通过重构和结合 OOP 概念逐步改进它。通过完成这个过程,您将获得编写 Python 代码并逐步改进它的宝贵经验。

您可以在 GitHub 上查看完整代码并立即开始构建您自己的版本!


编码愉快!

版本声明 本文转载于:https://dev.to/manxzo/my-first-python-project-455?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-04-27
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-04-27
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-27
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-04-27
  • Android如何向PHP服务器发送POST数据?
    Android如何向PHP服务器发送POST数据?
    在android apache httpclient(已弃用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    编程 发布于2025-04-27
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-26
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-26
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-04-26
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-04-26
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-04-26
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-04-26
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-04-26
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-04-26
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-04-26
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-26

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3