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 运行结果
(截图略,实际运行时命令行输出每一步的拼点过程、伤害计算、状态触发,交互流畅。)

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. 实验过程中遇到的问题和解决过程
- 拼点平局处理:初始未考虑双方威力相等的情况,导致while循环无法退出。解决:增加平局分支(返回0),双方均不折断硬币,并设置最大拼点次数防止死循环。
- 状态遍历删除异常:在遍历status_effects列表时直接删除当前元素,导致漏处理或索引错误。解决:使用切片副本
for status in self.status_effects[:]:遍历,循环结束后统一清理过期状态。 - 动态导入关卡文件路径问题:importlib加载外部模块时,文件路径含中文或特殊字符导致失败。解决:使用Path对象规范化路径,并确保sys.modules中模块名唯一。
- 抽象方法未实现的运行时错误:初始未用@abstractmethod装饰,子类忘记重写时只触发NotImplementedError。解决:显式继承ABC并使用@abstractmethod,让Python在实例化时立即检查,提前暴露问题。
4. 其他(感悟、思考等)
通过本次综合实践,我深刻体会到Python作为高级语言在建模复杂现实问题时的便利性。相较于C语言需要手动管理内存和函数指针,Python的类和继承机制让代码结构更加清晰,逻辑更加贴近人类思维。尤其在实现状态效果体系时,每个状态作为一个独立类,新增效果无需修改已有代码,这让我切实理解了“开闭原则”和“多态”的价值。同时,抽象基类的使用让我意识到接口设计是大型项目协作的关键,通过定义清晰的抽象方法,团队不同成员可以并行开发不同模块。本次实验不仅提升了我的Python编程能力,更让我从宏观上理解了面向对象分析与设计的方法论,为后续学习设计模式、软件工程乃至游戏开发奠定了坚实基础。
5. 参考资料
- romebody的仓库地址
- https://limbuscompany.huijiwiki.com/
