java 阴阳师个人脚本

一、思路

通过Robot类,进行鼠标移动和鼠标点击。然后当截图为什么的情况下,就做出对应的事情。
主要有两个类,一个是写图片类,一个是主类
githun:https://github.com/E-10000/-OnmyojiPlus
注意:JIntellitype是另外的一个包,自己上GitHub导入

二、图片类

package main;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class writeImage {
    public static void main(String[] args) throws AWTException, IOException {
        Robot robot=new Robot();
        robot.delay(3000);
        saveImg(980,784,10,10,"御灵结束");
    }

    /*
    int x ,X轴
    int y ,Y轴
    int width,宽
    int height,高
    String pngName ,图片的名字(不用+PNG,默认补上PNG)
    String pathname,图片路径,没用则默认保存在E:\阴阳师\img下
    * */
    static void saveImg(int x,int y,int width,int height,String pngName,String pathname) throws AWTException, IOException {
        Robot robot=new Robot();
        robot.delay(3000);
        BufferedImage bufferedImage =robot.createScreenCapture(new Rectangle(x,y,width,height));
        robot.mouseMove(x,y);
        File file=new File(pathname+"\\"+pngName+".png");
        OutputStream os=new FileOutputStream(file);
        ImageIO.write(bufferedImage,"png",os);
    }


    static void saveImg(int x,int y,int width,int height,String pngName) throws AWTException, IOException {
        Robot robot=new Robot();
        robot.delay(3000);
        BufferedImage bufferedImage =robot.createScreenCapture(new Rectangle(x,y,width,height));
        robot.mouseMove(x,y);
        String pathname="D:\\idea\\OnmyojiPlus\\img";
        File file=new File(pathname+"\\"+pngName+".png");
        OutputStream os=new FileOutputStream(file);
        ImageIO.write(bufferedImage,"png",os);
    }
}

三、主类

package main;

import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;
import org.junit.Test;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import static com.sun.java.accessibility.util.AWTEventMonitor.addKeyListener;

public class gotoStart {
    public static final int FUNC_KEY_MARK = 1;
    public static final int EXIT_KEY_MARK = 0;

    public gotoStart() throws AWTException, InterruptedException {

        //添加全局监听器
        JIntellitype.getInstance().registerHotKey(FUNC_KEY_MARK,JIntellitype.MOD_ALT,(int)'Q');
        JIntellitype.getInstance().registerHotKey(EXIT_KEY_MARK,JIntellitype.MOD_ALT,(int)'D');

        JIntellitype.getInstance().addHotKeyListener(new HotkeyListener() {
            @Override
            public void onHotKey(int i) {
                switch (i){
                    case FUNC_KEY_MARK:
                        System.out.println("test");
                        break;
                    case EXIT_KEY_MARK:
                        System.out.println("程序结束!!!!!");
                        System.exit(0);
                        break;
                }
            }
        });

        Robot robot=new Robot();
        robot.delay(3000);
        ArrayList<BufferedImage> images =new ArrayList<>();
//        images.add(getBfImageFromPath(new FileInputStream("src/img/御灵挑战")));
        images.add(getBfImageFromPath("E:\\阴阳师\\img\\卑弥呼结束.png"));
        images.add(getBfImageFromPath("E:\\阴阳师\\img\\协同取消.png"));
        images.add(getBfImageFromPath("E:\\阴阳师\\img\\卑弥呼挑战.png"));
        images.add(getBfImageFromPath("E:\\阴阳师\\img\\御灵挑战.png"));
        images.add(getBfImageFromPath("E:\\阴阳师\\img\\御灵结束.png"));
        BufferedImage tempImg=null;
        int i=-1;

        while (true){
            //这个是根据情况返回对应的时间
            i=-1;
            i = chooseThingReturnNum(images);
            System.out.println(i);
            switch (i){
                //卑弥呼打完
                case 1:{
                    next();
                    break;
                }
                //协同任务点击取消
                case 2:
                    mouseRandomMoveTrueArea(1275,783,21,22);
                    mouseSwitchClick("left");
                    break;
                //点击卑弥呼挑战
                case 3:
                    mouseRandomMoveTrueArea(1645,878,180,158);
                    mouseSwitchClick("left");
                    break;
                //挑战御灵
                case 4:
                    mouseRandomMoveTrueArea(1620,875,180,170);
                    mouseSwitchClick("left");
                    break;
                //御灵结束
                case 5:{
                    next();
                    robot.delay(randomNum());
                    break;
                }

                //其他情况,就什么都没有,鼠标随机移动,有长时间移动和短时间移动
                case -1:
                    int choose= (int) (Math.random()*2);
                    if (choose==1){
                        int a=randomNum(1,0.5);
                        System.out.println(a);
                        robot.delay(a);

                    }else{
                        int b=randomNum(3,2);
                        System.out.println(b);
                        robot.delay(b);
                    }
                    randomMove();
                    break;
            }//switch(i)

        }//while(true)

    }



    //@String 图片的绝对路径。从本地文件读取目标图片
    static public BufferedImage getBfImageFromPath(String keyImagePath) {
        BufferedImage bfImage = null;
        try {
            bfImage = ImageIO.read(new File(keyImagePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bfImage;
    }

    /*
    最核心的部分,代码块从这里修改
     */
    public static int chooseThingReturnNum(ArrayList<BufferedImage> images) throws AWTException {
        Robot robot=new Robot();
        for (BufferedImage image:images){
            //匹配是否为卑弥呼结束
            if (matchImg(image,robot.createScreenCapture(new Rectangle(900,800,100,100)))){
                System.out.println("匹配到了卑弥呼结束");
                return 1;
            }//有人要来协同任务的时候
            else if (matchImg(image,robot.createScreenCapture(new Rectangle(1275,783,21,22)))){
                System.out.println("匹配到了协同取消");
                return 2;
            }//是否在卑弥呼点挑战之前
            else if(matchImg(image,robot.createScreenCapture(new Rectangle(1690,920,90,74)))){
                System.out.println("匹配到了要挑战卑弥呼");
                return 3;
            }//御灵挑战
            else if(matchImg(image,robot.createScreenCapture(new Rectangle(1670,907,98,86)))){
                System.out.println("匹配到了要挑战御灵");
                return 4;
            }//御灵结束
            else if(matchImg(image,robot.createScreenCapture(new Rectangle(980,784,10,10)))){
                System.out.println("匹配到了要御灵结束");
                return 5;
            }
        }
        System.out.println("什么都没匹配到,随机移动");
        return -1;
    }

    /*
    随机移动到我自己设定的4个区域中的某一点,并且点击
     */
    public static void next() throws AWTException, InterruptedException {
        //随机移动到一个区域中
        int random= (int) (Math.random()*4);
        switch (random){
            //移动到左上角区域
            case 1:
                mouseRandomMoveTrueArea(0,0,1270,200);
                mouseRandomMoveTrueArea(0, 0, 1270, 200);
                mouseSwitchClick("left");
                break;
            //移动到左下角区域
            case 2:
                mouseRandomMoveTrueArea(0, 200, 200, 880);
                mouseSwitchClick("left");
                break;
            //右上角区域
            case 3:
                mouseRandomMoveTrueArea(1580, 70, 340, 630);
                mouseSwitchClick("left");
                break;
            //右下角区域
            case 4:
                mouseRandomMoveTrueArea(670, 700, 1250, 380);
                mouseSwitchClick("left");
                break;
        }//随机移动到某个区域结束
    }

    /*匹配图片,
     * 输入参数:sourceImg 本地源文件,最大不超过100*100
     * 		tempImg 当前系统捕抓到的部分屏幕,固定为100*100
     * 输出参数:true或者false
     * 检查捕捉图片的每一个像素点是否和本地的源文件一样,全部一样就返回TRUE,有一个不一样都返回FALSE
     */
    public static boolean matchImg(BufferedImage sourceImg,BufferedImage tempImg) {
        int height = sourceImg.getHeight();
        int width = sourceImg.getWidth();

        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int tempRGB = tempImg.getRGB(j, i);
                int testRGB = sourceImg.getRGB(j, i);
                if (tempRGB!=testRGB) {
                    return false;
                }

            }
        }
        return true;
    }//matchImg

    /*

    X,Y最大为1920和1080,隔一段时间后随机移动到某个位置,再隔一段时间
     */
    @Test
    public static void randomMove() throws AWTException {
        Robot robot=new Robot();
        int maxX=1920;
        int maxY=1080;

        double v=(0.2+Math.random()*0.3)*1000;
        robot.delay((int) v);
        int x = (int) (Math.random()*(maxX-1));
        int y = (int) (Math.random()*(maxY-1));
        robot.mouseMove(x,y);
        v=(0.2+Math.random()*0.3)*1000;
        robot.delay((int) v);
    }

    /*
    鼠标随机移动到正确的区域
    @参数分别为X轴,Y轴,宽,高
    返回参数:int [] array:array[0]为X轴,array[1]为Y轴
     */
    public static void mouseRandomMoveTrueArea(int x,int y,int width,int height) throws AWTException {
        int moveX= (int) (x+Math.random()*(width-1));
        int moveY= (int) (y+Math.random()*(height-1));
        Robot robot=new Robot();
        robot.delay(randomNum());
        robot.mouseMove(moveX,moveY);
    }

    /*
    @String key: left为按下左键,right为按下右键
     */
    public static void mouseSwitchClick(String key) throws AWTException, InterruptedException {
        switch (key){
            case "left":mouseClick(InputEvent.BUTTON1_DOWN_MASK);break;
            case "right":mouseClick(InputEvent.BUTTON3_DOWN_MASK);break;
            default:
                System.out.println("请填入正确的参数");
        }
    }

    /*
    @int buttons:与mouseSwitchClick函数配合使用
     */
    public static void mouseClick(int buttons) throws AWTException, InterruptedException {
        Robot robot=new Robot();
        robot.delay(randomNum());
        robot.mousePress(buttons);
        robot.delay(randomNum());
        robot.mouseRelease(buttons);
        robot.delay(randomNum());
        Thread.sleep(randomNum(0.5,0.2));
    }

    /*
    @double preTime:最小要几秒
    @double maxTime:随机的数字最大值
    @不写参数就默认(0.3+(0~0.3))
     */
    public static int randomNum(double preTime, double maxTime){
        int i = (int) ((preTime + Math.random() * maxTime) * 1000);
//        System.out.println(i);
        return i;
    }

    public static int randomNum(){
        int i = (int) ((0.3 + Math.random() * 0.3) * 1000);
//        System.out.println(i);
        return i;
    }

    public static void main(String[] args) throws AWTException, InterruptedException {
        new gotoStart();
    }//main
}

阴阳师是一款流行的角色扮演游戏,而“连点器”是指可以自动执行连续点击操作的软件或代码。为了避免不正当使用和违反游戏规则,我不建议提供具体的连点器代码。 在编写连点器代码时,你可以通过使用Java编程语言来实现。下面是一个可供参考的框架示例: ```java import java.awt.Robot; import java.awt.AWTException; import java.awt.event.InputEvent; public class YinYangShiClicker { public static void main(String[] args) { try { Robot robot = new Robot(); // 设置点击间隔时间(ms) int delay = 1000; // 获取目标点击位置的屏幕坐标 int targetX = 100; int targetY = 100; // 循环执行点击操作 while(true) { robot.mouseMove(targetX, targetY); robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); // 休眠指定时间 Thread.sleep(delay); } } catch (AWTException | InterruptedException e) { e.printStackTrace(); } } } ``` 该示例利用了Java的`Robot`类来模拟鼠标点击动作。它会将鼠标移动到目标位置,然后按下鼠标左键并立即释放。之后通过线程休眠指定的时间,以实现连续点击效果。 编译运行以上代码后,你需要将游戏窗口调至指定位置,将`targetX`和`targetY`变量设置为该位置的屏幕坐标。你还可以根据需要调整点击间隔时间`delay`来控制点击的速度。 请注意,使用连点器可能会违反游戏规则,并可能导致账号被封禁。在玩任何游戏时,请遵守游戏的规定并尊重其他玩家和开发者的努力。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值