“灯笼高高挂”助手

再次献丑。

之前写过一个“穿越福城”助手,感觉是个大失败…参数很难调,稳定性也非常差,不想改进了。然而第二个小游戏好白痴…不打算给它写助手了,就写第三个的吧。

这个“灯笼高高挂”就比较好做了,参数用对了之后,只要不手动停下来,它就永远都不会输。跑到六百多就不想跑了。

主要思想:

先写一个能算周期的程序跑一会儿,能够发现,在最好的情况下(掉下来的房子大小不变),前7个房子的周期都是3s,随后4个是2.6s,随后5个是2s,随后6个是1.6s,剩下的都是1s的。因此估算出下一次房子变成最大的时刻,提前一定时间按下去就好了。注意1s的比较快,要提前得多一点。

如果你想自己尝试一下下面的代码,记得先修改LEFT_X等坐标范围的参数。底下的0.94和0.88根据自己的电脑情况改。鼠标要放在游戏界面里。

在这里插入图片描述刷分一时爽,一直刷分一直爽

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class Assistant 
{
	final int LEFT_X = 93, LEFT_Y = 198, RIGHT_X = 264, RIGHT_Y = 217; // 游戏界面的位置,我习惯把它放在电脑屏幕的左侧
	
	final int HOUSE_R = 109, HOUSE_G = 63, HOUSE_B = 56; // 房子墙壁最右侧的颜色
	
	BufferedImage screenCut; // 游戏截图
	
	void getScreenCut() throws AWTException // 截图
	{
		Robot robot = new Robot();
		screenCut = robot.createScreenCapture(new Rectangle(LEFT_X, LEFT_Y, RIGHT_X-LEFT_X, RIGHT_Y-LEFT_Y));
	}
	
	void alwaysGetRGB() throws AWTException, InterruptedException // 最终程序用不到。写程序时用来取颜色,是一个不断显示鼠标指向位置RGB值的死循环
	{
		for(;true;)
		{
			Thread.sleep(100);
			Robot robot = new Robot();
			BufferedImage screenCut = robot.createScreenCapture(new Rectangle(0, 0, 2000, 1000));
			Point point = MouseInfo.getPointerInfo().getLocation();
			int x = point.x, y = point.y;
			int RGB = screenCut.getRGB(x, y);
			int B = RGB & 0xFF, G = RGB >> 8 & 0xFF, R = RGB >> 16 & 0xFF;	   
			System.out.println(x + ", " + y + " : " + R + " " + G + " " + B);
		}
	}
	
	boolean equalRGB(int R1, int G1, int B1, int R2, int G2, int B2) // 容许误差的RGB相等
	{
		return Math.abs(R1-R2) + Math.abs(B1-B2) + Math.abs(G1-G2) < 30;
	}
	
	boolean testRGB(int SIDE_X, int SIDE_Y)
	{
		int RGB = screenCut.getRGB(SIDE_X - LEFT_X, SIDE_Y - LEFT_Y);
        int B = RGB & 0xFF, G = RGB >> 8 & 0xFF, R = RGB >> 16 & 0xFF;
        return equalRGB(R, G, B, HOUSE_R, HOUSE_G, HOUSE_B);
	}
	
	void pressAfter(double _time) throws InterruptedException, AWTException // 一定时间后按下鼠标
	{
		int time = (int)_time;
		Robot robot = new Robot();
		Thread.sleep(time-10);
		robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
		Thread.sleep(50);
		robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
		Thread.sleep(1000);
	}
	
	Assistant()
	{
		try
		{
			int no = 0;
			
			while(true)
			{
				getScreenCut();
				
				if(!testRGB(262, 199) && !testRGB(262, 216)
				&& !testRGB( 94, 199) && !testRGB( 94, 216)) continue; // 提高灵敏度
				
				++no;
				System.out.println(no);
				
					 if(no <=  7) pressAfter(3000 * 0.94);
				else if(no <= 11) pressAfter(2600 * 0.94);
				else if(no <= 16) pressAfter(2000 * 0.94);
				else if(no <= 22) pressAfter(1600 * 0.94);
				else  			  pressAfter(1000 * 0.88);
				
					
			}

		}
		catch(Exception e)
		{
			System.out.println(e);
		}
	}

	public static void main(String[] args)
	{	   
		new Assistant();
	}

}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值