【问题标题】:Java bot for an online game用于在线游戏的 Java 机器人
【发布时间】:2012-08-26 18:07:42
【问题描述】:

我正在使用java.awt.Robot 在 java 中创建一个机器人。该机器人在浏览器上运行良好(我也使用 Microsoft Word 对其进行了测试!)但是当我在游戏中运行它时,唯一可以运行的函数是 mouseMove。我想为我构建一个只需按下键盘按钮的机器人。

我实例化机器人类

Robot r = new Robot();

然后我做一些简单的事情: 按z,按1,移动鼠标右键。

r.keyPress(KeyEvent.VK_Z);
r.keyRelease(KeyEvent.VK_Z);

r.keyPress(KeyEvent.VK_1);
System.out.println("Press 1 button");
r.keyRelease(KeyEvent.VK_1);
System.out.println("Release 1 button");
r.delay(1000);

System.out.println("Move mouse");
r.mouseMove(110, 690);

System.out.println("Press");
r.mousePress(InputEvent.BUTTON3_MASK);
System.out.println("Release");
r.mouseRelease(InputEvent.BUTTON3_MASK);

为什么会这样?如果这个 Robot 类在后台运行,它可以在游戏中执行这些动作吗?

谢谢

更新:例如,如果我在 PES 2012 上运行我的机器人,它可以正常工作,但如果我在像阴谋集团这样的在线游戏上运行它,它就不能工作?游戏的保护系统没有检测到任何东西,所以情况并非如此。

【问题讨论】:

  • 游戏经常对机器人进行“防御”——这只是一种可能性。
  • 尝试在keyPresskeyRelease 事件之间添加几毫秒的延迟。如果这是一款普通的街机风格游戏,那么我敢打赌,该游戏只是轮询每个滴答声以查看按键是否当前按下,而不是捕捉诸如“按键按下”和“按键释放”之类的瞬时事件.
  • 试过了,还是不行……
  • 也许不是,我觉得这家伙对游戏中运行的机器人有问题……我认为这也是游戏对机器人的防御系统。

标签: java bots awtrobot online-game


【解决方案1】:

这在很大程度上取决于它是什么类型的游戏。 如果代码只是模拟键盘操作等系统输入。它应该看起来像一个普通人。

但是从它的外观来看。从你的例子。它以闪电般的速度运行,因此它可能根本没有检测到输入,和/或反机器人措施对你试图机器人的所谓游戏进行了测量。正在阻塞输入。将延迟混合在一起。看看是否有帮助。我会回来寻求更多帮助。这点我不专业。但这是我的最佳猜测。

编辑:

当我的意思是延迟在触发按键事件之前放置一个延迟。这样它就有时间处理按键。

【讨论】:

  • 没有。没用我在按键事件触发器之间添加了一些延迟
【解决方案2】:

首先,大多数游戏都有机器人保护,因此请确保为机器人添加延迟,也许还有“冷却时间”。在r.delay(1000) 声明之前,机器人做了两个即时操作。

我几乎可以肯定它不起作用,因为击键速度太快了:它们会立即按下并释放。在你实例化 Robot 类之后尝试添加bot.delay(500)(或更多,取决于游戏);在所有按键功能之前。这会在机器人完成的所有动作之间增加 500 毫秒的延迟。

public static void doStuff() {

    Robot r = new Robot();

        r.delay(500); //Or more - depends on the game

        r.keyPress(KeyEvent.VK_Z);
        r.keyRelease(KeyEvent.VK_Z);

        r.keyPress(KeyEvent.VK_1);
        System.out.println("Press 1 button");
        r.keyRelease(KeyEvent.VK_1);
        System.out.println("Release 1 button");
        r.delay(1000);

        System.out.println("Move mouse");
        r.mouseMove(110, 690);

        System.out.println("Press");
        r.mousePress(InputEvent.BUTTON3_MASK);
        System.out.println("Release");
        r.mouseRelease(InputEvent.BUTTON3_MASK);
}

我认为 Z 和 1 键不起作用的唯一原因是完成所有操作的速度。游戏可能有一个反机器人系统。

【讨论】:

    【解决方案3】:

    您的代码可能会在游戏中过快地按下和释放按键。 经常有游戏要求您至少延迟 40 毫秒至 80 毫秒来按下和释放键。试试这个应该会有所帮助 -

    public static void doSomething() throws Exception{
        Robot rbt = new Robot();
        int typingTimes = 20;
        while(timer-- > 0){
            rbt.keyPress(KeyEvent.VK_1);
            //You can use Thread.sleep() after each keyPress to increase the delay
            Thread.sleep(500);
            rbt.keyRelease(KeyEvent.VK_1);
            
            rbt.keyPress(KeyEvent.VK_Z);
            //You can use Robot's delay() method after each keyPress too
            rbt.delay(500);
            rbt.keyRelease(KeyEvent.VK_Z);
        }
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2011-05-13
      • 2014-08-16
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多