你还在纯手工玩打地鼠么,快来看看这个AI自动打地鼠吧!手残党的福音!

838 阅读3分钟

seivl_image_our_camera.gif

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第28天,点击查看活动详情

项目需求

  刚完成了AI自瞄“辅助”,趁着这会激情还在,做个简易版本的AI打地鼠游戏“辅助”。现在需要完成的任务有如下:

  1. 获取网页端小游戏的视频图像画面;
  2. 通过视频画面中的信息获取地鼠的头像;
  3. 能够自动移动鼠标至地鼠头像的位置并点击三次(防止没打上);

功能拆解

   使用可以完成屏幕截图,通过截图输入到检测地鼠目标检测中去,检测输出矩形框的中心点坐标并指定三次点击鼠标左键,至此基本完成AI打地鼠的基础功能。

  考虑到不同版本的打地鼠游戏画面不一样,出现地鼠的机制也不同,我们这次先做一个“丐版”的 打地鼠,后期再进行升级改造。这个“丐版”的基础配置如下:
1.可以打开全屏进行打地鼠游戏;
2.每次只出现一只地鼠且每次出现地鼠的样子不大变;
3.每只地鼠钻出来时间大概1s即可

  上面对游戏配置进行了一定的规划,鉴于上述的规定我们可以迅速制定检测地鼠的位置的代码。由于每次只出一只地鼠且地鼠的样子基本保持一致,我们可以使用OpenCv中的模板匹配法进行做地鼠的检测,这样可以避免过多的导入其他的依赖,同时也增强了代码的适配性,便于后期的封装打包。对模板匹配检测出地鼠的位置后计算中心点坐标,我们依然采用pymouse进行鼠标坐标点控制移动,这样也节省了开发时间。

验证调试

  获取地鼠的样本图,这里我们仅取一只即可,程序主题可分三部分:

  1. 获取当前界面截屏图像;
  2. 完成图像的模板匹配判断是否含有目标,对有目标的输出中心点坐标并点击3次
  3. 构建Ture循环,串联截屏图像与模版匹配

代码:

import pyautogui
import cv2
import numpy as np
from pymouse import PyMouse

def GetImages():
    img = pyautogui.screenshot()  # 分别代表:左上角坐标,宽高
    Images = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
    return Images


def TemplateMatching(Screenshot, Hamster):
    h, w = Hamster.shape[:2]  # 获取模板的宽高
    result = cv2.matchTemplate(Screenshot, Hamster, 0)  # 匹配模板
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)  # 获得匹配图最大阻值最小值的位置
    if min_val < 20000000.0:
        left_top = min_loc  # 左上角的位置就是最小值
        x = (left_top[0] + 0.5 * w) + 644
        y = (left_top[1] + 0.5 * h) + 351
        x, y = int(x), int(y)
        print(x, y)
        m = PyMouse()
        m.click(x, y)  # 移动并且在(x,y)位置左击
        m.click(x, y)  # 移动并且在(x,y)位置左击
        m.click(x, y)  # 移动并且在(x,y)位置左击


if __name__ == "__main__":
    while 1:
        Hamster = cv2.imread("Hamster.jpg")
        HamsterImg = cv2.cvtColor(Hamster, cv2.COLOR_RGB2BGR)
        Screenshot = GetImages()
        TemplateMatching(Screenshot, HamsterImg)

Hamster.jpg