欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-18 14:06:16
...

前言

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

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

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

        一、眼睛看距离

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

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

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

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

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

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