为了学习编程而做测试用,严禁用于商业非法盈利
可以尝试图像模板匹配及目标检测,后者对机器GPU显卡有点要求。
1.活动背景
听一个朋友说:
每天可以刷999次+活动次数70次,
开头去尾10秒平均一次的话,10*(999+70)/3600~=3h,
朋友说实际做下来得6个小时,
加上手指头每次点两下,
ch兼职毫无人性....
so,人工智能AI就是来帮忙的呀...
ok,直接上原理:简单来讲-AI帮你去找到手指要点的目标并模拟人手去点两下鼠标。
1.先截游戏屏幕
2.opencv识别图像点击开始,
3.识别图像点击结束
2.代码
2.1 截屏
#新建python文件:prientscreen.py
#一切为了懒嘛,就直接把游戏窗口认认真真的拖到左上角了。。。
#截屏,获取原图,会一直更新,会在此图像上识别要点击的图标
from PIL import Image
from PIL import ImageGrab
def Printscreen():
# 截图坐标 左上角 ,右下角
size = (0, 0,1426,845)#界面大小,一定要先拖到左上角哦。
img = ImageGrab.grab(size)
# 保存截图
img.save("yuan.png")
print('截图进行了一次刷新')
# 打开截图
# img.show()
# 测试
# Printscreen()
2.2 鼠标点击
#新建python文件:click.py
import win32api
import win32con
import win32gui
import time
import random
def xunzhao():
#寻找游戏窗口,要先打开游戏哦...
wdname = u'阴阳师-网易游戏'
# 取得窗口句柄
hwnd = win32gui.FindWindow(0, wdname)
if not hwnd:
print("窗口找不到,请确认窗口句柄名称:【%s】" % wdname )
exit()
# 窗口显示最前面
win32gui.SetForegroundWindow(hwnd)
def move_click(x, y, t=0): # 移动鼠标并点击左键
suiji1 = random.randint(0,10)
suiji2 = random.randint(0,10)
# print('鼠标抖动随机数为:+',suiji2,' +',suiji1),鬼使黑,你懂的...
win32api.SetCursorPos((x+suiji1, y+suiji2)) # 设置鼠标位置(x, y),设置随机数,以防被封
time.sleep(0.1)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) # 点击鼠标左键
# print('模拟点击')
return 0
# # 测试
# while True :
# suiji = random.randint(0,5) #获得随机数
# xunzhao() #游戏顶置,获得句柄
# time.sleep(suiji) #间隔时间
# move_click(1280, 685) #坐标点击
2.3 图像匹配
#新建文件image_discern.py
import cv2
import numpy as np
from matplotlib import pyplot as plt
import math
###图像匹配###
def Image_Discern(imgone,imgtwo):
# 1.模板匹配,对比图1和图2
# 大图
img = cv2.imread(imgone)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 小图
template = cv2.imread(imgtwo, 0)
h, w = template.shape[:2] # rows->h, cols->w
img2 = img.copy()
# 对比图像
res = cv2.matchTemplate(img_gray, template, cv2.TM_SQDIFF_NORMED)#归一化平方差匹配法,核心工具
# 返回坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 计算中心坐标
a1, a2 = top_left
b1, b2 = bottom_right
c1 = (a1 + w/2)*0.8 # 0.8匹配屏幕分辨率(因为分辨率原因这里乘0.8用于适应平复分辨率坐标位置)
c2 = (a2 + h/2)*0.8
e1 = math.ceil(c1)
e2 = math.ceil(c2)
d1 = (e1, e2)
# print('中心坐标为:' , d1)
###测试图像匹配,弹出图像显示匹配位置###
# 在匹配点画小圆心
# cv2.circle(res, top_left, 10, 0, 2)
# cv2.imshow("res", res)
# # 画矩形
# cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)
# cv2.imshow("img2",img2)
# cv2.waitKey(0)
# 两张图片是否匹配
# print('各个参数为:',min_val, max_val, min_loc, max_loc)
###进行图像筛选###
if min_val <= 0.03:#平方差越小匹配度越好;
# print('图片匹配')
return(d1)
else:
# print('图片不匹配')
return(0)
# 测试
# Image_Discern('./png/imgone.PNG','./png/imgtwo.PNG') # (大图,小图)匹配图像
2.4 点击图标
#新建文件:identify_click.py
import click
import printscreen
import image_discern
import time
import random
###进行图标点击###
def Identify_Click(little):
a = random.uniform(0,0.3)
click.xunzhao()
time.sleep(a) # 间隔秒数
printscreen.Printscreen() # 截图
time.sleep(a)
b1 = image_discern.Image_Discern('yuan.png', little) #图像对比
for i in range(1,6):#点不到图标的话重复几次
if b1 == 0:
# print('准备再次寻找第',i,'次')
time.sleep(a)
click.xunzhao()
time.sleep(a)
printscreen.Printscreen()
time.sleep(a)
b1 = image_discern.Image_Discern('yuan.png', little)
else:
time.sleep(a)
printscreen.Printscreen() # 截图
b1 = image_discern.Image_Discern('yuan.png', little) #图像对比
a1, a2 = b1 #地址赋值
click.move_click(a1, a2) #模拟点击
time.sleep(a)
break
###寻找场景内是否有相应图标###
def Identify_Click_Seek(little):
b = random.uniform(0,0.5)#模型匹配随机数
# print(a)
# print(b)
click.xunzhao()
time.sleep(b) # 间隔秒数
printscreen.Printscreen() # 截图
time.sleep(b)
b1 = image_discern.Image_Discern('yuan.png', little) #图像对比
if b1 == 0:
# print('没有相应图标')
return(False)
else:
# print('找到相应图标')
return(True)
2.5 集市&闹市
#新建python文件jishi.py
import time
import identify_click
import random
def Jishi():
b = random.uniform(0.1,2)#引入战斗间隔随机数
while True:
a = ('-----------------')
# ##判断体力是否足够##
# if identify_click.Identify_Click_Seek('./png/img_GouMaiTiLi.png'):
# print(a)
# print('体力不足')
# break #结束循环
#判断战斗结束情形1##
if identify_click.Identify_Click_Seek('./png/img_Next.png'):
identify_click.Identify_Click('./png/img_Next.png')
print(a)
print('战斗结束')
continue #跳出本次循环
#判断战斗结束情形2##
if identify_click.Identify_Click_Seek('./png/img_Next2.png'):
identify_click.Identify_Click('./png/img_Next2.png')
print(a)
print('战斗结束')
continue #跳出本次循环
#判断战斗结束情形3##
if identify_click.Identify_Click_Seek('./png/img_Next3.png'):
identify_click.Identify_Click('./png/img_Next3.png')
print(a)
print('战斗结束')
continue #跳出本次循环
##继续战斗按钮##
elif identify_click.Identify_Click_Seek('./png/img_Tiaozhan.png'):
identify_click.Identify_Click('./png/img_Tiaozhan.png')
print(a)
print('战斗开始')
continue #跳出本次循环
time.sleep(b) #间隔秒数
return(True)
# 测试
Jishi()
3.readme
一、安装
安装anaconda3,网址https://www.anaconda.com/products/individual#Downloads
电脑左下角点开始-anaconda3-anaconda prompt-
conda create -n YYS python=3.8
activate YYS
pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
cd C:\Anaconda3\envs\YYS\Scripts
python pywin32_postinstall.py -install
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib --trusted-host pypi.douban.com
pip install opencv-python --trusted-host pypi.douban.com
检查屏幕:1920X1080,YYS窗口精准放到左上角
二、使用:
1.管理员运行anaconda prompt
activate YYS
cd/d D:\hjz-py\Project\16-YYS\17_yys
python jishi.py,运行后若出错按⬆再次运行即可
修改战斗时间间隔:
jishi.py里面
第七行 b = random.randrange(1,3)#引入战斗间隔随机数