You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Robot类按键异常:宝可梦刷闪光脚本仅触发一次按键

宝可梦闪光刷取脚本Jar运行异常问题分析

闲时启动了一个小项目,近期回归宝可梦游戏并捕获了第一只闪光宝可梦(颜色反转的稀有宝可梦),为批量刷闪光宝可梦开发了如下Java脚本:

import java.awt.Color;
import java.awt.Robot;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class App {
    public static void main(String[] args) throws Exception {
           
         JFrame f = new JFrame();
         String name=JOptionPane.showInputDialog(f,"Enter Name");
    
    if (name.equals("go")){
        Redo(); 
    } 
    }

   public static void Redo()throws Exception {
        Robot robot = new Robot();
       
       robot.delay(5000);
             robot.keyPress(10);
           robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10); 
            robot.delay(3000);
            robot.keyPress(10);
            robot.delay(3000);
            robot.keyPress(10);
           
            check();

          
    }

   public static void check() throws Exception{
        Robot robot2 = new Robot();
        Color color2 = new Color(255,255,185);
        Color color = robot2.getPixelColor(1080, 446);
        
        if ( color.equals(color2)==true){
           // System.out.println("shiny found!");
            System.exit(0);
        }
        else{
            robot2.keyPress(123);
           // System.out.println("no shiny ");
            Redo();
        }

   } 
}

脚本预期

输入"go"后切换到游戏窗口,Robot模拟多次Enter键进入战斗,check方法检测指定坐标(1080,446)的像素颜色,匹配闪光特征色(255,255,185)则退出程序,否则按F12重启循环。

问题现象

IDE测试正常,但打包成Jar运行时,游戏仅识别一次Enter键,约15秒后触发F12重启。


问题根源及解决方案

核心问题:缺少keyRelease调用

AWT的Robot.keyPress()仅负责按下按键,必须配对调用keyRelease()才能完成一次完整的按键输入。IDE调试环境可能存在隐式的按键释放逻辑,但Jar包独立运行时没有这个补充,导致第一次keyPress(10)后Enter键一直处于按下状态,游戏只会识别第一次按下动作,后续重复的keyPress(10)不会被判定为新的按键输入。

修复后的代码

import java.awt.Color;
import java.awt.Robot;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class App {
    // 复用Robot实例,避免重复创建
    private static final Robot ROBOT;

    static {
        try {
            ROBOT = new Robot();
        } catch (Exception e) {
            throw new RuntimeException("初始化Robot失败", e);
        }
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        String name = JOptionPane.showInputDialog(f, "Enter Name");

        if ("go".equals(name)) {
            startShinyHunt();
        }
        f.dispose(); // 关闭输入窗口,避免后台残留
    }

    public static void startShinyHunt() {
        try {
            // 等待5秒切换到游戏窗口
            ROBOT.delay(5000);

            // 模拟9次完整的Enter按键操作
            for (int i = 0; i < 9; i++) {
                pressAndReleaseKey(10); // Enter键码
                ROBOT.delay(3000);
            }

            checkForShiny();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void checkForShiny() {
        Color targetColor = new Color(255, 255, 185);
        Color currentColor = ROBOT.getPixelColor(1080, 446);

        if (targetColor.equals(currentColor)) {
            System.exit(0);
        } else {
            // 完整触发F12按键
            pressAndReleaseKey(123);
            // 重启狩猎流程
            startShinyHunt();
        }
    }

    // 封装完整的按键按下+释放逻辑
    private static void pressAndReleaseKey(int keyCode) {
        ROBOT.keyPress(keyCode);
        ROBOT.delay(50); // 模拟真实按键的按下时长,提升兼容性
        ROBOT.keyRelease(keyCode);
    }
}

额外注意事项

  • 权限问题:Jar运行时需确保拥有系统级输入模拟权限,Windows下建议以管理员身份运行,Mac需在「系统设置-隐私与安全性」中授予辅助功能权限。
  • 窗口焦点:必须在delay(5000)的时间内将游戏窗口切换为前台活跃窗口,否则Robot的输入会发送到其他窗口。
  • 坐标准确性:游戏分辨率、窗口缩放比例变化会导致目标像素坐标偏移,需重新确认闪光特征对应的坐标位置。

内容的提问来源于stack exchange,提问作者Jubs Eest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:56:01