**刚刚学习python不久,它具有快速开发的优点,于是便琢磨起用python写一写辅助
是基于以前玩过的一款网易游戏--楚留香现在改名叫一梦江湖写的,话不多说,开始正题.**加粗样式**
**前不久新出一门派太阴,楚留香矿石资源供不应求,于是乎,便开始了挖矿辅助的制作
***2020-04-11更新说明:这是最初的一个版本,功能比较少,还么有界面程序,第一个带界面的打包程序已经上传到我的资源下载点击跳转,第二个版本2.0版本点击下载,如果有玩这个游戏的同学,没有积分的可以滴滴我到我的个人网站下载
2020-05-31 最近不少同学来问新版本的源码,移步github***
首先明确辅助思路:
目前实现了塞北地图立银矿的五个刷新点的自动挖矿操作,基本上刷新一个立银矿就可以识别到然后自动寻路开始挖矿,效率还是非常的高****
大致介绍一下各个库:
PIL和aircv是python常用的图像处理和识别的库,据我了解PIL比较强大,但是依然次于matlab,
目前最先进的人脸识别和图像识别系统是基于matlab的
pywin32对于windows窗口操作非常方便,通过其中的api操作可以实现较多功能
autopy和pywin32都是可以模拟键盘鼠标事件对游戏窗口操作
剩下的几个库就是比较常见的库不一一介绍了
test4.py
主程序:
注意想要获取游戏窗口句柄需要用管理员身份打开PyCharm
最后打包成exe可执行文件后也是需要用管理员身份打开
from PIL import ImageGrab
import aircv as ac
import win32con
import win32api
import win32gui
import autopy
import time
import os
import multiprocessing
import easygui
import base64
# 将p2.py运行产生的memory_pic.py模板图片编码文件导入主程序
from memory_pic import *
def get_winds(): # 获取游戏句柄 ,并把游戏窗口置顶并激活窗口
hwnd1 = win32gui.FindWindowEx(0, 0, "Messiah_Game", "一梦江湖")
win32gui.ShowWindow(hwnd1, win32con.SW_RESTORE)
win32gui.SetWindowPos(hwnd1, win32con.HWND_TOPMOST, 436, 107, 1064, 572, win32con.SWP_SHOWWINDOW)
def get_src(): # 获得全屏截图
abspath = os.getcwd()
filename = "\\src.jpg"
win32api.keybd_event(win32con.VK_SNAPSHOT, 0) # 调用键盘事件获得截图
time.sleep(0.5)
src = ImageGrab.grabclipboard()
src.save(abspath+filename) # 将全屏截图存为src.jpg
def compare_(objs): # 图像识别之模板匹配
imobj = ac.imread(objs)
imsrc = ac.imread('%s\\src.jpg' % os.getcwd())
pos = ac.find_template(imsrc, imobj, 0.5)
return pos # 将传进来的图片和全屏截图匹配如果找到就返回图像在屏幕的坐标 否则返回None
def changge_flag(num): # 由于该程序没有界面,暂时没有想到如何退出程序
# 此为第一个子进程,用于用户输入,以退出整个程序
# 用户输入0后,会将0返回主程序,并传给挖矿子程序,以停止挖矿子程序
# 如果有更好的方式停止挖矿子程序欢迎留言
a = easygui.enterbox()
num.value = int(a)
def mnings(num):
mning = Mning() # 挖矿类实例化
get_src() # 全屏截图
while num.value:
# 通过图像模板匹配
# 判断是否有挖矿两个字
cops = compare_("test1.png") or compare_("test2.png") or compare_("test3.png")
if cops is None:
# 如果没有挖矿字样去地图找到立银位置然后点击
mning.find_mning()
time.sleep(2)
get_src() # 再次获取到全屏截图以备下次循环使用
else:
# 如果已经找到挖矿字样
mning.all() # 实例化挖矿类所有步骤
time.sleep(3)
mning.find_mning() # 挖完此处继续去地图找到立银位置,
# 找到后点击立银位置自动寻路找到立银
mning.mouse_click(1460, 165)
time.sleep(4)
get_src() # 获取全屏截图以备下次循环判断是否需要挖矿
class Mning(): # 挖矿类
# 此类中所有鼠标点击操作理论上都可以通过模板匹配判断是否需要点击
# 但是图像识别局限性比较大,如果游戏稍微卡一下,就会截图不到正确的图像
# 而且对于图像有干扰的地方识别效果非常不好
# 此代码中已经将图像识别不好处理的地方用固定坐标代替
# 为了减少识别次数,少部分也使用了固定坐标
def mouse_click(self, x, y):
autopy.mouse.move(x, y)
autopy.mouse.click()
def do_it(self): # 点击挖矿按钮
self.mouse_click(1170, 411)
def change(self): # 换挖矿工具
self.mouse_click(1090, 360)
def shop(self): # 如果背包工具使用完,购买工具,
# 并实现用银两购买,或者用银票购买(使用之前买够工具)
self.mouse_click(960, 510)
time.sleep(0.5)
self.mouse_click(1120, 510)
time.sleep(0.5)
self.mouse_click(790, 570)
def find_mning(self): # 通过地图寻找立银矿位置(使用之前请将搜索立银矿调出来)
self.mouse_click(1460, 165)
time.sleep(0.5)
self.mouse_click(1040, 545)
def all(self): # 将挖矿购物合在一起,可以减少使用图像识别步骤
self.do_it()
time.sleep(2)
self.change()
time.sleep(1)
self.shop()
time.sleep(4)
def get_pic(pic_code, pic_name): # 将需要使用的模板图像解码出来,以便使用图像识别
image = open(pic_name, 'wb')
image.write(base64.b64decode(pic_code))
image.close()
if __name__ == '__main__':
# 这句话必须要写如果使用了进程的话,否则可执行文件无法在windows正常运行,会使电脑卡到死(会运行无数个窗和EXE文件)
multiprocessing.freeze_support()
# 解码所有需要的图片
get_pic(test1_png, 'test1.png')
get_pic(test2_png, 'test2.png')
get_pic(test3_png, 'test3.png')
get_winds() # 获取游戏窗口
time.sleep(2)
num = multiprocessing.Value("d", 10.0) # 此为两个进程之间通讯的一个数值类型的数
# 用户输入界面子程序, 输入0退出整个程序
p_input = multiprocessing.Process(target=changge_flag, args=(num,)) # 创建一个进程 用户 输入的值传递给num
p_input.start()
# 挖矿子进程
p_mning = multiprocessing.Process(target=mnings, args=(num,)) # 创建进程 通过图像对比找到是否有挖矿或者砍树按钮
p_mning.start() # 如果找到开始挖矿
p2.py
该子程序将需要的模板图片test1.png test2.png test3.png编码到memory_pic.py文件中
然后在主程序中调用memory_pic.py并解码出模板图片,
import base64
def pic2py(picture_names, py_name):
"""
将图像文件转换为py文件
:param picture_name:
:return:
"""
write_data = []
for picture_name in picture_names:
filename = picture_name.replace('.', '_')
open_pic = open("%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意这边b64str一定要加上.decode()
write_data.append('%s = "%s"\n' % (filename, b64str.decode()))
f = open('%s.py' % py_name, 'w+')
for data in write_data:
f.write(data)
f.close()
if __name__ == '__main__':
# 直接将需要使用的图片放在下边的列表里
# 进行编码
pics = ["test1.png", "test2.png", "test3.png", "test4.png", "test5.png"]
pic2py(pics, 'memory_pic') # 将pics里面的图片写到 memory_pic.py 中
print("ok")
上述步骤结束后运行一下test4.py测试是否达到预期效果
如果达到预期效果便可以着手开始打包了
比较方便的打包方式是使用pyinstaller但是缺点就是打包后的exe文件比较大,我第一次测试成功后四十行代码打包完50M的exe程序,非常惊呆,后来打包把所有的注释全部删除掉以减轻体积,上面的注释是我又重新打上的,着实辛苦,看完后记得要点赞哦
pip install pyinstaller 安装,记得使用的库和pyinstaller都要是最新的,如果不是更新一下,不然打包会出错
安装完成后在test4.py文件目录下按住shift鼠标右键在此处打开power shell
然后输入 pyinstaller -F -w -i icon.ico test4.py
-i icon.ico 为可选是为exe文件加图标, icon为文件名 .ico为必须的图片格式我是在楚留香游戏文件里面找到的楚留香的游戏图片
等待打包完成生成三个如下文件,build里面warm test4 .txt里面记录你缺少的库和一些警告
dist里面是你打包完成的可执行文件
test4.spec为配置文件,其实我们编码的模板图片是可以直接通过它来配置不需要编码解码,它还可以配置主程序依赖的其他文件
如有疑问欢迎下方留言