作为一个编程人员,不论是花费时间还是money去玩一款养成类手游,都不是值得骄傲的事情。
利用闲暇时间,让电脑来完成这类的重复性工作,也是一个不错的选择;下面普及一下思路。
需要提前准备:
1.JDK1.8+MAVEN
2.Android模拟器(我用的是夜神)
3.mousexy(小工具:鼠标在屏幕上的位置坐标)
4.TESSERACT-OCR
前两个我们都很熟悉,第4个是图像识别技术的Java实现。接下来,就可以实现在游戏中自动的做任务啦。
简单说明一下思路:
1.打开安卓模拟器,下载打开游戏后,通过mousexy选取点坐标;
2.通过类Robot,来实现对于鼠标的click;
3.同样可以操作使用Robot类来操作键盘上的按键,实现角斗场的击打,技能等动作;
4.通过TESSERACT-OCR来确定当前属于哪一个界面状态,进而采取哪一个操作方案。
涉及到的技术点:
1)通过Java实现选点截屏:
BufferedImage bImage = robot.createScreenCapture(new Rectangle(x, y, width, height));
2)图像识别(作为‘开关’的作用),实为拼接cmd命令执行,并非Java提供了相应的API:
/*设置输出文件的保存的文件目录*/ File outputFile = new File(imageFile.getParentFile(), "output"); StringBuffer strB = new StringBuffer(); List<String> cmd = new ArrayList<String>(); /*tesseract的安装路径*/ cmd.add(tessPath + "\\tesseract"); cmd.add(""); cmd.add(outputFile.getName()); cmd.add(LANG_OPTION); /*利用简体中文字典*/ cmd.add("chi_sim"); ProcessBuilder pb = new ProcessBuilder(); pb.directory(imageFile.getParentFile()); cmd.set(1, imageFile.getName()); pb.command(cmd); pb.redirectErrorStream(true); /*执行cmd*/ Process process = pb.start();
3)多线程 - 角斗场
package demo.scene; import demo.thread.DoThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import static demo.utils.BooleanExp.*; import static demo.utils.MouseKvUtils.kvPressOne; import static demo.utils.MouseKvUtils.mousePressOne; import static java.awt.event.KeyEvent.*; public class ArenaScene { public static final Logger logger = LoggerFactory.getLogger(ArenaScene.class); public static void battle(){ /*等待角斗场加载10s*/ stop(10000); //创建线程池 ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); //奥义 - I//密卷 - N//通灵 - M//2s Thread thread1 = new DoThread(2000,() -> { logger.info("释放奥义/密卷/替身");kvPressOne(VK_I);kvPressOne(VK_N);kvPressOne(VK_M); }); //一技能 - J//二技能 - U//替身 - H//4s Thread thread2 = new DoThread(4000,() -> { logger.info("释放技能");kvPressOne(VK_J);kvPressOne(VK_U);kvPressOne(VK_H); }); //普攻//0.2s Thread hit = new DoThread(200,() -> { logger.info("攻击...");kvPressOne(VK_K); }); executor.execute(thread1); executor.execute(thread2); executor.execute(hit); //由进程负责监听 20s截屏校验确定一次状态 while (true){ stop(20000); if(isJBPage()) break; if(isRZDSPage()) break; //进入大蛇丸试炼 - 单独处理 if(isDSWGZPage() || isDSWZBJXPage()){ //结束各线程动作 executorIsOver(executor); //等待30s stop(30000); //点击返回 mousePressOne(134,689); break; } } executorIsOver(executor); } }
源码地址:https://github.com/top37/mineroot/tree/master/mytest-robot
===========================
后记:
关于以上提到的mousexy和TESSERACT-OCR两款软件,网上即可下载;若嫌麻烦或者有需要改进之处,可以加我微信,欢迎指正。