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

我的第一个 Python 项目

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

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]删除
最新教程 更多>
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符在postgresql中提取最后一行,您可能需要遇到与数据集合中每个不同标识的信息相关的信息。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: id dat...
    编程 发布于2025-04-05
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-05
  • 如何在Java的全屏独家模式下处理用户输入?
    如何在Java的全屏独家模式下处理用户输入?
    Handling User Input in Full Screen Exclusive Mode in JavaIntroductionWhen running a Java application in full screen exclusive mode, the usual event ha...
    编程 发布于2025-04-05
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    在Microsoft Visual C 中,Microsoft consions用户strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    编程 发布于2025-04-05
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-05
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-05
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-04-05
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php PHP陷入困境。使用simplexmlelement :: attributes()函数提供了简单的解决方案。此函数可访问对XML元素作为关联数组的属性: - > attributes()为$ attributeName => $ attributeValue){ echo ...
    编程 发布于2025-04-05
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-04-05
  • 为什么使用Firefox后退按钮时JavaScript执行停止?
    为什么使用Firefox后退按钮时JavaScript执行停止?
    导航历史记录问题:JavaScript使用Firefox Back Back 此行为是由浏览器缓存JavaScript资源引起的。要解决此问题并确保在后续页面访问中执行脚本,Firefox用户应设置一个空功能。 警报'); }; alert('inline Alert')...
    编程 发布于2025-04-05
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能显示图像时未能显示图像时遇到了一个问题。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-05
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-05
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-05
  • 为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    为什么在我的Linux服务器上安装Archive_Zip后,我找不到“ class \” class \'ziparchive \'错误?
    Class 'ZipArchive' Not Found Error While Installing Archive_Zip on Linux ServerSymptom:When attempting to run a script that utilizes the ZipAr...
    编程 发布于2025-04-05
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-05

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

Copyright© 2022 湘ICP备2022001581号-3