本来想尝试一下通过电脑控制手机去截屏
然后自动把截屏上传到电脑
做完以后,
突然想起来前两天
有学生在我的课堂上玩微信的“跳一跳”游戏
(不知道的朋友请搜索微信小程序)
这个游戏非常简单
跳跃到隔壁的方块上即可
比谁的精读高,稳定性强
竟然在上课的时候玩
于是本青椒很生气
后果很严重
当然了
我这么温柔的青椒
决定用程序击败他们
让他们觉得自己在这个游戏上
没有拿第一的希望
从此认识到
"戏海无边
回头是岸"
不玩这个游戏
好好学习天天向上
好了
废话不多说
直接上程序思路:
一,获取游戏时候的图像。
什么?_?不知道怎么获取?简单,安装的一个ADB,什么是ADB? Android Debug Bridge,不知道的同学请自己百度哈(别告诉我你不知道怎么百度)。安装完ADB,然后在手机上开启USB调试模式即可。
安装成功后,在命令行输入adb version 系统返回ADB 版本号
要想看看手机是否连接成功
可以输入adb devices
如果手机连接成功,将会显示连接的设备 (如果没有显示设备,先运行adb kill-server,再重新运行 adb devices)
二,对图像进行处理,获取新物块的位置和小人当前的位置
具体怎么获取位置,详见后面程序哈。
如图所示
三,然后就是根据距离的远近去控制不同的点击时间长度,距离越远,点击时间越长。有些同学会说:这还用你讲?
哈哈,请注意,本青椒说的是通过程序去控制点击时间的长短。
好了
看看程序的运行效果:
同学们
我闪人了
MATLAB源代码
% 截屏
system('adb shell /system/bin/screencap -p /sdcard/screenshot.png');
% 将图像传到电脑
system('adb pull /sdcard/screenshot.png d:/adb调试/jump.png');
image=imread('jump.png');
gray = rgb2gray(image);
bw = edge(gray,'Canny');
roi = bw(301:end,:);
imshow(roi);
% 求物块中心位置
obj_y1 = find(sum(roi,2)>=3);
obj_x = find(roi(obj_y1(1):obj_y1(1),:)==1);
ave_x = floor(mean(obj_x));
obj_y2 = find(roi(:,ave_x-2:ave_x+2)>=1);
temp = find(obj_y2-(obj_y1(1))>50);
ave_y = floor((obj_y1(1)+obj_y2(temp(1)))/2);
% 求小人中心位置
if ave_x
roi2 = roi(:,640+1:end);
base = 640;
else
roi2 = roi(:,1:440);
base = 0;
end
man_y1 = find(sum(roi2,2)>=5);
man_obj_x = find(roi2(man_y1(1):man_y1(1),:)==1);
% man_obj_x = find(sum(roi2(man_y1(1):man_y1(1),:),2)>=3);
man_x = floor(mean(man_obj_x(1:min(size(man_obj_x,2)-2,8))))+base;
man_y2 = find(roi(:,man_x-1:man_x+1)>=1);
% temp = find(man_y2-(man_y1(1))>50);
% man_y = floor((man_y1(1)+man_y2(temp(1)))/2)
% distance = sqrt((ave_x-man_x)^2 + (ave_y-man_y)^2);
imshow(image);
hold on
plot([ave_x,ave_x],[ave_x,0],'c')
plot([ave_x,ave_x],[ave_x,1920],'c')
plot([man_x,man_x],[man_x,0])
plot([man_x,man_x],[man_x,1920])
hold off
press_time = int16(abs((ave_x-man_x))*142/90);
pos = randi([340,740],1,2);
str = ['adb shell input swipe 500 300 500 300 ', num2str(press_time)];
system(str)
pause(2)
领取专属 10元无门槛券
私享最新 技术干货