クターのウェブゲームと言ってわかる人がどのくらいいるか知らないが、かれこれクター歴が12年くらいになる。クター自体がもうすぐ18年でほぼ同い年(?)なのでかなり長い付き合い、というか一方的な追っかけ、になる。
それで、グレープのベント―9というゲームがあるのだが、これが死ぬほど苦手なのでじゃあ自動化しようという馬鹿丸出しの発想で今に至る。
といっても大したことはやっていない。
このゲーム、プレイ画面は下のようになっている。
下のマスのどれかをクリックして周りをひっくり返し、上の形にするという至極単純なゲームである。しかも与えられる盤面はすべて一度で目標形にできるという保証付き(それでも苦手なのだ)。
さて、このゲームをいかに解くかという問題は簡単に解決する。一度で目標形にできるわけだから、パターンは高々9通り。クリックするマスの周囲は必ず目標と色が異なっているから、結局は縦横各々両端の列で目標と一致しているかだけ調べればどこをひっくり返せばいいかわかる(下図、黒丸はひっくり返す点、赤は目標と異なるマス)。
問題は画面の読み取りや実際の操作をどうやって実装するかだが、java.awt.Robotで画面キャプチャからマウス操作までできるというのでJavaでやることにした。
詳細は省くが、Robot.getPixelColor(int x,int y)
で指定ピクセルの色を読み取り、上記手順に従って押すべきマスを判断、あとはRobot.mouseMove(int x,int y)
で指定ピクセルまでマウスを動かし、Robot.mousePress(int buttons)
でクリックしてやる。mousePressのあとmouseReleaseしてやらないと押しっぱなしになるので気を付けよう。
それと、この場合常時画面を監視する必要があるので並列処理しなければならない。といってもThreadを継承してrun()
をオーバーライド、実行の時にstart()
するだけなので特に難しいことはない。
(正直なところGUI作るほうが面倒だった)
実行画面。位置は手で調整しないといけないので監視範囲をキャプチャして表示している。
というわけで、GUIを使うデスクトップJavaアプリは初めてだったがうまくできたので良かった。しかしどう足掻いてもチートツールなので出番はほぼない模様。