当前位置: 首页 > news >正文

《Python程序设计》实验四实验报告

20254318 2025-2026-2 《Python程序设计》实验四实验报告

课程:《Python程序设计》
班级: 2543
姓名: 李观其
学号: 20254318
实验教师:王志强
实验日期:2026年6月12日
必修/选修:公选课

1. 实验内容

(1)选择游戏开发方向,基于韩国回合制游戏《边狱巴士》的战斗规则,设计并实现一款回合制战斗模拟系统;
(2)系统需完整模拟硬币拼点、技能释放、多种状态效果(烧伤、流血、破裂、沉沦、呼吸法等),支持罪人(Sinner)与敌人(Enemy)单位,拥有独立的属性、抗性、混乱阈值;
(3)提供命令行交互界面,用户可为每个行动槽选择技能和目标,并可切换防御或EGO技能;
(4)程序代码托管到码云;
(5)重点实践Python面向对象编程中的抽象类(ABC)、继承、多态、组合等机制,并与C语言数据结构(结构体+函数指针)进行对比学习;
(6)分析关键代码的功能和使用方法,重点说明抽象类与多态的设计价值;
(7)总结生成程序的优点,特别是对于有C语言基础的学习者的提升作用;
(8)给出运行过程和结果截图;
(9)程序代码托管到码云。

2. 实验过程及结果

2.1 游戏整体架构设计(要求1)

2.1.1 关键代码

本系统采用分层模块化设计,核心模块包括枚举定义、状态效果、硬币与技能、单位与行动槽、战斗管理器、显示接口等。以下重点展示体现面向对象抽象特性的关键代码。

(1)抽象基类(ABC)定义显示接口
from abc import ABC, abstractmethod
class BattleDisplay(ABC):
@abstractmethod
def battle_start(self): pass
@abstractmethod
def choose_slot(self, slots, selected): pass
@abstractmethod
def choose_skill(self, slot): pass
@abstractmethod
def choose_target(self, enemies): pass
@abstractmethod
def coin_toss(self, coin, original_power, coin_power, final_power): pass
@abstractmethod
def battle_end(self, success): pass

该抽象类强制所有子类实现上述方法,确保战斗管理器可以统一调用,而不依赖具体显示方式(命令行或图形)。这与C语言中通过结构体包含函数指针来实现接口规范的做法类似,但Python的ABC提供了编译期检查和更清晰的契约。

(2)状态效果体系(继承与多态)
class StatusEffect:
def init(self, owner, name, count, potency):
self.owner = owner; self.potency = potency; self.count = count
def turn_start(self): pass
def coin_toss(self): pass
def hit_taken(self, attacker): pass
def attack_coin(self): return 1.0, False
def turn_end(self): pass
def is_expired(self): return self.count <= 0

class Burn(StatusEffect):
def turn_start(self):
if self.count > 0:
self.owner.take_direct_damage(self.potency, SinType.NONE, 0)
self.decrease_count()

class Bleed(StatusEffect):
def coin_toss(self):
if self.count > 0:
self.owner.take_direct_damage(self.potency, SinType.NONE, 0)
self.decrease_count()

每个子类只重写自己关心的生命周期方法,基类提供空实现。在Unit的turn_start等方法中遍历status_effects并调用相应方法,无需判断具体类型,由Python动态分派执行正确的重写版本。对比C语言,若用结构体+函数指针实现,需要为每个状态定义独立的处理函数并手动赋值,维护和扩展成本更高。

(3)组合与封装(Unit类)
class Unit:
def init(self, name, level, hp, ...):
self.status_effects = []
self.action_slots = []
# ...
def take_damage(self, attacker, ...):
# 计算伤害并调用 hit_taken
self.hit_taken(attacker)
def hit_taken(self, attacker):
for status in self.status_effects:
status.hit_taken(attacker)

Unit通过组合包含多个状态对象和行动槽对象,这种“有一个”的关系比继承更灵活,便于动态增删。在C语言中,需要用链表或数组管理这些子对象,并手动遍历调用函数指针,而Python的列表和迭代器简化了操作。

(4)策略模式(Pattern抽象类)
class Pattern(ABC):
@abstractmethod
def choose_skill(self) -> Skill: pass
def choose_target(self, alive_sinner_slots): return None

不同敌人可继承实现不同AI策略,算法被封装在独立类中,可互相替换,体现了策略模式。C语言中可通过函数指针数组实现类似功能,但缺乏类型安全。

2.1.2 运行结果

(截图略,实际运行时命令行输出每一步的拼点过程、伤害计算、状态触发,交互流畅。)
image

2.1.3 提交到gitee

项目已托管至码云,地址:https://gitee.com/romebody/limbus_combat_sim

代码托管截图

2.2 面向对象特性的学习与实践(要求2)

本次实验重点在于通过游戏逻辑理解Python面向对象的高级特性,尤其针对已有C语言数据结构基础的学习者,对比两种语言的设计差异。

2.2.1 关键代码功能及使用方法

(1)抽象类(ABC)与接口设计
用法:定义BattleDisplay抽象类,要求所有显示子类实现规定方法。BattleManager仅依赖该抽象类型,运行时注入具体子类(如TextDisplay),实现解耦。
学习价值:C语言中通常用“函数指针结构体”模拟接口,但需手动维护,而Python的ABC在类定义时强制检查,减少了运行时错误。

(2)继承与多态——状态效果
用法:所有状态继承自StatusEffect,仅重写需要的方法。Unit统一调用,无需关心具体状态类型。
C语言对比:若用结构体,需在结构体中包含类型标识和多个函数指针,并在处理函数中用switch-case判断类型,增加新状态需修改多处代码。Python的多态让扩展新状态只需新增子类,符合开闭原则。

(3)组合与封装
用法:Unit包含状态列表和行动槽列表,通过公开方法操作内部状态,外部无法直接修改血量等关键属性。
C语言对比:结构体成员默认公开,需依赖编程规范控制访问,Python的封装(私有属性约定)更易实施。

(4)策略模式——Pattern
用法:定义敌人AI抽象,不同敌人实现不同选技能和目标逻辑。战斗管理器调用接口,无需关心具体策略。
学习价值:将算法与上下文分离,提高代码复用性和可测试性。

3. 实验过程中遇到的问题和解决过程

  1. 拼点平局处理:初始未考虑双方威力相等的情况,导致while循环无法退出。解决:增加平局分支(返回0),双方均不折断硬币,并设置最大拼点次数防止死循环。
  2. 状态遍历删除异常:在遍历status_effects列表时直接删除当前元素,导致漏处理或索引错误。解决:使用切片副本for status in self.status_effects[:]:遍历,循环结束后统一清理过期状态。
  3. 动态导入关卡文件路径问题:importlib加载外部模块时,文件路径含中文或特殊字符导致失败。解决:使用Path对象规范化路径,并确保sys.modules中模块名唯一。
  4. 抽象方法未实现的运行时错误:初始未用@abstractmethod装饰,子类忘记重写时只触发NotImplementedError。解决:显式继承ABC并使用@abstractmethod,让Python在实例化时立即检查,提前暴露问题。

4. 其他(感悟、思考等)

通过本次综合实践,我深刻体会到Python作为高级语言在建模复杂现实问题时的便利性。相较于C语言需要手动管理内存和函数指针,Python的类和继承机制让代码结构更加清晰,逻辑更加贴近人类思维。尤其在实现状态效果体系时,每个状态作为一个独立类,新增效果无需修改已有代码,这让我切实理解了“开闭原则”和“多态”的价值。同时,抽象基类的使用让我意识到接口设计是大型项目协作的关键,通过定义清晰的抽象方法,团队不同成员可以并行开发不同模块。本次实验不仅提升了我的Python编程能力,更让我从宏观上理解了面向对象分析与设计的方法论,为后续学习设计模式、软件工程乃至游戏开发奠定了坚实基础。

5. 参考资料

  • romebody的仓库地址
  • https://limbuscompany.huijiwiki.com/
http://www.zskr.cn/news/1538023.html

相关文章:

  • 约瑟夫环的面向对象实现:用Circle、Person与Rule重构经典问题
  • OpenCore Legacy Patcher完整教程:4步让老旧Mac完美运行最新macOS
  • 2026沈阳搬家怎么选?5家专业机构并列实测推荐 - 幸福生活序曲
  • 中山二手手机哪家强?2026年推荐榜top7实践经验分享 - 资讯快报
  • 2026 成都靠谱的本地装修公司,成都十大本土家装品牌榜单 - 推荐官
  • 2026 南京市全域屋面防水 / SBS 卷材防水 / 彩钢瓦防腐翻新正规企业排行榜|5 家合规单位精选 + 本地避坑全攻略 - 资讯快报
  • Llama4 Maverick与Scout:多模态大模型的场景化架构分叉解析
  • 深度拆解津达线缆:从铜材加工到十年质保的全产业链实力盘点 - 资讯快报
  • 2026 福州老房卫生间渗水如何修复?调研 5 家靠谱本地防水施工单位优缺点 - 防水资讯
  • MetaWeblog API 发布测试2
  • 2026宁波八家优选留学中介综合排名,哪家更胜一筹 - 资讯快报
  • 噪声处理公司哪家好 - 资讯快报
  • 济南哪家网络公司做豆包搜索排名优化技术好|这两家公司适配豆包算法、内容原创合规优化 - 资讯快报
  • 2026年6月佛山装修公司权威综合实力 TOP5 榜单 - 广东科技观察
  • 偏导数
  • ASP.NET Core项目开发实战:从场景到落地
  • Mysql:实用工具:解密【.mylogin.cnf】的python小工具
  • PostgreSQL 技术日报 (6月16日)|Neon 自动化再进一步,逻辑复制冲突日志迎来 v50 更新
  • 京东 E 卡回收流程完整攻略|正规礼品卡回收平台推荐 + 避坑干货 - 资讯快报
  • 2026年6月最新天梭中国官方售后电话地址服务热线客服网点 - 资讯快报
  • 2026武汉空调维修-中央空调维修加氟安装正规服务商推荐( 全武汉可上门)-修乐家 - 资讯快报
  • 2026南昌高净值人群离婚财产纠纷解决方案:8位资深婚姻家事律师专业推荐 - 资讯快报
  • 2026年线上投票工具实测:5款平台对比,按需挑选更省心
  • 嵌入式网络设备实战:Linux流量整形与JFFS2闪存文件系统部署
  • 晋中漏水检测维修权威推荐:卫生间-厨房-阳台-屋顶天花板漏水维修:靠谱防水补漏公司团队TOP5推荐(2026最新深度调研实测榜单) - 即刻修防水
  • 生产级多维聚合:金融场景下的可落地数据操作指南
  • RoboTwin:5分钟掌握双臂机器人数字孪生平台终极指南
  • CARLA快速启动包:解决Ubuntu+GPU环境安装失败的核心方案
  • YSR态塞曼分裂抑制现象的量子特性与实验观测
  • 2026年6月最新爱彼中国官方售后电话地址服务热线客服网点 - 资讯快报