使用asyncio时游戏Bot的hunt()函数无法正常运行问题
问题分析与修复方案
你的游戏Bot代码存在几个核心问题,导致hunt()无法按预期触发并执行:
核心问题
grind()是同步死循环:调用grind()后会直接阻塞整个程序,main()里后续的条件检测逻辑根本不会运行,自然无法触发hunt()- 变量作用域错误:
eltime是hunt()内部定义的变量,main()无法直接访问,await asyncio.sleep(eltime)会直接报错 - 同步
time.sleep()阻塞事件循环:在async函数中使用time.sleep()会卡死整个asyncio事件循环,导致异步逻辑失效 - 无暂停
grind()的机制:原代码没有设计暂停grind()的逻辑,就算触发hunt(),grind()的循环也会持续运行
修复后的代码
import pyautogui import pydirectinput import asyncio import random # 控制grind运行状态的全局标志位 is_grinding = True # 生成随机间隔,避免固定操作节奏 def get_random_interval(): return random.randint(1, 2) async def grind(): global is_grinding while True: if is_grinding: # 执行左右移动逻辑 pydirectinput.keyDown('left') await asyncio.sleep(get_random_interval()) pydirectinput.keyDown('right') pydirectinput.keyUp('left') await asyncio.sleep(get_random_interval()) pydirectinput.keyUp('right') # 让出事件循环,避免占用全部CPU资源 await asyncio.sleep(0.1) async def hunt(): global is_grinding # 暂停grind任务 is_grinding = False # 确保松开方向键,避免冲突 pydirectinput.keyUp('left') pydirectinput.keyUp('right') # 执行hunt操作逻辑 await asyncio.sleep(3) pydirectinput.press('1') await asyncio.sleep(0.2) pydirectinput.press('1') await asyncio.sleep(3) # 完成hunt后恢复grind is_grinding = True async def main(): # 启动grind异步任务 grind_task = asyncio.create_task(grind()) # 持续检测像素条件 while True: if pyautogui.pixel(941, 664)[0] == 205: await hunt() # 控制检测频率,避免资源浪费 await asyncio.sleep(0.5) asyncio.run(main())
修复说明
- 异步化
grind():将grind()改为async函数,用asyncio.sleep()替代time.sleep(),避免阻塞事件循环 - 全局标志位控制状态:通过
is_grinding变量实现grind()的暂停与恢复,执行hunt()时暂停,完成后自动恢复 - 简化按键操作:用
pydirectinput.press('1')替代手动的keyDown/keyUp,代码更简洁可靠 - 分离任务执行:
main()中单独启动grind()异步任务,同时循环检测像素条件,满足时直接等待hunt()执行完成 - 优化资源占用:在循环中添加短暂的
sleep,避免程序占用过高CPU资源
内容的提问来源于stack exchange,提问作者Kgold545
相关产品推荐
相关产品推荐

