2018年2月20日更新。。今天闲的,更新了个系统,然后发现再连手机,得提示是否授权此计算机调试。。忘了该怎么办了,于是又刷回之前的老系统。。还是提示这个。。晕死。。原来开个ROOT。。就好了。。特此记录浪费的两个小时时间
。。。。发现跳的分数被删除了,懒得做实物模拟真实触摸了。。。。通过这个学的东西也不少,就这样吧。。
最近这个微信的跳一跳小程序真的是大火,各路大牛搞了各种各样的辅助工具,看着这个游戏界面并不复杂,上学期又学了MATLAB的图像处理(不过感觉MATLAB做这个可能真的是杀鸡用了牛刀,但又不知道有哪些更合适的工具)
首先我是找到了废弃一年的小米3手机(屏坏了,手机之前还没开OTG,所以一直扔着了),今天我刚刚知道了怎么去官方进行解锁,清除了所有数据,然后重新刷了开发版ROM,红红火火恍恍惚惚哈哈哈,手机OTG可以用了(这是今天玩所有东西的基础),所以那就可以随意玩了,连上鼠标,键盘,立马开ROOT(现在在用的手机舍不得ROOT啊),于是了解到了通过ADB工具可以通过指令来进行手机的点击,按键等等,是真的好用。
把所有的权限都开好,查资料,知道了Chrome的Vysor插件可以实时控制Android手机,用了真的是非常强大,非常流畅。更棒的是,屏幕还可以实时通过网址进行读取,比如我那会儿地址是http://127.0.0.1:53516/screenshot.jpg?password=14e6b3b4
直接通过浏览器就可以访问,那么,MATLAB必然也可以实时进行读取了,哈哈哈。
这玩意主要的功能程序就在MATLAB上了(这是实现效果的关键),图像很简单,没有复杂的遮挡和干扰。随意的写,现在把代码粘上来,希望有大牛也能帮我优化优化代码,MATLAB还是不熟,很多函数不知道,很多功能就是完全根据自己瞎想写的,时间复杂度很高,执行速度很慢。通过MATLAB读取蹦跳角色和平台的相对位置,乘一个系数转换成时间,通过ADB下发到手机,完工。
clear;
n=50;%设置本次运行跳多少次
while(n>0)
n=n-1;
im=imread('http://127.0.0.1:53521/screenshot.jpg?password=a081da6');%实时读入图片
gdata=rgb2gray(im);%灰度化,用来找平台
cutimg = imcrop(gdata,[0 650 1100 700]);%剪切图片
gdata = cutimg;
subplot(1,3,1);
imshow(gdata);
drawnow;
bwdata=im2bw(cutimg,0.25);%二值化,用来找角色
%以下代码用来找角色
subplot(1,3,2);
imshow(bwdata);
drawnow;
%imwrite(bwdata,'1.png','png');%用来取特征输出图形
%找特征图形
[xtmp,ytmp]=find(bwdata==0);
flag=1;
while(flag==1)
[juesex,xmax_n]=max(xtmp);%找到最下面的一个黑点
juesey=ytmp(xmax_n);
if juesey>1057
juesey = 1057;
end
if bwdata(juesex-60,juesey)==0&&bwdata(juesex-135,juesey)==0&&bwdata(juesex-204,juesey)==0&&bwdata(juesex-182,juesey+23)==1&&bwdata(juesex-117,juesey+24)==1
flag=0;
else
%不能一次删除一整行,若左侧有黑边会有bug而且效率低 bwdata(juesex,1:1080)=1;%%所找点不符合另四个特征
for i=juesey:30:1080
bwdata(juesex-30:juesex,i:i+30)=1;
if(i>=1080||juesex>=670||bwdata(juesex+31,i)==1)
break;
end
end
[xtmp,ytmp]=find(bwdata==0);
imshow(bwdata); drawnow;
end
end
hold on;
%scatter(ytmp,xtmp);
scatter(juesey,juesex);
%找角色结束
%以下代码用来找平台
gdata=edge(gdata,'canny');
%根据角色将寻找范围减半
if(juesey>540)
gdata(1:701,539:1080)=0;
else
gdata(1:701,1:541)=0;
end
gdata(1:701,537:543)=0;
subplot(1,3,3);
imshow(gdata);
drawnow;
%gdata=medfilt2(gdata,[4 4]);%滤波
%imshow(gdata);
[xtmp,ytmp]=find(gdata==1);[pingtaix,minx_n] = min(xtmp);%找到平台的上边缘,并找到其下标
pingtaiy=ytmp(minx_n);%平台的y坐标已经找到(横轴)
%从y轴向下找中心
xtmp = find(gdata(:,pingtaiy) ==1);
for i=1:100
if xtmp(i)-xtmp(1)>10
break;
end
end
%若两点差距不大,肯定是干扰,直接根据上边缘向下减一定值来确定中心。
if xtmp(i)-xtmp(1)<10
pingtaix = pingtaix + 80;
else
pingtaix = (xtmp(i)+xtmp(1))/2;
end
hold on;scatter(pingtaiy,pingtaix);
%找平台结束
pingtai=[pingtaix,pingtaiy];
juese = [juesex,juesey];
d = int16(norm(pingtai-juese))*1.4;
str = ['adb shell input swipe 1070 1900 1070 1900 ',num2str(d)];
text(0,100,num2str(n),'fontsize',50,'color','r');
system(str);
pause(1.5);
save nfile n;
clear;%每次循环清除一次变量,要不然越来越卡
load nfile;
end
%!adb shell input swipe 700 1079 700 1079
%subplot(3,3,3);