2008年7月27日星期日

扎绵羊机器人

玩扎绵羊走火入魔,一怒之下写了个扎绵羊机器人。

原理超级简单,就是让计算机自动判断绵羊的出现并在按钮上方点击鼠标。
很粗糙的一个Java程序,根据不同显示器分辨率和浏览器需要手动调整代码。
我的是1024*768,Firefox3默认布局,启动前滚动条滚动到扎绵羊开始页面顶部。

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.InputEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class Cap {
    static final int SIZE = 10;
    Robot robot;
    Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
    Color[] detector = new Color[SIZE];;
    Point[] ps = new Point[SIZE];

    public Cap() throws AWTException {
        robot = new Robot();
        for (int i = 0; i < 10; i++) {
            ps[i] = new Point(255, 280 + i * 44);
        //    ps[10 + i] = new Point(355, 285 + i * 44);
        //    ps[20 + i] = new Point(410, 290 + i * 44);
        }
    }

    BufferedImage capture() {
        return robot.createScreenCapture(rect);
    }

    void shoot() {
        robot.mouseMove(550, 660);
        robot.mousePress(InputEvent.BUTTON1_MASK);
        robot.mouseRelease(InputEvent.BUTTON1_MASK);
    }
    void update(){
        for (int i=0; i < SIZE; i++){
            detector[i] = robot.getPixelColor(ps[i].x, ps[i].y);
        }
    }
    void showDetector() {// debug
        robot.delay(500);
        for (Point p : ps) {
            robot.mouseMove(p.x, p.y);
            robot.delay(200);
        }
    }
    static boolean closeTo(Color c1, Color c2){
        return c1.equals(c2);

    }
    public static void main(String args[]) throws AWTException, IOException {
        Cap c = new Cap();
        if (args.length > 0) {
            c.showDetector();
            return;
        }
        // wait to switch to firefox window
        c.robot.delay(1000);
        // press to start
        c.shoot();
        // wait the fog disappear
        c.robot.delay(500);
        // make detector
        c.update();
        // When different from detector, shoot
        int bullet = 5;
        while (bullet > 0) {
            c.robot.delay(20);
        //    long t = System.currentTimeMillis();
            for (int i = 0; i < SIZE; i++) {
                int x = c.ps[i].x;
                int y = c.ps[i].y;
                Color colorNow = c.robot.getPixelColor(x, y);
                if (!closeTo(colorNow, c.detector[i])) {
                    c.shoot();
                    bullet--;
                    System.out.println(i);
                //    c.detector[i] = colorNow;
                    c.robot.delay(500);
                    c.update();
                    break;
                }
            }
        //    System.out.println(System.currentTimeMillis() - t);
        }
    }

}
在 命令行启动程序后,赶快Alt+Tab切换到Firefox界面上来,然后你就看着绵羊一只只死在屏幕最左边吧XD(我现在作弊后的成绩是0.02秒多一 点,已经接近Flash Player的计时函数的误差了(在我机器上setTimeout的误差约0.01秒(测量误差不计)))
P.S.用了这么久Java,才知道有java.awt.Robot这么一个类,JDK里真是充满了宝藏啊~

没有评论: