用于在线游戏的 Java 机器人

Posted

技术标签:

【中文标题】用于在线游戏的 Java 机器人【英文标题】:Java bot for an online game 【发布时间】: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: use Robot while running fullscreen app 的可能重复项 也许不是,我觉得这家伙对游戏中运行的机器人有问题……我认为这也是游戏对机器人的防御系统。 【参考方案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);
    

希望这会有所帮助!

【讨论】:

以上是关于用于在线游戏的 Java 机器人的主要内容,如果未能解决你的问题,请参考以下文章

如何为 gtalk 创建一个搜索在线帮助 Java 的机器人?

创建一个 Flash 游戏机器人

用Java开发50个棋类游戏

Java应用诊断和在线debug利器bistoury介绍与在K8S环境使用

树莓派能玩啥游戏

结对编程——Java实现黄金分割点游戏