python3小项目2-基于autopy的游戏脚本

说明:

这里笔者用的PC端的安卓模拟器为雷电模拟器,因为发现这个兼容性好

这里笔者在雷电模拟器上安装了一款心动女友app游戏

本次项目的目的:

创建一个通用库。暂时实现功能为自动打开雷电模拟器,并且自动实现心动女友游戏的恋爱功能

本次项目的原理:

用autopy的模拟鼠标点击,模拟鼠标长按,移动拖住鼠标等操作,实现自动玩游戏。并通过time的sleep函数控制时间

源码如下。本源码定义了多个类,理论可以很好的适用于其他游戏的简易自动化操作

#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# File  : gamehelper.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date  : 2019/3/22import win32gui, win32con,win32api
import re, traceback
from time import sleep
import autopy
from win32gui import *class cWindow:def __init__(self):self._hwnd = Nonedef SetAsForegroundWindow(self):# First, make sure all (other) always-on-top windows are hidden.self.hide_always_on_top_windows()win32gui.SetForegroundWindow(self._hwnd)def Maximize(self):win32gui.ShowWindow(self._hwnd, win32con.SW_MAXIMIZE)def _window_enum_callback(self, hwnd, regex):'''Pass to win32gui.EnumWindows() to check all open windows'''if self._hwnd is None and re.match(regex, str(win32gui.GetWindowText(hwnd))) is not None:self._hwnd = hwnddef find_window_regex(self, regex):self._hwnd = Nonewin32gui.EnumWindows(self._window_enum_callback, regex)return self._hwnddef hide_always_on_top_windows(self):win32gui.EnumWindows(self._window_enum_callback_hide, None)def _window_enum_callback_hide(self, hwnd, unused):if hwnd != self._hwnd: # ignore self# Is the window visible and marked as an always-on-top (topmost) window?if win32gui.IsWindowVisible(hwnd) and win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE) & win32con.WS_EX_TOPMOST:# Ignore windows of class 'Button' (the Start button overlay) and# 'Shell_TrayWnd' (the Task Bar).className = win32gui.GetClassName(hwnd)if not (className == 'Button' or className == 'Shell_TrayWnd'):# Force-minimize the window.# Fortunately, this seems to work even with windows that# have no Minimize button.# Note that if we tried to hide the window with SW_HIDE,# it would disappear from the Task Bar as well.win32gui.ShowWindow(hwnd, win32con.SW_FORCEMINIMIZE)def getallwindows(self):"""本方法实现获取当前所有进程列表并打印:return: type:list() 返回当前所有进程列表"""titles=set()def foo(hwnd, mouse):if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd):titles.add(GetWindowText(hwnd))EnumWindows(foo, 0)list = []for title in titles:if title:list.append(title)print(list)return  listdef openapp(self,appname):"""本方法实现打开一个包含指定名字的窗口:param appname: type: str('可以不是全名') 进程模糊名字:return: 返回窗口句柄"""try:regex = ".*{}.*".format(appname)self.find_window_regex(regex)self.Maximize()self.SetAsForegroundWindow()except:f = open("log.txt", "w")f.write(traceback.format_exc())print(traceback.format_exc())return self.find_window_regex(regex)class Mouse:def move(self, x, y,size=1):"""本方法实现鼠标移动到指定的坐标:param x: type:float(0~设备最大分辨率的宽) 待移动到的x坐标:param y: type:float(0~设备最大分辨率的高) 待移动到的y坐标:param size: type:float(0~1)  整体应用大小设置 win10下默认应用程序是125%大小,所以这里缩放后得到0.8.默认不缩放:return: 无返回值"""autopy.mouse.move(x*size, y*size)def click(self,mode=0):"""本方法实现鼠标在当前位置单次点击:param mode:  type:int(0,1,2) 鼠标点击模式 0表示用左键 1表示用中键 2表示用右键 默认用鼠标左键点击:return: 无返回值"""if mode == 1:autopy.mouse.click(autopy.mouse.Button.MIDDLE)elif mode == 2:autopy.mouse.click(autopy.mouse.Button.RIGHT)else:autopy.mouse.click(autopy.mouse.Button.LEFT)def move_click(self, x, y,size=1,mode=0):"""本方法实现鼠标瞬间移动到指定绝对坐标并且单次点击某个键:param x: type:float(0~设备最大分辨率的宽) 待移动到的x坐标:param y: type:float(0~设备最大分辨率的高) 待移动到的y坐标:param size: type:float(0~1) 整体应用大小设置 win10下默认应用程序是125%大小,所以这里缩放后得到0.8.默认不缩放:param mode: type:int(0,1,2) 鼠标点击模式 0表示用左键 1表示用中键 2表示用右键 默认用鼠标左键点击:return:"""self.move(x*size, y*size)self.click(mode)def hold(self,mode=0,down=True):"""本方法实现长按鼠标的键与放开常按:param mode: type:int(0,1,2) 鼠标点击模式 0表示用左键 1表示用中键 2表示用右键 默认用鼠标左键点击:param down: type:bool(True,False) 是否按下,默认是按下。松开请用False:return: 无返回值"""if mode == 1:autopy.mouse.toggle(autopy.mouse.Button.MIDDLE,down)elif mode == 2:autopy.mouse.toggle(autopy.mouse.Button.RIGHT,down)else:autopy.mouse.toggle(autopy.mouse.Button.LEFT,down)def location(self):return autopy.mouse.location()class Key:key_zm = {chr(i): i for i in range(65, 91)}key_num = {chr(i): i for i in range(48, 58)}key_F = {'F%d' % (i - 111): i for i in range(112, 124)}key_ts = {'Backspace': 8,'Tab': 9,'Clear': 12,'Enter': 13,'Shift': 16,'Ctrl': 17,'Alt': 18,'Caps Lock': 20,'Esc': 27,'Spacebar': 32,'Page Up': 33,'Page Down': 34,'End': 35,'Home': 36,'Left Arrow': 37,'Up Arrow': 38,'Right Arrow': 39,'Down Arrow': 40,'Insert': 45,'Delete': 46,'Help': 47,'Num Lock': 144,'+': 107,'-': 109,'*': 106,'/': 111,'.': 110}keycode = dict(key_zm, **key_num, **key_F, **key_ts)def push(self, key, mode=True):""":param key: type:str 按键名称 如Tab:param mode: type:bool 按键操作 False松开 True按下 默认是按下"""if mode:win32api.keybd_event(self.keycode[key], 0, 0, 0)else:win32api.keybd_event( self.keycode[key], 0, win32con.KEYEVENTF_KEYUP, 0)def input(self,string,wpm=None):autopy.key.type_string(string,wpm=wpm)def getcode(self, key):return self.keycode[key]class Screen:def getcolor(self,x,y):return  autopy.screen.get_color(x,y)def fenbianlv(self):width, height = autopy.screen.size()return (width,height)
class Message:def alert(self,info):autopy.alert.alert(info,title='提示框')def confirm(self,info):a=autopy.alert.alert(info, '选择框', default_button='确定', cancel_button='取消')return a
class XinDong:love={'遛狗':1,'运动':2,'看电影':3,'唱歌':4,'游乐园':5,'风景区':6,'国内游':7,'境外游':8}def qd(self):m.move_click(823,126,0.8)sleep(2)m.move_click(959, 822, 0.8)sleep(1)m.move_click(1487, 283, 0.8)def lianai_open(self):m.move_click(848, 928, 0.8)sleep(4)m.move_click(1471, 298, 0.8)sleep(1)def lianai_close(self):m.move_click(1728, 124, 0.8)def lianai_start(self):m.move(911, 265, 0.8)m.hold()m.move(1429, 262, 0.8)m.hold(down=False)sleep(0.5)def lianai_do(self,thing):thingnum=self.love[thing]self.lianai_start()for i in range(thingnum):m.move(1429, 262, 0.8)m.hold()sleep(0.5)m.move(911, 265, 0.8)m.hold(down=False)sleep(0.5)m.move_click(825,925,0.8)if thingnum>1:sleep(3)m.move_click(1146, 716, 0.8)sleep(2)m.move_click(825,925,0.8)sleep(27)m.move_click(960, 707, 0.8)sleep(3)def work(self):m.move_click(1078,922,0.8)sleep(3)m.move_click(1471, 298, 0.8, 0)sleep(0.5)def where_is_the_rubbish():'''查找回收站在屏幕中的位置'''m.move_click(1772,16,0.8)sleep(2)rubbish=autopy.bitmap.Bitmap.open('resave.png')print(rubbish)screen=autopy.bitmap.capture_screen()screen.save('jietu.png')print(screen)pos=screen.find_bitmap(rubbish)if pos:print ('找到了,他的位置在:%s' % str(pos))else:print ('没有找到')if __name__ == '__main__':cW = cWindow()m = Mouse()k = Key()s= Screen()ms=Message()cW.getallwindows()if ms.confirm('是否开始自动游戏?'):jubing=cW.openapp('雷电模拟器')print('应用程序窗口句柄为%s' % jubing)sleep(2)wg = XinDong()wg.lianai_open()wg.lianai_do('唱歌')wg.lianai_close()else:print('pass')

python3小项目2-基于autopy的游戏脚本相关推荐

  1. python3小项目——爬取招聘信息(智联招聘)

    2017年6月,花了大概一周的时间学习了以下内容,并基于此写了一个小项目.这里对其进行总结,说明其中遇到的问题和解决方案以及下一步计划. 学习的内容和网址: 斯巴达网站 斯巴达视频 python零基础 ...

  2. sae项目服务器,基于SAE的游戏服务器: Server on SAE for RGSS Games 部署在SAE上的简易游戏服务器,为用 RMXP/VX/VA 开发的游戏提供网络服务...

    本项目已经关闭 服务端已经关闭并且不再重启,后续请访问 RGSOS on Gitlab 基于SAE的游戏服务器 重写服务端逻辑中--暂时无法正常提供服务 功能 数据库封装 封装了 SAE 上的 Mem ...

  3. 电子定时器小项目 (基于STM32f103ZET6)

    今天,想和大家分享的是一个电子计算器的小项目,这个项目也和蓝桥杯某一年的省赛题有点类似. 这是我简单的绘制的一份流程图.可以存储5个定时的时间并且每一个都可以修改,通过while(1)循环一直判断是否 ...

  4. 【STM32小项目】-- 基于STM32芯片车载货物搬运系统研究

    文章目录 基于STM32芯片车载货物搬运系统研究 项目中的分工 资料 相关文书材料 基于STM32芯片车载货物搬运系统研究 项目中的分工 1.原理图,PCB等硬件相关设计以及项目实践总结 2.机械臂在 ...

  5. 聚类小分子数据集(基于RDKit的Python脚本)

    聚类分子(Clustering molecules) 聚类是一种有价值的化学信息学技术,用于将大型化合物数据集合细分为单个小组相似化合物.其中一个优点是处理非常大的小分子数据集时特别有用.通常用于分析 ...

  6. C语言小项目:基于ncurses库和链表的贪吃蛇小游戏

    目录 一.项目准备 二.项目步骤 (1)选择ncurses库的原因 (2)ncurses库的基本入门 (3)贪吃蛇地图的整体规划 (4)实现贪吃蛇第一个节点的显示 (5)显示贪吃蛇的完整身子 (6)实 ...

  7. c++小项目:基于STL的演讲比赛流程管理系统

    一.项目目的 运用c++实现一个基于STL的演讲比赛流程管理系统. 比赛方式 共两轮,第一轮为分组淘汰赛,第二轮为决赛,共有十名评委,打分方式为去掉最高分和最低分的平均分为基准 第一轮共两组,每组六人 ...

  8. 简单小项目:基于Mplayer的视频播放器(Linux)

    目录 0 视频演示 1 makefile 2 头文件 public.h show.h do.c 3 源文件.c 主函数main.c show.c do.c 4 项目资源下载 https://downl ...

  9. 【已验证成功】【DIY小项目】基于CY7C68013A的逻辑分析仪

    我做这个,主控花了19块(某宝),74HC245PW-Q100J当时某宝七毛一个,剩下的元件在立创买的,电阻电容大部分一块钱买50个,AT24C02买了10个三块一毛八,RT9013-33GB买了10 ...

最新文章

  1. SpirngMVC jsp页面空指针
  2. python经典好书-有哪些 Python 经典书籍?
  3. spring webmvc使用ResponseBody前,在配置文件中的配置
  4. oracle: 在sqlplus中,执行sql语句
  5. html jquery ajax乱码问题,jquery使用ajax提交中文乱码问题的解决
  6. WinForm窗体拖动代码
  7. UFLDL教程: Exercise:Self-Taught Learning
  8. (转)Spring4.2.5+Hibernate4.3.11+Struts2.3.24整合开发
  9. php中的一些编程例子
  10. JDBC常用API和使用
  11. 心得体会计算机辅助设计实训,cad实训的心得体会模板
  12. YALMIP工具箱之解决半定规划问题的SDPT3求解器安装
  13. 服务器备案全流程超级详细
  14. 深度思考 | 比低水平效勤奋重要百倍
  15. 第三章 眼睛的目视光学系统
  16. C# 之AutoCAD标注样式定义
  17. ADB屏蔽知乎视频答案
  18. android DAY1--搭建开发环境与Helloworld
  19. 互联网行业入门必读书籍
  20. 2019聊大考研计算机调剂,聊城大学2019考研调剂信息

热门文章

  1. 三相逆变器双pi控制器参数如何调节_学术简报基于内模原理的并网逆变器双模PI控制...
  2. 〖Python 数据库开发实战 - MongoDB篇④〗- Linux环境下的MongoDB数据库安装
  3. word保存提示“由于文件许可错误,word无法完成保存”的解决办法
  4. 淘淘商城--生成订单
  5. SpringBoot设置文件虚拟路径映射
  6. 如何通过远程桌面连接 重启电脑
  7. 交互细节分析——注册登录
  8. 记录支持显示代码行号和图片插入功能
  9. 当导入js文件时报了Cannot set property 'marginRight' of undefined
  10. IntelliJ IDEA 发布13版本——创造java奇迹