《大家来找茬》游戏辅助工具开发

《大家来找茬》游戏辅助工具开发

提示:本博文仅供学习交流,并无任何破坏游戏环境之意。



规则分析

在规定时间内找出2张相似的图片中不一样的5处地方就算过关,一般是连续5回合,也就是5组图 25个错误地方。在总时间内找到最多最快的算胜利。

开发思路

  1. 屏幕抓取
  2. 图片对比,找出不同之处
  3. GUI显示帮助信息

程序设计

1.获取图片

首先,获取游戏界面中两张相似图片。关键部分程序如下:

win32gui.GetWindowRect(handle)	# 获取窗口矩形坐标

# 通过计算目标图片相对于父窗口的位置进行截取
img_ready = ImageGrab.grab((x1, y1, x2, y2))
img_left = ImageGrab.grab((x1 + 134, y1 + 463, x1 + 134 + 582, y1 + 463 + 439))
img_right = ImageGrab.grab((x1 + 820, y1 + 463, x1 + 820 + 582, y1 + 463 + 439))

运行结果如下图所示:

img1.jpgimg2.jpg

2.图片对比

将获取的两张图片进行对比,找出不同之处。两张图片的不同之处总结起来有两点:颜色差异和轮廓差异。颜色差异可通过简单的三通道求差获取,轮廓差异可通过轮廓检测后求差获取(预期方案)。但是在实际对比两张图片时发现其实两张图片完全不一样,一方面两者有一定的色差,另一方面两者轮廓并非绝对重合,而是存在一定偏差。所以我觉得采用将两张图片叠加,然后生成GIF动图的形式辅助我们用肉眼快速找出不同。这种生成GIF图的方法能够找出两者的轮廓差异,但是在颜色差异上略显乏力(特别是深红色和紫色,两者闪烁我根本看不出来有变化。),所以此时需要用到色差图进行”补漏“。相关关键代码如下:

diff = cv.subtract(cv.cvtColor(np.asarray(img_left), cv.COLOR_BGR2RGB),
                       cv.cvtColor(np.asarray(img_right), cv.COLOR_BGR2RGB))


def create_gif(image_list, gif_name, duration = 0.35):
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))
    imageio.mimsave(gif_name, frames, 'GIF', duration = duration)
    return


def main():
    image_list = ['img1.jpg', 'img2.jpg']
    gif_name = 'diff.gif'
    duration = 0.1
    create_gif(image_list, gif_name, duration)

运行结果如下图所示:

diff.jpgdiff.gif

3.GUI显示

本来是想通过获取图片不同之处的坐标值,利用win32api的mouse_event进行单击操作,实现完全的自动化操作。但是由于时间和精力限制,使用GUI显示辅助判断信息的方式取缔了上述方案。关键代码如下:

    def run(self, evt):
        windowName = "大家来找茬"
        dst = get_picture(windowName)
        # cv.imshow("dst", dst)
        gif.create_gif(["img1.jpg", "img2.jpg"], "diff.gif", 0.1)
        self.animation.Stop()
        self.animation = AnimationCtrl(self.panel, -1, Animation('diff.gif'), pos = (0, 0))  # 创建一个动画
        self.animation.Play()  # 播放动图

        row, col, x = dst.shape
        bmp = wx.Bitmap.FromBuffer(col, row, dst)
        wx.StaticBitmap(self, -1, bmp, (0, 500), (bmp.GetWidth(), bmp.GetHeight()))  # BUG:静态图更新延迟

未解决BUG:静态图更新有延迟,一般gif更新后需再点击一次按钮才会更新jpg

总结

欢迎各位看官指出不足之处,并给予宝贵建议和意见!
想了解更多,或者下载源码:https://github.com/mstifiy/GameTool

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
游戏辅助需要通过图像处理技术来实现,Python中有很多图像处理库可以使用,比如OpenCV、Pillow等。下面是一个简单的找游戏辅助的示例代码: ```python import cv2 import numpy as np import pyautogui # 加载原始图片和找图片 img1 = cv2.imread('pic1.png') img2 = cv2.imread('pic2.png') # 转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 计算两张图片的差异 diff = cv2.absdiff(gray1, gray2) # 设置阈值 thresh = 30 _, thresh_img = cv2.threshold(diff, thresh, 255, cv2.THRESH_BINARY) # 进行轮廓检测 contours, _ = cv2.findContours(thresh_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历所有轮廓 for contour in contours: # 计算轮廓的面积 area = cv2.contourArea(contour) if area > 50: # 获取轮廓的坐标 x, y, w, h = cv2.boundingRect(contour) # 在找图片中标注出差异部分 cv2.rectangle(img2, (x, y), (x+w, y+h), (0, 0, 255), 2) # 点击差异部分 pyautogui.click(x, y) ``` 上述代码中,我们首先加载了原始图片和找图片,然后将它们转换为灰度图像,并计算出两张图片的差异。接着,我们设置了一个阈值,通过二值化和轮廓检测来找到差异部分,并在找图片中标注出来。最后,通过pyautogui库来模拟鼠标点击操作,实现自动找。需要注意的是,这只是一个简单的示例代码,实际使用中还需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值