再次献丑。
之前写过一个“穿越福城”助手,感觉是个大失败…参数很难调,稳定性也非常差,不想改进了。然而第二个小游戏好白痴…不打算给它写助手了,就写第三个的吧。
这个“灯笼高高挂”就比较好做了,参数用对了之后,只要不手动停下来,它就永远都不会输。跑到六百多就不想跑了。
主要思想:
先写一个能算周期的程序跑一会儿,能够发现,在最好的情况下(掉下来的房子大小不变),前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();
}
}