三角洲辅助卡盟新版上线,应有尽有
当前位置:首页 > 游戏攻略> 正文

dnf材料收集达人任务

发布时间:06/21 10:36:58
Python+OpenCV实现DNF材料收集自动化脚本实战

开发环境搭建与依赖安装

要实现DNF材料收集的自动化,我们需要构建一个基于图像识别的Python环境。核心思路是通过屏幕截图定位特定材料或任务按钮的坐标,进而模拟鼠标点击操作。首先请确保你的操作系统已安装Python 3.8或更高版本。

打开终端或命令提示符,执行以下命令安装必要的第三方库。这些库分别用于图像处理、屏幕控制和矩阵运算:

pip install pyautogui opencv-python pillow numpy

安装完成后,我们需要验证环境是否正常。创建一个测试文件test_env.py,输入以下代码并运行,如果输出屏幕分辨率则表示环境配置成功:

```python
import pyautogui
print(pyautogui.size())
```

游戏设置与图像素材准备

在编写脚本前,必须对游戏客户端进行标准化设置,以确保图像识别的准确率。错误的分辨率或窗口模式会导致脚本无法定位坐标。

1. 分辨率与窗口设置:进入DNF游戏设置,将分辨率锁定为1366x768,并将显示模式设置为“窗口模式”或“无边框窗口”。全屏模式下截图通常会失败,必须使用窗口模式。

2. 图像素材采集:这是脚本成功的关键。你需要准备三张关键的PNG截图,请使用微信截图或Snipaste等工具截取游戏内的以下元素,并保存到项目根目录的images文件夹中:

  • task_icon.png:任务栏中“材料收集”任务对应的图标。
  • go_btn.png:任务追踪栏中“前往”或“怪兽”按钮的图标。
  • confirm_btn.png:通用的“确认”或“接受”按钮图标。

注意:截图时尽量只截取图标的核心区域,不要包含太多背景杂色,且图片必须保存为无损的PNG格式。

核心代码逻辑与实现

我们将编写一个类DNFAutoBot来封装所有操作。核心逻辑使用OpenCV的matchTemplate算法在屏幕中查找我们准备好的小图。以下是完整的、可直接运行的Python脚本代码:

```python
import pyautogui
import cv2
import numpy as np
import time
import os
import win32gui, win32ui, win32con

class DNFAutoBot:
def __init__(self):
self.confidence = 0.8 图像匹配置信度,0.8表示80%相似度
self.window_title = "地下城与勇士" 游戏窗口标题
pyautogui.PAUSE = 0.5 每个操作后的默认暂停时间

def get_window_rect(self):
"""获取游戏窗口的坐标,用于限定截图范围"""
hwnd = win32gui.FindWindow(None, self.window_title)
if not hwnd:
raise Exception("未找到DNF游戏窗口,请确认游戏已启动且窗口标题正确")
rect = win32gui.GetWindowRect(hwnd)
return rect

def capture_screen(self, rect=None):
"""截取屏幕或指定窗口区域"""
if rect:
截取指定窗口区域(更精准)
hwnd = win32gui.FindWindow(None, self.window_title)
left, top, right, bottom = rect
width = right - left
height = bottom - top
hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)
saveDC.SelectObject(saveBitMap)
result = windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 0)
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
img = np.frombuffer(bmpstr, dtype='uint8')
img.shape = (height, width, 4)
mfcDC.DeleteDC()
saveDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)
win32gui.DeleteObject(saveBitMap.GetHandle())
转换为BGR格式供OpenCV使用
img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
return img
else:
全屏截图
return np.array(pyautogui.screenshot())

def find_image(self, image_path, rect=None):
"""在屏幕中查找指定图片的位置"""
if not os.path.exists(image_path):
print(f"错误:找不到图片文件 {image_path}")
return None

读取目标图片(模板)
template = cv2.imread(image_path)
if template is None:
print(f"错误:无法读取图片 {image_path}")
return None

获取屏幕截图
screen = self.capture_screen(rect)

转换颜色格式
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
screen_gray = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY)

模板匹配
result = cv2.matchTemplate(screen_gray, template_gray, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

if max_val >= self.confidence:
计算中心点坐标
h, w = template_gray.shape
center_x = int(max_loc[0] + w / 2)
center_y = int(max_loc[1] + h / 2)
如果是窗口截图,需要加上窗口偏移量
if rect:
center_x += rect[0]
center_y += rect[1]
return (center_x, center_y)
else:
return None

def click_image(self, image_path, rect=None):
"""查找并点击图片"""
pos = self.find_image(image_path, rect)
if pos:
pyautogui.click(pos[0], pos[1])
print(f"成功点击:{image_path} 坐标:{pos}")
return True
else:
print(f"未找到:{image_path}")
return False

def run_loop(self):
"""主循环逻辑"""
print("脚本启动,请将DNF窗口置于前台...")
time.sleep(2)

try:
rect = self.get_window_rect()
except Exception as e:
print(e)
return

while True:
1. 检查是否有任务图标
if self.click_image("images/task_icon.png", rect):
time.sleep(1)
2. 点击前往/执行
if self.click_image("images/go_btn.png", rect):
time.sleep(2)
3. 如果有确认弹窗,点击确认
if self.click_image("images/confirm_btn.png", rect):
time.sleep(1)
else:
print("未检测到任务,等待重试...")

time.sleep(1) 循环间隔,防止CPU占用过高

if __name__ == "__main__":
开启防故障功能:鼠标移到左上角强行终止脚本
pyautogui.FAILSAFE = True
bot = DNFAutoBot()
bot.run_loop()
```

脚本运行与调试指南

代码编写完成后,请严格按照以下步骤执行,以确保脚本能够稳定运行。不要直接全屏运行,先进行单步测试。

1. 文件目录结构检查:确保你的文件夹结构如下所示,否则脚本会因为找不到图片而报错:

  • project_folder/
    • dnf_auto_collector.py (主脚本)
    • images/ (资源文件夹)
      • task_icon.png
      • go_btn.png
      • confirm_btn.png

2. 安全机制说明:代码中已设置pyautogui.FAILSAFE = True。这是非常重要的安全机制。如果脚本失控或你想立即停止它,只需迅速将鼠标移动到屏幕的左上角,脚本就会立即抛出异常并停止。

3. 启动脚本:在命令行中进入项目目录,执行:

python dnf_auto_collector.py

4. 常见问题排查:

  • 识别率过低:如果控制台一直打印“未找到”,可能是confidence值设置过高。DNF游戏画面光影变化较大,可以尝试将代码中的self.confidence = 0.8修改为0.70.75
  • 点击偏移:如果脚本找到了图标但点击位置不对,检查find_image函数中的中心点计算逻辑。确保w是宽度,h是高度,且坐标偏移量计算正确。
  • 窗口遮挡:运行时请确保没有任何其他窗口遮挡DNF游戏界面,否则截图会包含遮挡物,导致匹配失败。

通过以上步骤,你就拥有了一个基于计算机视觉的DNF材料收集自动化工具。该脚本通过实时分析游戏画面像素,模拟人类操作逻辑,实现了真正的零门槛自动化落地。

版权保护: 本文由 741卡盟 原创,转载请保留链接: http://741ka.com/gamenews/20013.html