You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:10:15