第一次写“辅助”软件(微信游戏跳一跳)

前言

        第一次看到这个跳一跳的游戏是在微博上,微博的照片上有个人站在窨井盖上,下面一群人“哈哈哈哈哈哈哈哈哈”。我的第一反应是,这是啥?

        后来才知道是一个很火的微信小游戏叫跳一跳,玩了一会儿,发现像我这种手残党基本不适合此类游戏。仔细研究了一下,发现有破解的可能,虽然我这技术很烂,和那些玩机器视觉的大牛比不了。但是觉得理论上可行,于是就萌生了写个外挂的想法。

        从用户的角度来思考,就两点:

        一、眼睛看距离

        二、手指控制按键时间的长短

        这两点,我完全可以写个程序搞定啊,说到底就是个函数嘛。输入距离,返回按键时长。可这是个什么函数呢?

我在心里默念了二百遍,一定要是线性的啊!去坛子里转了一圈,貌似很多人都说是线性的,后来写完程序后测试了一下也确实如此。感谢上帝,要不是线性的,用神经网络什么的拟合,我就要疯了。

        废话不多讲,直接上代码,不看代码的同学可以直接看最后的使用说明。

*********************************************************************************************************************************

#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.按下空格键完成跳跃。如此循环。

                 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值