RPAロボットがGoogleのゲームに挑むようです。

#Googleでゲームが遊べること、知ってますか？
　実はGoogleには隠された機能があり、それをやるとゲームを遊ぶことができる。その一つが、「zerg rush」というゲームだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/c8b3db4f-415d-20b9-d109-8e16fb4e7150.png)

　前は検索で「zerg rush」と入れたら遊べたようだが、今はちょっと違うようだ。https://elgoog.im/zergrush/ にアクセスすると遊べる。

　このゲームは落ちてくる「〇」をクリックして倒すという、ただそれだけのゲームだ。「〇」によって検索結果が次々と侵食され、全て消えると負けになる。シンプルだけどそれなりに面白い。

#Zerg rush VS UiPath
　だが私は全然勝てなかった。あっという間に負けてしまう。ゲーマーの私としては悔しい。
　かくなる上は……私の代わりに、ロボットに戦ってもらう！

　UiPathを使おう。UiPathは非常に優秀なRPAツールだ。目標を正確に捕捉し、人間にはできないクリック速度で、あっという間に「〇」を駆逐してくれるに違いない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/3859689c-c9e3-6e76-d271-41f9c750fbf2.png)

　私はひとまず「一致する画像を探す」というアクティビティを使ってみることにした。このアクティビティは指定した画像を対象のアプリケーションから探し、見つかったものをコレクションとして返してくれる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/fbdffb60-24ff-fd57-22d1-919127c14ee0.png)

　こんな感じに画像を指定し、出力に変数を指定しよう。型は`IEnumerable<UiPath.Core.UiElement>`だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/a5103df1-44e9-36d1-2176-428f4b941817.png)

　このコレクションを処理するために、「繰り返し（コレクションの各要素）」アクティビティを使用する。コレクションに先ほどの変数を指定する。itemは規定だとobjectになっているので、ちゃんと`UiPath.Core.UiElement`を指定しよう。そして本体の中にクリックを放り込み、クリック対象としてitemを指定する。

　このままだと一回画像を探したら終わってしまうので、「一致する画像を探す」と「繰り返し（コレクションの各要素）」を無限ループの中に放り込んだ。ちょっと乱暴だけど、今は目をつぶろう。私はゲームを倒したいだけだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/fbd9125e-c170-e86e-db9b-e7f01f504b86.png)

#一回目の対決
　準備は整った。さあ勝負だ。ロボットを起動すると、「ブラウザーを開く」アクティビティによりZerg rushが起動する。そして私の作ったロボットが次々と「〇」を破壊し……破壊し……あれれぇ？

　クリックが遅すぎて全然間に合ってない！　次々と破壊される検索結果。あっという間に勝負はついてしまった。ロボットは負けた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/1b559f06-e0af-932c-c124-1eb9da2c4ee6.png)

　そして、失意の中ロボットを止めようとすると……と、止まらねえ。無限ループで画面に残った「〇」をクリックしようとして、止めようとしてもすぐにポインタが移動してしまう。うわあああああああ！！

#ロボットを改良する
　目にもとまらぬマウスさばきにより、ロボットの暴走は止められた。

　……何がいけなかったんだろう。まず、画像の検出はできていた。クリックも動作していた。しかし、遅すぎたのだ。あの速度では、クリックしようとしている間に「〇」は移動してしまう。

　ならば、必要なのは速さだ。なんの、UiPathにはまだまだ速度を上げられる余地がある。本気を出せUiPath！！

##検索速度を見直す
　まずは「〇」の検索部分からだ。検索には種々の方法がある。その中でも、私が取ったのは最も遅い方法だった。画像の検索は時間がかかるのだ。

　ならば……画像以外による検索を試せばいい。まず、このゲームはどういう仕組みで動いているかだ。Canvas要素に描画されているのだとしたら、画像に頼るしかないが……「〇」がHTMLで記述されているのだとしたら、セレクターで検出できる余地がある。

　そのために、私は「要素を探す」アクティビティを使用することにした。このアクティビティは、UiPathのセレクタという機能をもとに、要素を検索することができる。私は恐る恐るターゲットを指定した。すると……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/c717d67e-37d8-a00c-e7e8-c4ed10cc9374.png)

　セレクタが生成できた！　「〇」はHTMLで構成されていたのだ。内容を確認してみると……概ねよさそうだが、`idx='hogehoge'`と記述された部分が気になる。私は`idx='*'`に修正した。

　セレクタを設定したら、検索した要素を変数に保存する。「一致する画像を探す」アクティビティと違い、返ってくるのは単一のUiElementだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/52dff8f4-da51-d519-9578-81692bd4a2ed.png)

　「〇」を見つけたら、次はクリックして攻撃する。クリックアクティビティをドロップし、ターゲットの要素に先ほどの変数を設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/0f898912-c914-be58-f3d6-673c47b84c7b.png)

　ここでさらに一工夫加えよう。クリックにはいくつかのモードがあり、デフォルトのモードは実は一番遅い。「クリックをシミュレート」をTrueにする。これでさらに速度がアップする。そのうえ、マウスポインタが移動しなくなるので、ロボットを止めようとして止められない、なんてこともなくなるはずだ。

　さらに、クリックアクティビティにはデフォルトで実行前の待機時間と実行後の待機時間が設定されている。これを0にしてしまおう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/6781d53e-d672-65cc-92d1-d315e777dd01.png)

　そしてさっきロボットを動かして気づいたが、「〇」は三回連続でクリックしないと倒せないようだった。クリックアクティビティをコピーし、三つ並べよう。黒い三連星だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/d37641b6-6332-f248-8f93-0e49e675c26d.png)

#二回目の対決
　これで改良版ロボットが完成した。いざ勝負……と思ったところで、さらに早くできる要素があることに気付いた。
　それはデバッガの「要素のハイライト」だ。多分これがないほうが早い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/3b68a67d-81fe-4114-ff0d-84193a977215.png)

　さあ、改めて勝負！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/516dce43-eaf9-d51f-818e-60b09ee55fe1.png)

　は、早い……早すぎてクリックが見えない。「〇」は出現しても一瞬で消滅してしまう。ロボットの圧倒的なパワーに、「〇」はなすすべもなく沈んでいった。

　私は勝ったのだ。ゲームのスコアを表すCountは217でストップした。

　クリックをシミュレートモードにしたので、ロボットの停止も問題なくできる。

　ああ、スッキリした。