优化Python随机宝可梦遭遇系统:避免重复显示与代码重构

优化Python随机宝可梦遭遇系统:避免重复显示与代码重构

本文针对python中随机宝可梦遭遇系统出现的重复显示问题进行深入分析,揭示了硬编码和代码冗余带来的弊端。通过引入面向对象编程(oop)思想,设计`pokemon`类封装宝可梦属性,并利用数据驱动的方法构建`pokedex`数据结构,实现了代码的模块化、可维护性和可扩展性。最终提供了一个清晰、高效的解决方案,彻底消除了重复显示,并优化了整体代码结构。

随机宝可梦遭遇系统的问题分析

在开发一个随机宝可梦遭遇系统时,常见的挑战是如何高效且无误地根据随机数显示对应的宝可梦及其属性。原始代码中存在一个显著问题:无论随机到哪只宝可梦,”Pidgey”(波波)的信息总是会一同显示。

原始代码结构与缺陷

分析原始代码,其核心逻辑是通过一系列if/elif语句判断一个随机生成的数字variables.random_pokemon_counter,然后根据匹配的数字来设置对应的宝可梦信息并打印出来。

def random_pokemon_for_battle():    variables.random_pokemon_counter = random.randint(1, 6)    if variables.random_pokemon_counter == 1:        # ... Pidgey 相关的代码 ...        print("A wild Pidgey appeared!") # Pidgey 自己的显示        # ...    elif variables.random_pokemon_counter == 2:        # ... Weedle 相关的代码 ...        print("A wild Pidgey appeared!") # 错误地显示了 Pidgey        # ...    elif variables.random_pokemon_counter == 3:        # ... Pikachu 相关的代码 ...        print("A wild Pidgey appeared!") # 错误地显示了 Pidgey        # ... (其他 elif 分支类似)

主要问题点:

重复的打印语句: 在每一个elif分支中,除了打印当前随机到的宝可梦信息外,都错误地包含了一行 print(“A wild Pidgey appeared!”)。这是导致无论哪只宝可梦出现,波波都会被额外显示出来的直接原因。代码冗余: 每个宝可梦的属性(等级、HP、攻击、防御)的生成逻辑都是相同的,只是变量名不同(如variables.pidgey_level, variables.weedle_level)。这种重复的代码块使得维护和扩展变得困难。硬编码: 宝可梦的名称、音效文件路径以及它们的编号(1到6)都是硬编码在if/elif结构中的,这使得添加新的宝可梦或修改现有宝可梦信息时需要修改大量的代码。全局变量滥用: 大量使用variables.前缀的全局变量来存储宝可梦属性,这可能导致变量名冲突、代码可读性差以及状态管理混乱。

解决方案:面向对象与数据驱动设计

为了解决上述问题,我们可以采用面向对象编程(OOP)和数据驱动的设计模式。

立即学习“Python免费学习笔记(深入)”;

1. 定义 Pokemon 类

创建一个Pokemon类来封装每只宝可梦的属性和行为。这样,每只宝可梦都将是一个独立的Pokemon对象,拥有自己的名称、等级、生命值、攻击力、防御力及音效。

import randomimport winsound # 假设 winsound 模块用于播放声音# 假设 sounds 模块存在,并包含对应的音效文件路径# import sounds # 实际项目中需要根据文件结构导入# 示例:class MockSounds:    pidgey_sound = "pidgey.wav"    weedle_sound = "weedle.wav"    pikachu_sound = "pikachu.wav"    nidoran_male_sound = "nidoran_m.wav"    nidoran_female_sound = "nidoran_f.wav"    caterpie_sound = "caterpie.wav"sounds = MockSounds() # 在实际项目中替换为真实的 sounds 模块导入class Pokemon:    """    表示一只宝可梦的类,封装其名称、等级、生命值、攻击力、防御力及音效。    """    def __init__(self, name: str, sound_path: str):        self.name = name        self.level = random.randint(1, 10)        self.hp = 100        self.attack = random.randint(10, 25)        self.defense = random.randint(15, 35)        self.sound = sound_path    def play_sound(self):        """播放宝可梦的音效。"""        try:            winsound.PlaySound(self.sound, winsound.SND_FILENAME)        except Exception as e:            print(f"无法播放 {self.name} 的音效: {e}")    def display_info(self):        """显示宝可梦的遭遇信息和属性。"""        print(f"A wild {self.name} appeared!")        print(f"Level: {self.level}")        print(f"HP: {self.hp}")        print(f"Attack: {self.attack}")        print(f"Defense: {self.defense}")

2. 构建 pokedex 数据结构

使用一个列表来存储所有可遭遇宝可梦的基础数据。每个元素可以是一个元组或字典,包含宝可梦的名称和对应的音效文件路径。

pokedex_data = [    ("Pidgey", sounds.pidgey_sound),    ("Weedle", sounds.weedle_sound),    ("Pikachu", sounds.pikachu_sound),    ("Nidoran_M", sounds.nidoran_male_sound),    ("Nidoran_F", sounds.nidoran_female_sound),    ("Caterpie", sounds.caterpie_sound)]

这种数据结构使得添加、删除或修改宝可梦变得非常简单,只需修改pokedex_data列表即可,无需触碰核心逻辑代码。

3. 重构随机遭遇函数

利用random.choice()方法从pokedex_data中随机选择一个宝可梦的数据,然后用这些数据来实例化一个Pokemon对象。

def random_pokemon_for_battle() -> Pokemon:    """    随机生成一只宝可梦,播放其音效并显示其属性。    返回生成的 Pokemon 对象。    """    # 从 pokedex_data 中随机选择一个宝可梦的数据 (名称, 音效路径)    chosen_pokemon_data = random.choice(pokedex_data)    # 使用选中的数据创建 Pokemon 对象    # *chosen_pokemon_data 会将元组解包为 Pokemon 类的构造函数参数    poke = Pokemon(*chosen_pokemon_data)    # 播放音效    poke.play_sound()    # 显示宝可梦信息    poke.display_info()    return poke

完整代码示例

将以上组件整合,形成一个完整、优化后的随机宝可梦遭遇系统。

import randomimport winsound# 模拟 sounds 模块,实际项目中应根据文件结构导入class MockSounds:    pidgey_sound = "pidgey.wav"    weedle_sound = "weedle.wav"    pikachu_sound = "pikachu.wav"    nidoran_male_sound = "nidoran_m.wav"    nidoran_female_sound = "nidoran_f.wav"    caterpie_sound = "caterpie.wav"sounds = MockSounds()class Pokemon:    """    表示一只宝可梦的类,封装其名称、等级、生命值、攻击力、防御力及音效。    """    def __init__(self, name: str, sound_path: str):        self.name = name        self.level = random.randint(1, 10)        self.hp = 100        self.attack = random.randint(10, 25)        self.defense = random.randint(15, 35)        self.sound = sound_path    def play_sound(self):        """播放宝可梦的音效。"""        try:            winsound.PlaySound(self.sound, winsound.SND_FILENAME)        except Exception as e:            print(f"无法播放 {self.name} 的音效: {e}")    def display_info(self):        """显示宝可梦的遭遇信息和属性。"""        print(f"A wild {self.name} appeared!")        print(f"Level: {self.level}")        print(f"HP: {self.hp}")        print(f"Attack: {self.attack}")        print(f"Defense: {self.defense}")# 宝可梦数据列表pokedex_data = [    ("Pidgey", sounds.pidgey_sound),    ("Weedle", sounds.weedle_sound),    ("Pikachu", sounds.pikachu_sound),    ("Nidoran_M", sounds.nidoran_male_sound),    ("Nidoran_F", sounds.nidoran_female_sound),    ("Caterpie", sounds.caterpie_sound)]def random_pokemon_for_battle() -> Pokemon:    """    随机生成一只宝可梦,播放其音效并显示其属性。    返回生成的 Pokemon 对象。    """    chosen_pokemon_data = random.choice(pokedex_data)    poke = Pokemon(*chosen_pokemon_data)    poke.play_sound()    poke.display_info()    return poke# 示例调用print("--- 第一次遭遇 ---")encountered_pokemon_1 = random_pokemon_for_battle()print("n--- 第二次遭遇 ---")encountered_pokemon_2 = random_pokemon_for_battle()

可能的输出:

--- 第一次遭遇 ---无法播放 Pidgey 的音效: [WinError 2] 系统找不到指定的文件。A wild Pidgey appeared!Level: 7HP: 100Attack: 15Defense: 28--- 第二次遭遇 ---无法播放 Caterpie 的音效: [WinError 2] 系统找不到指定的文件。A wild Caterpie appeared!Level: 3HP: 100Attack: 22Defense: 19

(注:winsound模块在没有对应.wav文件时会报错,此处为了演示,已在play_sound中添加了错误处理。)

总结与注意事项

通过引入Pokemon类和pokedex_data列表,我们实现了以下改进:

消除重复显示: 每个宝可梦的信息打印都由其自身的display_info方法负责,确保只显示当前遭遇的宝可梦。代码去重: 宝可梦属性的生成逻辑被封装在Pokemon类的构造函数中,避免了冗余的if/elif分支代码。提高可维护性: 增加或修改宝可梦信息只需修改pokedex_data列表,无需改动函数逻辑。增强可读性: 代码结构更清晰,每个部分职责明确。更好的扩展性: 未来可以轻松添加更多宝可梦,甚至从外部文件(如JSON, CSV)加载pokedex_data,实现更灵活的数据管理。

注意事项:

音效文件: 确保sounds模块中引用的.wav文件实际存在于项目的正确路径中,否则winsound.PlaySound会抛出FileNotFoundError。在生产环境中,应加入更健壮的错误处理机制。数据源: 对于大型游戏项目,建议将pokedex_data存储在外部配置文件(如JSON、YAML或数据库)中,而不是硬编码在Python脚本里。这样可以实现数据的动态加载和独立更新。变量作用域 避免在函数内部使用全局变量来存储临时状态,如原始代码中的variables.random_pokemon_counter和variables.random_pokemon_encounter。通过函数返回值或对象属性来管理状态是更推荐的做法。

这种面向对象和数据驱动的重构方法不仅解决了特定的显示问题,更从根本上提升了代码质量,使其更符合现代软件开发的最佳实践。

以上就是优化Python随机宝可梦遭遇系统:避免重复显示与代码重构的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1379906.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 21:03:19
下一篇 2025年12月14日 21:03:37

相关推荐

  • 如何解决本地图片在使用 mask JS 库时出现的跨域错误?

    如何跨越localhost使用本地图片? 问题: 在本地使用mask js库时,引入本地图片会报跨域错误。 解决方案: 要解决此问题,需要使用本地服务器启动文件,以http或https协议访问图片,而不是使用file://协议。例如: python -m http.server 8000 然后,可以…

    2025年12月24日
    200
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • 您不需要 CSS 预处理器

    原生 css 在最近几个月/几年里取得了长足的进步。在这篇文章中,我将回顾人们使用 sass、less 和 stylus 等 css 预处理器的主要原因,并向您展示如何使用原生 css 完成这些相同的事情。 分隔文件 分离文件是人们使用预处理器的主要原因之一。尽管您已经能够将另一个文件导入到 css…

    2025年12月24日
    000
  • React 嵌套组件中,CSS 样式会互相影响吗?

    react 嵌套组件 css 穿透影响 在 react 中,嵌套组件的 css 样式是否会相互影响,取决于采用的 css 解决方案。 传统 css 如果使用传统的 css,在嵌套组件中定义的样式可能会穿透影响到父组件。例如,在给出的代码中: 立即学习“前端免费学习笔记(深入)”; component…

    2025年12月24日
    000
  • React 嵌套组件中父组件 CSS 修饰会影响子组件样式吗?

    对嵌套组件的 CSS 修饰是否影响子组件样式 提问: 在 React 中,如果对嵌套组件 ComponentA 配置 CSS 修饰,是否会影响到其子组件 ComponentB 的样式?ComponentA 是由 HTML 元素(如 div)组成的。 回答: 立即学习“前端免费学习笔记(深入)”; 在…

    2025年12月24日
    000
  • 什么是功能类优先的 CSS 框架?

    理解功能类优先 tailwind css 是一款功能类优先的 css 框架,用户可以通过组合功能类轻松构建设计。为了理解功能类优先,我们首先要区分语义类和功能类这两种 css 类名命名方式。 语义类 以前比较常见的 css 命名方式是根据页面中模块的功能来命名。例如: 立即学习“前端免费学习笔记(深…

    2025年12月24日
    000
  • 正则表达式在文本验证中的常见问题有哪些?

    正则表达式助力文本输入验证 在文本输入框的验证中,经常遇到需要限定输入内容的情况。例如,输入框只能输入整数,第一位可以为负号。对于不会使用正则表达式的人来说,这可能是个难题。下面我们将提供三种正则表达式,分别满足不同的验证要求。 1. 可选负号,任意数量数字 如果输入框中允许第一位为负号,后面可输入…

    2025年12月24日
    000
  • SCSS – 增强您的 CSS 工作流程

    在本文中,我们将探索 scss (sassy css),这是一个 css 预处理器,它通过允许变量、嵌套规则、mixins、函数等来扩展 css 的功能。 scss 使 css 的编写和维护变得更加容易,尤其是对于大型项目。 1.什么是scss? scss 是 sass(syntropically …

    2025年12月24日
    000
  • 在 React 项目中实现 CSS 模块

    react 中的 css 模块是一种通过自动生成唯一的类名来确定 css 范围的方法。这可以防止大型应用程序中的类名冲突并允许模块化样式。以下是在 react 项目中使用 css 模块的方法: 1. 设置 默认情况下,react 支持 css 模块。你只需要用扩展名 .module.css 命名你的…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 姜戈顺风

    本教程演示如何在新项目中从头开始配置 django 和 tailwindcss。 django 设置 创建一个名为 .venv 的新虚拟环境。 # windows$ python -m venv .venv$ .venvscriptsactivate.ps1(.venv) $# macos/linu…

    2025年12月24日
    000
  • css3选择器优化技巧

    CSS3 选择器优化技巧可提升网页性能:减少选择器层级,提高浏览器解析效率。避免通配符选择器,减少性能损耗。优先使用 ID 选择器,快速定位目标元素。用类选择器代替标签选择器,精确匹配。使用属性选择器,增强匹配精度。巧用伪类和伪元素,提升性能。组合多个选择器,简化代码。利用 CSS 预处理器,增强代…

    2025年12月24日
    300
  • 花 $o 学习这些编程语言或免费

    → Python → JavaScript → Java → C# → 红宝石 → 斯威夫特 → 科特林 → C++ → PHP → 出发 → R → 打字稿 []https://x.com/e_opore/status/1811567830594388315?t=_j4nncuiy2wfbm7ic…

    2025年12月24日
    000
  • action在css中的用法

    CSS 中 action 关键字用于定义鼠标悬停或激活元素时的行为,语法:element:action { style-property: value; }。它可以应用于 :hover 和 :active 伪类,用于创建交互效果,如更改元素外观、显示隐藏元素或启动动画。 action 在 CSS 中…

    2025年12月24日
    000
  • css规则的类型有哪些

    CSS 规则包括:通用规则:选择所有元素类型选择器:根据元素类型选择元素类选择器:根据元素的 class 属性选择元素ID 选择器:根据元素的 id 属性选择元素(唯一)后代选择器:选择特定父元素内的元素子选择器:选择作为特定父元素的直接子元素的元素伪类:基于元素的状态或特性选择元素伪元素:创建元素…

    2025年12月24日
    000
  • css代码规范有哪些

    CSS 代码规范对于保持一致性、可读性和可维护性至关重要,常见的规范包括:命名约定:使用小写字母和短划线,命名特定且描述性。缩进和对齐:按特定规则缩进、对齐选择器、声明和值。属性和值顺序:遵循特定顺序排列属性和值。注释:解释复杂代码,并使用正确的语法。分号:每个声明后添加分号。大括号:左大括号前换行…

    2025年12月24日
    200
  • 深入理解CSS框架与JS之间的关系

    深入理解CSS框架与JS之间的关系 在现代web开发中,CSS框架和JavaScript (JS) 是两个常用的工具。CSS框架通过提供一系列样式和布局选项,可以帮助我们快速构建美观的网页。而JS则提供了一套功能强大的脚本语言,可以为网页添加交互和动态效果。本文将深入探讨CSS框架和JS之间的关系,…

    2025年12月24日
    000
  • HTML+CSS+JS实现雪花飘扬(代码分享)

    使用html+css+js如何实现下雪特效?下面本篇文章给大家分享一个html+css+js实现雪花飘扬的示例,希望对大家有所帮助。 很多南方的小伙伴可能没怎么见过或者从来没见过下雪,今天我给大家带来一个小Demo,模拟了下雪场景,首先让我们看一下运行效果 可以点击看看在线运行:http://hai…

    2025年12月24日 好文分享
    500
  • 10款好看且实用的文字动画特效,让你的页面更吸引人!

    图片和文字是网页不可缺少的组成部分,图片运用得当可以让网页变得生动,但普通的文字不行。那么就可以给文字添加一些样式,实现一下好看的文字效果,让页面变得更交互,更吸引人。下面创想鸟就来给大家分享10款文字动画特效,好看且实用,快来收藏吧! 1、网页玻璃文字动画特效 模板简介:使用css3制作网页渐变底…

    2025年12月24日 好文分享
    000
  • tp5如何引入css文件

    tp5引入css文件的方法:1、将css文件放在public目录下的static文件里即可;2、在页面引入中写上“”语句即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 其实很简单,只需要将css,js,image文件放在这个目录下即可 页…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信