讲师中心 微信公众号
AI工具推荐 视频效率加速

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

冬强酱_3520

冬强酱_3520

发布时间:2025-11-13 16:39:09

|

465人浏览过

|

来源于php中文网

原创

优化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 分支类似)

主要问题点:

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

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

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

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

1. 定义 Pokemon 类

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

import random
import 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列表即可,无需触碰核心逻辑代码。

jm-jsjkxyjs02-pzl-803
jm-jsjkxyjs02-pzl-803

查询全球任意城市的实时天气和未来天气预报

下载

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 random
import 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: 7
HP: 100
Attack: 15
Defense: 28

--- 第二次遭遇 ---
无法播放 Caterpie 的音效: [WinError 2] 系统找不到指定的文件。
A wild Caterpie appeared!
Level: 3
HP: 100
Attack: 22
Defense: 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。通过函数返回值或对象属性来管理状态是更推荐的做法。

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

1955

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2562

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

896

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2879

2025.09.10

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2240

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

229

2026.02.03

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

5015

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

282

2025.11.27

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn