冒险岛左右移动攻击,定时加血加蓝加BUFF JAVA实现

时间:2024-02-29 13:56:48

最近练了一个品克缤,抗性很高,发现手动比较累,但是又不想买辅助。所以就写了一段代码来控制键盘完成自动攻击,加血加蓝。

由于不能适应血条到一定程度加血,所以以下代码只适合品克缤这一角色,只适用于怪物在一个平台的,比如莎翁小镇2 比如 哈闷。

大体思路就是,一个动作视为一个线程,往左移动和往右移动由于同时只做一件事,所以往左移动和往右移动写在一个线程里。

以下代码只能前台控制,即冒险岛为主要窗口的时候有效。

更加复杂的键盘鼠标操作可以使用,按键精灵,但是按键精灵只支持单线程,就是次序执行的,所以什么时候加血,什么时候加蓝,什么时候加BUFF会乱。

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.Date;
/**
 * 左右移动攻击,在指定时间内加血加蓝加buff
 * @author Administrator
 *
 */
public class KeyRunnable{
    public static void main(String[] args){
          Robot myRobot;
          try {
          myRobot = new Robot();
          //加载左右移动线程
          KeyLeftAndRight lr = new KeyLeftAndRight(myRobot);
          Thread thread1 = new Thread(lr);
          //加载攻击线程
          KeyA a = new KeyA(myRobot);
          Thread thread2 = new Thread(a);
          //加载加血线程
          KeyRed red = new KeyRed(myRobot);
          Thread thread3 = new Thread(red);
          //加载加蓝线程
          KeyBlue blue = new KeyBlue(myRobot);
          Thread thread4 = new Thread(blue);
          //加载加buff线程
          KeyBuff buff = new KeyBuff(myRobot);
          Thread thread5 = new Thread(buff);
          
          //启动所有线程
          thread1.start();
          thread2.start();
          thread3.start();
          thread4.start();
          thread5.start();
          
          } catch (AWTException e) {
                e.printStackTrace();
          } 
    }
}
/**
 * 向左移动7秒,向右移动7秒
 * @author Administrator
 *
 */
class KeyLeftAndRight implements Runnable{
    private Robot r;
    public KeyLeftAndRight(Robot robot){
        this.r = robot;
    }
    @Override
    public void run() {
        while(true){
            try {
                long begin = System.currentTimeMillis();
                long end = System.currentTimeMillis();
                while((end-begin)/1000<7){
                    pressLeft(r);
                    end = System.currentTimeMillis();
                    System.out.println("左边"+new Date());
                    Thread.sleep((int)(Math.random()*100+150));
                }
                while((end-begin)/1000<(7+7)){
                    pressRight(r);
                    end = System.currentTimeMillis();
                    System.out.println("右边"+new Date());
                    Thread.sleep((int)(Math.random()*100+150));
                }    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void pressLeft(Robot r){
        r.keyPress(KeyEvent.VK_LEFT);
        r.keyRelease(KeyEvent.VK_LEFT);    
    }
    public static void pressRight(Robot r){
        r.keyPress(KeyEvent.VK_RIGHT);
        r.keyRelease(KeyEvent.VK_RIGHT);    
    }
}

/**
 * 攻击按键 线程类 设置A为攻击键
 * @author Administrator
 *
 */
class KeyA implements Runnable{
    private Robot r;
    public KeyA(Robot robot){
        this.r = robot;
    }
    @Override
    public void run() {
        while(true){
            r.keyPress(KeyEvent.VK_A);
            r.keyRelease(KeyEvent.VK_A);
            try {
                Thread.sleep((int)(Math.random()*100+150));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//加血线程类 N键  18秒加一次血 ,目前由于无法检测到血量 所以 不能做到精确加血
class KeyRed implements Runnable{
    private Robot r;
    public KeyRed(Robot robot){
        this.r = robot;
    }
    @Override
    public void run() {
        while(true){
            try {
                pressKey(r,KeyEvent.VK_N);
                Thread.sleep(18*1000);
                System.out.println("加了一下血"+new Date());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }        
    }
    public static void pressKey(Robot r,int key){
        r.keyPress(key);
        r.keyRelease(key);    
    }
}
//加蓝线程类 30秒加一次蓝
class KeyBlue implements Runnable{
    private Robot r;
    public KeyBlue(Robot robot){
        this.r = robot;
    }
    @Override
    public void run() {
        while(true){
            try {
                pressKey(r,KeyEvent.VK_J);
                System.out.println("加了一下蓝"+new Date());
                Thread.sleep(30*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }        
    }
    public static void pressKey(Robot r,int key){
        r.keyPress(key);
        r.keyRelease(key);    
    }
}

//加Buff线程类 180秒加一次Buff 为了buff不中断 所以设置为10秒加一次 
class KeyBuff implements Runnable{
    private Robot r;
    public KeyBuff(Robot robot){
        this.r = robot;
    }
    @Override
    public void run() {
        while(true){
            try {
                System.out.println("加了一下Buff"+new Date());
                Thread.sleep(10*1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }        
    }
    public static void pressKey(Robot r,int key){
        r.keyPress(key);
        r.keyRelease(key);    
    }
}