第一次写“辅助”软件(微信游戏跳一跳)
前言
第一次看到这个跳一跳的游戏是在微博上,微博的照片上有个人站在窨井盖上,下面一群人“哈哈哈哈哈哈哈哈哈”。我的第一反应是,这是啥?
后来才知道是一个很火的微信小游戏叫跳一跳,玩了一会儿,发现像我这种手残党基本不适合此类游戏。仔细研究了一下,发现有**的可能,虽然我这技术很烂,和那些玩机器视觉的大牛比不了。但是觉得理论上可行,于是就萌生了写个外挂的想法。
从用户的角度来思考,就两点:
一、眼睛看距离
二、手指控制按键时间的长短
这两点,我完全可以写个程序搞定啊,说到底就是个函数嘛。输入距离,返回按键时长。可这是个什么函数呢?
我在心里默念了二百遍,一定要是线性的啊!去坛子里转了一圈,貌似很多人都说是线性的,后来写完程序后测试了一下也确实如此。感谢上帝,要不是线性的,用神经网络什么的拟合,我就要疯了。
废话不多讲,直接上代码,不看代码的同学可以直接看最后的使用说明。
*********************************************************************************************************************************
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <math.h>
#define PARA 3.3; // for jumpTime
int repeatFlag=0;
bool getKey(char key)
{
if(GetAsyncKeyState(key) & 0x8000)
{
if(key=='R')
repeatFlag=1;
return true;
}
else
return false;
}
int main()
{
POINT mptrA,mptrB; //remember the coordinate of mouse
int jumpTime,distance;
std::cout<<"\t\t*******************Introduction*****************"<<std::endl;
std::cout<<"\t\t*********************BY Nirvana*****************"<<std::endl;
std::cout<<"\t\tpress A to set A point,press S to set B point"<<std::endl;
std::cout<<"\t\tpress space to jump,R to reset A and B point"<<std::endl;
while(1)
{
again:
while(getKey('A')) //A
{
GetCursorPos(&mptrA);
Sleep(500);
std::cout<<"\t\tget point A ("<<mptrA.x<<","<<mptrA.y<<")"<<std::endl;
}
while(getKey('S')) //B
{
GetCursorPos(&mptrB);
Sleep(500);
std::cout<<"\t\tget point B ("<<mptrB.x<<","<<mptrB.y<<")"<<std::endl;
}
distance=sqrt(pow((mptrA.x-mptrB.x),2)+pow((mptrA.y-mptrB.y),2)); //distance of the screen
jumpTime=distance*PARA;//need to modify
while(getKey(VK_SPACE)||getKey('R'))
{
Sleep(500);
if(repeatFlag)
{
std::cout<<"\t\tplease reset A point and B point"<<std::endl;
repeatFlag=0;
goto again;
}
else
{
std::cout<<"\t\tjump:"<<jumpTime<<std::endl;
std::cout<<"\t\tjump>>>>>>>>>>>>>>>>>>>>>>>>>"<<std::endl;
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(jumpTime);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
}
}
}
代码说明:
需要安装安卓虚拟机,让微信在电脑上跑起来,打开游戏后。利用鼠标量取距离,用mouse_event和Sleep结合控制按键的时间。
按下键"A"的时候,记录下鼠标所在位置A。按下键"S"的时候,记录下鼠标所在位置B。(因为这两个按键靠在一起,方便~~)。
然后计算一下,距离distance。通过乘宏里的参数PARA的得到按键时间的长短,按空格键实现跳跃的操作。
如果发现A,B两个位置没有记录对,可以按"R"重新记录。(R的意思是Repeat,而且距离其他三个按键比较远,不容易按倒~~)
实现效果如上图。理论上可以一直刷下去,但是作为测试已经够了。我是在windows平台下作的,linux的话,头文件需要修改,Sleep要改成sleep。
总结:
优点:
就两个字,简单。不需要拉其他库进来,就靠最傻逼的逻辑就能解决问题。
缺点:
1.不能完全实现自动,需要移动鼠标量取距离。(哎,学校里学的那些机器视觉早就还给老师了)
2.需要安卓虚拟机为平台。(手机的技能树,朕真的没有点啊!)
3.用户界面不好看。(我也无奈啊)
展望:
1.可以用机器视觉实现全自动,用python拉取第三方包进行截图后自动获得长度。
2.从开发者的角度,我觉得也可以进行**。距离这个参数必然是有上下界的,玩过一会就发现这么些个长度都是重复出现的。那八成是用了一个随机数发生器,随机在一定范围内产生长度,关键是种子是如何选取的,若果是我,我一定会选取目前的时间作为种子。那只要我得到种子,就能不量取长度而直接获得值。更加方便。
*************************************************************************************************************************
使用说明
所需工具:1.电脑
2.安卓模拟器(我用的是雷电,地址 http://www.ldmnq.com/)
3.代码产生的可执行文件,jump.exe(地址 https://gitee.com/Lagolas/WeiXinTiaoYiTiao-FuZhu)
步骤:1.安装好安卓模拟器,让微信游戏跑起来。
2.在dos下,打开jump.exe,监测鼠标行为。
(参考:https://jingyan.baidu.com/article/414eccf6343deb6b431f0aca.html)
3.将鼠标移动到跳跃的起始位置(注意不要单击,移动即可),按下A键,记录位置A(dos上会有显示)。
4.鼠标移动到跳跃终点位置,按下S,记录B点位置。
5.发现移动的位置不对,可按R,重新输入。
6.按下空格键完成跳跃。如此循环。