java.awt.Robot 這個類別,顧名思義就是機器人,它可以控制鍵盤、滑鼠、抓螢幕…,方法項目不多,但比起市面上一些滑鼠鍵盤控制軟體(如 EZScript),java.awt.Robot 不但功能性有過之而無不及,撰寫彈性更是 Macro、Script 程式無法比擬的。
FarmVille 是有提供犁田工具,不過一次犁四格的道具,使用上是有受到汽油量的限制,一格一格去犁的熱情,一般人大概到十來級就消退了吧!偏偏耕田整地是主要的經驗值與金錢來源,這時候有個自動犁田的方法,不知道有多好。
觀察一下規則不難發現,犁田、播種、收割都是有規則性的重複動作,每格田的大小也都一致,這就意味著滑鼠只要依規則移動,且固定按下滑鼠左鍵,就可以完成耕作的動作。
既然有規則,java.awt.Robot 類別也提供滑鼠移動 mouseMove、按下按鈕 mousePress、釋放按鈕 mouseRelease 等方法,那要用 Java 完成農耕機器人,理論上是沒問題了。
還有樣前置工作必須先完成,就是計算田地間隔,以方便 xy 軸作適當的位移,個人作法是抓圖用繪圖軟體看座標:1. 先拉出紅線找出田地的中心點。2. 取多個紅線交叉點用藍點標注。 3. 計算藍點像素差異。(取越多點會越準確,這裡取得是 25,12)
再來就寫 Code 啦,簡單使用幾個 Method 而已,就直接用 Main Method 動工,偷懶一下。
import java.awt.AWTException; import java.awt.MouseInfo; import java.awt.Point; import java.awt.Robot; import java.awt.event.InputEvent; public class fvRobot { // 田地大小 / * \ private static int leftNum = 16; private static int rightNum = 16; public static void main(String[] args) { // 建立 Robot、座標 物件 Robot robot = null; Point location = null; // 起始座標、變數 int x = 0; int y = 0; int xStep = 25; // 田地間 x 間隔 int yStep = 12; // 田地間 y 間隔 int stepFlag = 1; // 間隔折返值 try { // 初始 Robot 物件 robot = new Robot(); // 延遲 10 秒使滑鼠有足夠時間移到田的頂點 robot.delay(10000); // 取得滑鼠資訊(座標) location = MouseInfo.getPointerInfo().getLocation(); x = (int) location.getX(); y = (int) location.getY(); for (int i = 0; i < rightNum; i++) { for (int j = 0; j < leftNum - 1; j++) { // 點選滑鼠左鍵 robot.mousePress(InputEvent.BUTTON1_MASK); robot.mouseRelease(InputEvent.BUTTON1_MASK); // 移動滑鼠(換格) robot.mouseMove(x -= xStep * stepFlag, y += yStep * stepFlag); // 延遲 1 秒 robot.delay(250); } // 點選滑鼠左鍵 robot.mousePress(InputEvent.BUTTON1_MASK); robot.mouseRelease(InputEvent.BUTTON1_MASK); // 跳脫最後一次滑鼠移動 if (i + 1 == rightNum) break; // 移動滑鼠(換行) robot.mouseMove(x += xStep, y += yStep); // 延遲 1 秒 robot.delay(250); // 倒置移動方向 stepFlag *= -1; } } catch (AWTException e) { e.printStackTrace(); } finally { robot = null; location = null; } } }
初步測試是成功的,但偶而會點到其他物件(如:角色、樹木),導致彈出小視窗,剩下動作就全部失效。
可以精進的部份很多,如:加上 GUI 界面方便設定要犁的範圍、判斷顏色避免誤開小視窗、計時機制自動收割…,誰說 Java 不能寫外掛?誰說程式課一定很無趣?強烈建議授課老師,作些與切身有關實用的課題,用 Java 玩 Facebook 程式設計應用,可以從簡單的 Class、Method 呼叫使用,進化到物件導向,再以 GUI 強化物件導向基礎,這堂課可教超過半個學期,半個學期都在玩 Facebook,又何必半夜不睡覺玩 Facebook 呢?希望有看到此篇劣作的老師們,好好思考這個問題。
考量到不是每個人都(必須)寫程式,但此範例又過於陽春,在不久的將來,會提供至少有設定畫面的 FV 機器人,此篇就先給大家聞香,有 Java 修改能力的人,就先參考嘗試看看吧!
哈囉,這個facebook遊戲在那,有網址嗎,我來試試
回覆刪除你的網站有點慢...
回覆刪除你說 FarmVille 種田遊戲?這篇參考看看
回覆刪除網站慢?基本上這是 Google 的服務,應該還好吧!?不過有些外部元件確實是會卡,這也是努力要改善的目標@@"
你好,我是java的初學者,看到你的範例,我也想自己寫一個來測試,但是要怎麼在jFrame裏顯示網頁的資料(顯示出來的都是html碼),我是用netbean開發工具,在java提供的元件中,我好像找不到可以顯示網頁的元件..,是要再外加元件還是有什麼其他方式呢???謝謝.
回覆刪除Java API 目前應該還沒有提供完整的 HTML Component,據我所知是需要第三方 Library,呼叫系統瀏覽器,或者是直接用 Java 寫的瀏覽器才有辦法較完整的支援 HTML,以上範例並不是設計一個專門 for 遊戲用的瀏覽器,只是在瀏覽器外面對遊戲"操作"。
回覆刪除另外 Java 預設元件支援部分的 HTML 功能,可以參考 這個網頁