Python 3猎人猎鹿模拟脚本语法错误排查求助
猎鹿模拟脚本的语法错误分析与修复
原代码中的错误点
1. 类构造函数拼写错误
Hunter类的构造函数写成了__innit__,Python中类的构造函数必须是__init__,拼写错误会导致无法正确实例化类。
2. 类初始化参数不匹配
Hunter类的__init__方法定义了3个参数(env, deer, evasion_chance),但在setup函数实例化时传入了4个参数(env, deer, evasion_chance, hit_chance),参数数量不匹配。
3. 资源命名与调用不匹配
Hunter类中定义的资源是self.game,但场景函数scenario里调用了engagement.deer(),两者名称不一致,导致属性不存在错误。
4. Attack方法逻辑混乱且调用错误
- Attack方法中冗余赋值
self.env = env,构造函数已初始化该属性; - 错误创建
self.sam资源,猎人不需要作为simpy Resource; - 调用
attack时直接传递方法对象engagement.attack,没有调用方法也未传参,正确方式应为env.process(engagement.attack())(同时需调整方法参数); - 方法内未实现命中率与闪避率的核心判断逻辑,只是生成了随机时间。
5. 全局变量名错误
场景函数中使用deer_downed +=1,但全局变量实际名为deer_hunted,变量名不匹配导致未定义错误。
6. Setup函数逻辑错误
- for循环内嵌套
while True,会导致程序在第一次for迭代时进入无限循环,无法执行后续逻辑; - 错误地将Hunter实例当作函数调用(
engagement(env, i, engagement)),实际应调用场景函数scenario; random.randint(hit_chance -1, hit_chance +1)使用浮点数作为randint参数,该函数要求整数输入,会触发类型错误。
7. Env.run参数拼写错误
env.run(until1=SIM_TIME)中的参数名应为until,拼写错误导致运行失败。
修正后的完整代码
import random import simpy import numpy as np # 全局配置 DEER = 40 DISTANCE = 100 EVASION_CHANCE = 0.85 # 鹿闪避成功的概率 HIT_CHANCE = 0.60 # 猎人命中的概率 SIM_TIME = 100 deer_hunted = 0 class Hunter: def __init__(self, env, evasion_chance, hit_chance): self.env = env self.evasion_chance = evasion_chance self.hit_chance = hit_chance # 鹿的资源,代表当前可狩猎的鹿数量 self.deer_resource = simpy.Resource(env, DEER) def attack(self): # 模拟攻击耗时(基于合理范围的正态分布,确保至少1单位时间) attack_time = max(1, np.random.normal(2, 0.6)) yield self.env.timeout(attack_time) # 核心判断:先判断鹿是否闪避,再判断猎人是否命中 if random.random() >= self.evasion_chance: # 鹿未闪避,判断猎人是否命中 if random.random() <= self.hit_chance: global deer_hunted deer_hunted += 1 print(f"[{self.env.now:.1f}] 鹿被击中!已猎杀总数: {deer_hunted}") else: print(f"[{self.env.now:.1f}] 鹿未闪避,但猎人未命中") else: print(f"[{self.env.now:.1f}] 鹿成功闪避") def scenario(env, hunter): print(f"[{env.now:.1f}] 一只鹿进入狩猎区域") # 请求鹿的资源(代表鹿进入危险区) with hunter.deer_resource.request() as request: yield request print(f"[{env.now:.1f}] 鹿进入危险区域,猎人开始攻击") # 执行攻击流程 yield env.process(hunter.attack()) print(f"[{env.now:.1f}] 本次狩猎结束") def setup(env, evasion_chance, hit_chance): hunter = Hunter(env, evasion_chance, hit_chance) # 初始生成5只鹿进入区域 for _ in range(5): env.process(scenario(env, hunter)) # 鹿进入的间隔时间 yield env.timeout(random.randint(1, 3)) # 后续持续生成鹿,直到模拟结束 while True: yield env.timeout(random.randint(2, 4)) env.process(scenario(env, hunter)) # 启动模拟 print("Starting Simulation") env = simpy.Environment() env.process(setup(env, EVASION_CHANCE, HIT_CHANCE)) env.run(until=SIM_TIME) print(f"\n模拟结束,总共猎杀鹿的数量: {deer_hunted}")
内容的提问来源于stack exchange,提问作者Buckethead
相关产品推荐
相关产品推荐

