目录

说明:

Robot类的介绍

 Robot类API

主要思路

代码实现

工具方法

脚本源代码

实现结果


说明:

本篇文章主要运用java中的Robot类,实现Microsoft Store微软商店中《别踩白块-钢琴大师》游戏的全自动脚本功能,原理非常简单,十分适合初学者学习。

Robot类的介绍

Robot类用于为测试自动化、自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件。Robot 的主要目的是便于 Java 平台实现自动测试

 Robot类API

方法名使用说明使用实例
delay(n)延迟电脑操作n毫秒,类似于Thread.sleep()robot.delay(1000);
keyPress()模拟手动按下电脑键盘上的某个键robot.keyPress(KeyEvent.VK_SPACE); //按下空格键
keyRelease()模拟手动松开电脑键盘上的某个键(与keyPress()对应,按下一个键必须松开这个键)robot.keyRelease(KeyEvent.VK_SPACE); //松开空格键
mouseMove(x,y)将鼠标移动到指定的x,y位置robot.mouseMove(300, 400); //将鼠标移动到距离左边框300px,距离上边框400px的位置
mousePress()按下鼠标上的某个键robot.mousePress(InputEvent.BUTTON1_MASK); //按下左键 robot.mousePress(InputEvent.BUTTON2_MASK); //按下滚轴键robot.mousePress(InputEvent.BUTTON3_MASK); //按下右键
mouseRelease()松开鼠标上的某个键robot.mouseRelease(InputEvent.BUTTON1_MASK); //松开左键 robot.mouseRelease(InputEvent.BUTTON2_MASK); //松开滚轴键robot.mouseRelease(InputEvent.BUTTON3_MASK); //松开右键
getPixelColor(x,y)获取x,y点像素坐标robot.getPixelColor(10,20)

主要思路

制作该游戏全自动脚本的主要思路是:

(1)使用robot.getPixelColor(x,y)获取判断最下列4个方格块中某一个像素点的颜色

(2)如果像素点颜色等于黑方框的颜色,使用robot.mouseMove(x,y)移动到x,y坐标点

并使用robot.mousePress(InputEvent.BUTTON1_MASK)点击鼠标左键,在点击之后使用robot.mouseRelease(InputEvent.BUTTON1_MASK)松开鼠标左键

代码实现

工具方法

测像素点X,Y坐标和RGB颜色的工具方法 返回{x,y,red,green,blue}

    public static int[] testPoint() throws Exception {
        Robot robot = new Robot();
        //可以设置返回结果的时间 比如2000ms 则2秒后返回结果
        robot.delay(2000);
        // 获取鼠标的坐标
        PointerInfo pinfo = MouseInfo.getPointerInfo();
        Point p = pinfo.getLocation();
        int x = (int) p.getX();
        int y = (int) p.getY();
        // 获取鼠标坐标颜色
        Color color = robot.getPixelColor(x, y);
        int red = color.getRed();
        int green = color.getGreen();
        int blue = color.getBlue();
        // 返回鼠标的坐标和颜色数组
        int[] arr = new int[] { x, y, red, green, blue };
        return arr;

    }

最后测得第一个方框中心点X,Y坐标大概是(732,670)每个方框的间距是150 RGB颜色是(59,56,53)   (不同电脑的分辨率可能有误差 以实际测量为准 所得数据皆为本人所测)

脚本源代码

public class WhiteMouse {
    public static void main(String[] args) throws AWTException, InterruptedException {
        //程序运行前延时1s
        Thread.sleep(1000);
        runRoot();
        
    }
    
    public static void runRoot() throws AWTException, InterruptedException {
        Robot robot = new Robot();
        while (true){
            for (int i = 0; i < 4; i++) {
                Color pixelColor = robot.getPixelColor(732 + i * 150, 670);
                int red = pixelColor.getRed();
                int green = pixelColor.getGreen();
                int blue = pixelColor.getBlue();
                //有的游戏因渲染可能存在误差 所以求得像素点颜色与比对颜色差的绝对值<5 判断成功 否则失败
                if (Math.abs(red-59)<5 && Math.abs(green-56)<5 && Math.abs(blue-63)<5){
                    //此处加循环是因为 鼠标移动有可能bug移动不到指定位置 循环几次保证鼠标移动到指定位置
                    //但是不能循环过多 占用CPU
                    for (int j = 0; j < 3; j++) {
                        robot.mouseMove(732 + i * 150, 670);
                    }

                    robot.mousePress(InputEvent.BUTTON1_MASK);
                    robot.delay(1);//防止按键过快 让robot休息一下 如果经常失误则延长时间
                    robot.mouseRelease(InputEvent.BUTTON1_MASK);

                }
            }
        }
    }
}

实现结果

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐