前言
     人在美国,刚下飞机,在等行李的时候写下这篇博客,纪念一下我长达两天的踩坑史,以及一种新的思维,面向百度编程,本文介绍的是如何用python做钢琴块脚本,用到模块有

  • PIL模块
  • numpy模块
  • ctypes模块(使用动态链接库)

正文
    好,接下来就开始漫长的踩坑史了,Are you ready?
ADB坑
    一开始,我想的是在手机上进行触屏操作,还别说,真有这东西

工具包我打包了,点击此处下载 密码:xsx3

放在你的工作目录下(其实可以不用全放的,但是全放肯定没问题) ,手机打开usb 调试,
然后打开ADBDriverInstaller.exe:

点击之后就可以关闭了

进入工作目录,cmd,输入命令:

adb shell

出现一大串参数就代表没问题,

介绍几个会用到的adb命令:

//(保存到SDCard)
adb shell /system/bin/screencap -p /sdcard/screenshot.png
// 从SD卡导出到电脑,注意 F:\\mvp 为电脑路径,必须存在
adb pull /sdcard/screenshot.png F:\\mvp(保存到电脑)
//在(x,y)处模拟点击
adb shell input tap x y

然后在介绍下 PIL模块:

from PIL import Image
import numpy as nppath=""    #path为图片路径
img=np.array(Image.open(path))#img为这张图片的三维矩阵[y][x][r,g,b]

如果在某一点的rgb相加小于100,那么它就是可以点击的地方,即为黑色方块。纵坐标固定,横坐标检查四个点对应四列,要不是因为我测试了一下截一张图传到电脑上要两秒,点击一下要一秒,我差点就兴奋了,怎么玩,一次要三秒,开什么玩笑,还不如手玩,果断认同放弃ADB

于是我苦思冥想,痛定思痛,终于灵光一现,有没有一种方法,是可以直接在电脑上操作手机,而不需要向ADB这么慢的呢,很庆幸,答案是有的!!!傲软投屏,满足你的一切需求,支持逆向操作!! 界面如图:

利用鼠标可以模拟手机点击,果断百度python 如何操作鼠标,有一个库是pyhook,刚好满足这种需求,结果我编译器安装失败,百度一看

原文链接https://www.cnblogs.com/nymrli/p/9557023.html
哈哈哈,如果一个钩子算邪恶,那windows API岂不是罪大恶极?该放弃时就要放弃,稍加思索,决定写一个动态链接库来操作鼠标点击,新建一个文件夹命名为Pro1,新建一个文件命名为Click.c放在Pro1文件夹下。Click.c内容如下

#include<windows.h>
#include<stdio.h>void click(int x,int y){//定义一个方法,传坐标参数SetCursorPos(x, y);//移动鼠标到(x,y)mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//鼠标左键点击}

这里稍微介绍一下mouse_even,原文链接https://blog.csdn.net/THmen/article/details/78249422

然后用gcc 把它编译成动态链接库,步骤如下:

  1. 打开cmd,进入Pro1目录下
  2. 输入命令
  3. gcc -m64 -shared Click.c -o Click.dll//如果python是32位的就用-m32
  4. 回车

然后就发现在你的Pro1目录下有一个Click.dll文件了

如何用这个动态库呢

安装ctypes模块,pycharm界面如下:

来测试一下这个点击的速度吧,在Pro文件夹下新建test.py

from ctypes import  *
import  _thread #这个模块需要安装
import timetest=CDLL("./Click.dll")
class date:Count=0 #存储点击次数def t(name,n):#至少要两个参数,随便填while True:test.click(500,500)date.Count+=1
_thread.start_new_thread(t,("ll",1))
time.sleep(1)#过一秒
print("在一秒钟之内点击了{n}下".format(n=date.Count))

除去加载图片的时间,也绰绰有余了木有,哈哈,很好的开端,为了少走弯路,使数据计算的更简单,我们要耍点聪明,把傲软录屏拖到左上角,如图:


尽量保持手机左上角和电脑屏幕左上角对齐,此时坐标为(0,0),经过测验,右下角坐标为(450,805),数据出来直接上整代码

import numpy as np
from PIL import ImageGrab
from ctypes import *BOX=(0,699,450,701)
screen=np.array(ImageGrab.grab(BOX)#截取纵坐标从699到701,横坐标为0到450的屏幕区域
click=CDLL("./Click.dll")
def click(x,y):#自定义鼠标点击方法,引用Click动态链接库click.click(x,y)def judge(x,y):#判断(x,y)是不是深色像素sum=int(screen[y][x][0])+int(screen[y][x][1])+int(screen[y][x][2])    #要强转型为int 原型为0~255的类型,这里对(x,y)这个像素点的rgb求和,纯黑为(0,0,0)if(sum<=100):#如果为深色return Truereturn False
while True:screen=np.array(ImageGrab.grab(BOX)#不断更新选屏区for n in range(0,4):if(judge(int(56.25+N*113),1)):#经过不断计算,发现横坐标取这四个点最为合适,纵坐标实际上为699+1click(45 + 90 * n, 565)#此处进行了单位转换,上面的单位是像素点,这里的我也不知道是什么,数据是经过计算得出的,我用着没事

至此,只能说大概完成了,但是还有bug,当我按下一个黑色方块后,下一帧的时候,我又会接着去按那个按过了的方块,所以要杜绝这种情况的发生,代码修改如下:

import numpy as np
from PIL import ImageGrab
from ctypes import *BOX=(0,699,450,701)
screen=np.array(ImageGrab.grab(BOX)#截取纵坐标从699到701,横坐标为0到450的屏幕区域
click=CDLL("./Click.dll")
def click(x,y):#自定义鼠标点击方法,引用Click动态链接库click.click(x,y)def judge(x,y):#判断(x,y)是不是深色像素sum=int(screen[y][x][0])+int(screen[y][x][1])+int(screen[y][x][2])    #要强转型为int 原型为0~255的类型,这里对(x,y)这个像素点的rgb求和,纯黑为(0,0,0)if(sum<=100):#如果为深色return Truereturn False
N=-1#上一帧点击了哪一列的方块,初始值为-1
while True:screen=np.array(ImageGrab.grab(BOX)#不断更新选屏区for n in range(0,4):if(judge(int(56.25+N*113),1)):#经过不断计算,发现横坐标取这四个点最为合适,纵坐标实际上为699+1if(n!=N):#如果上一帧的所在列和现在的不同N=n#更改Nclick(45 + 90 * n, 565)#此处进行了单位转换,上面的单位是像素点,这里的我也不知道是什么,数据是经过计算得出的,我用着没事

到这里,已经差不多了,但是如果万的分数多了,就会出现一个问题,
比如,这一次我点击了第三列,但是我领了金币之后,下一个方块又从第三列下来,那么照它的逻辑,就game over!!了,所以得杜绝,更改如下

import numpy as np
from PIL import ImageGrab
from ctypes import *BOX=(0,699,450,701)
screen=np.array(ImageGrab.grab(BOX)#截取纵坐标从699到701,横坐标为0到450的屏幕区域
click=CDLL("./Click.dll")
def click(x,y):#自定义鼠标点击方法,引用Click动态链接库click.click(x,y)def judge(x,y):#判断(x,y)是不是深色像素sum=int(screen[y][x][0])+int(screen[y][x][1])+int(screen[y][x][2])    #要强转型为int 原型为0~255的类型,这里对(x,y)这个像素点的rgb求和,纯黑为(0,0,0)if(sum<=100):#如果为深色return Truereturn False
N=-1#上一帧点击了哪一列的方块,初始值为-1
canC=False#是否可以点击
while True:screen=np.array(ImageGrab.grab(BOX)#不断更新选屏区for n in range(0,4):if(judge(int(56.25+N*113),1)):#经过不断计算,发现横坐标取这四个点最为合适,纵坐标实际上为699+1if(n!=N):#如果上一帧的所在列和现在的不同N=n#更改NcanC=Trueclick(45 + 90 * n, 565)#此处进行了单位转换,上面的单位是像素点,这里的我也不知道是什么,数据是经过计算得出的,我用着没事if (canC):if(judge(int(56.25+N*113),1)==False ):N=-1canC=False

至此,就没什么太大了的问题了,建议运行的时候电脑保持流畅,我最高跑了小星星 1073分




来闲扯两句,其实我不怎么用python的,搭建神经网络的时候用了下python,然后大一下学期的时候左字符串动画用了下,现在快大二了,小专科一个,能活到现在,多亏了度娘,这两天左这个东西,完全就是突发奇想,百度了两天,跑到1000多分的时候我已经兴奋了,本来是想着插上USB,再最后垂死挣扎一下,然后洗洗睡的,结果稍微改了下还跑成功了,差点喜极而泣,谢谢谢谢,已经语无伦次了,如果我这篇博客能帮到你,我会更开心

python钢琴块自动脚本相关推荐

  1. jupyter分割代码块_科研分享—Python根据关键词自动抓取Pubmed文献标题(附全部代码)文末有福利...

    写在前面:接触Python应该是8月初的一篇公众号文章,大致内容是使用py爬取数据库并汇总到本地.正好手头需要对某个领域的文献进行调研,不妨学习一下. 什么是Python? 百度说:Python (计 ...

  2. 使用shell脚本 控制 python挂掉后自动重启

    我们经常需要在后台运行一些python脚本,来监控系统或者做一些其他事情:但是 由于各种各样的问题,不是python脚本代码的问题:脚本运行过程中会挂掉.手动重启 不现实,天天耗在上面等重启... 所 ...

  3. 自动安装第三方库python,python第三方库自动安装脚本

    #python第三方库自动安装脚本,需要在cmd中运行此脚本 #BatchInstall.py import os libs = {"numpy","matplotlib ...

  4. python写自动脚本_用Python实现FGO自动战斗脚本

    我家黑贞! 1. 背景 Fate/Grand Order(非的肝不过欧的)作为索尼为了拯救自己不倒闭而开发的面向月厨的骗氪养成抽卡爆肝游戏,居然没有像隔壁<阴阳师>的自动战斗系统(看看别人 ...

  5. JAVA、Python、selenium、问卷星自动脚本

    项目地址 https://gitee.com/Hardy1/questionnaire-star-script 前期准备 配置jdk 安装python 下载安装mitmproxy 代码实现 项目中se ...

  6. python 首次登陆outlook 脚本_Python 黑魔法,执行任意代码都会自动念上一段 平安经...

    最近的"平安经"可谓是引起了不小的风波啊. 作为一个正儿八经的程序员,最害怕的就是自己的代码上线出现各种各样的 BUG. 为此,明哥今天分享一个 Python 的黑魔法,教你如何在 ...

  7. 用python写一个自动群发微信脚本

    使用 Python 写一个自动群发微信脚本需要使用微信第三方 API 来实现.推荐使用 itchat 库,它提供了简单易用的 API,可以方便地编写微信自动化脚本. 首先,你需要安装 itchat 库 ...

  8. Python 能预约自动预约脚本

    这里写自定义目录标题 Python 能预约自动预约脚本 数据库结构 代码 Python 能预约自动预约脚本 记录一下 数据库结构 使用的是MySQL,结构如下: 这个数据库用于存放要预约的信息,便于批 ...

  9. python实现阴阳师自动刷御魂脚本_用Python实现FGO自动战斗脚本

    我家黑贞! 1. 背景 Fate/Grand Order(非的肝不过欧的)作为索尼为了拯救自己不倒闭而开发的面向月厨的骗氪养成抽卡爆肝游戏,居然没有像隔壁<阴阳师>的自动战斗系统(看看别人 ...

最新文章

  1. 最常用的Python爬虫和数据分析常用第三方库,收藏吧
  2. C 语言指针 5 分钟教程
  3. JS DOM 对象
  4. 工信部:2019年全国继续加大网络提速降费力度
  5. ubuntu上virsh+kvm安装虚拟机
  6. deepin终端下载速度超慢解决方案
  7. kali新手入门教学(16)--如何在校园网下使用桥接模式上网
  8. Python语法都会,一写程序就懵,有解么?
  9. Androidstudio控制台分层输出接口日志.类似BeJSON,HiJson格式化JSON
  10. Python 植物大战僵尸代码实现
  11. 条形码jsbarcode
  12. macOS Big Sur 11.6.6 (20G624) 正式版 ISO、PKG、DMG、IPSW 下载
  13. SpringCloud 分布式日志采集方案
  14. 阿里云存储oss依赖报错解决方法
  15. 预训练(pre-training/trained)与微调(fine tuning)
  16. 买手机时几GB+几GB啥意思
  17. ISP Pipeline lens shading
  18. 数据表很多,sqlmap快速找出存放用户名和密码的表,一把梭
  19. chrome稍后阅读功能
  20. iconfont在ie8下不显示图标问题

热门文章

  1. 微分中值定理证明和总结
  2. 微信小程序入门五上滑加载下拉刷新
  3. 最简单的二维数组的筛选问题
  4. 脑卒中患者常见上肢训练中的脑部激活情况
  5. Python3 assert函数
  6. shiftdim 用法
  7. html量子效果,HTML5/Canvas量子隐形传输动画
  8. 如何解决上传大文件时(批量上传文件)系统卡死宕机的问题
  9. python 验证码识别 开源_Python 代码实现验证码识别
  10. 百度大脑车牌识别使用攻略