Python游戏生命值监测:如何在生命值下降时触发代码执行
游戏生命值下降触发指定功能的实现方案
核心逻辑
- 新增变量存储上一轮识别到的生命值,初始值可设置为游戏满血数值(比如100)
- 每轮OCR识别完成后先提取有效生命值,和上一轮存储的数值做对比
- 若当前生命值小于上一轮数值,立即执行你自定义的目标代码
- 每轮比对完成后更新存储的生命值数值,供下一轮比对使用
优化后代码
import numpy as np import pytesseract import cv2 from PIL import ImageGrab conf = r'--oem 3 --psm 6 outputbase digits' pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe' # 存储上一轮生命值,初始设为满血值100 last_health = 100 def screenToData(): global last_health while (True): screen = np.array(ImageGrab.grab(bbox=(350, 150, 550, 300))) cv2.imshow("window", cv2.cvtColor(screen, cv2.COLOR_BGR2RGB)) data = pytesseract.image_to_data(cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY), lang='eng', config=conf) if cv2.waitKey(25) & 0xFF == ord('q'): cv2.destroyAllWindows() break current_health = None for x, box in enumerate(data.splitlines()): if x != 0: box = box.split() if len(box) == 12: # 提取识别到的数值,赋值给当前生命值 current_health = int(box[11]) # 数值范围校验,避免OCR识别错误出现异常值 if current_health <0 or current_health >100: current_health = None # 只有拿到有效生命值才做比对 if current_health is not None: if current_health < last_health: # 这里替换成你要执行的自定义代码即可 print(f"生命值从{last_health}下降到{current_health},触发指定操作") # 更新上一轮生命值 last_health = current_health screenToData()
额外优化建议
- 可以调整
ImageGrab.grab的bbox参数,只截取生命值显示的小范围区域,大幅提升识别速度和准确率 - 如果OCR识别经常出现错误数值,可以加连续多轮校验,连续2-3轮识别到数值下降再触发操作,避免误触发
内容的提问来源于stack exchange,提问作者Benji Papi
相关产品推荐
相关产品推荐

