RPAロボットでソリティアに挑戦してみた

#きっかけ
　@RyoMoriseaさんの記事で、[挑戦者求む！ソリティアをRPAで自動化させてみた！](https://qiita.com/RyoMorisea/items/ccd6c8a4bd7486734835)という面白い記事があったので、それに触発されてやってみることにしました。

#Googleのソリティア
　@RyoMoriseaさんの記事やITMediaの記事では、Microsoftのソリティアを使用しているようですが、私は以前[Googleのゲームを自動化](https://qiita.com/Yusuke_Nishioka/items/ac487dbf987ac4b3c6b3)していることもあり、Googleのソリティアに挑戦することにします。こっちはブラウザさえあればだれでも遊べます。

　遊び方は簡単。Googleで「Solitaire」と入力するだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/e6fd4fa9-a199-8d17-b055-2ed48cba1f1d.png)

#ルールの確認
　早速自動化……と言いたいところだけど、実は私はソリティアのルールをよく知らなかった。とりあえず遊んでみる。

　ううーん……なんだかよくわからんけど、右端のスペースに１から順番にカードを入れて行けばいいわけだな！　とりあえず適当にクリックしてたらクリアできた。適当でもクリア出来るんだから、ロボットにも出来るだろう。たぶん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/80371b36-cd89-d2f4-d990-fd90a9781b78.png)

#ロボットの作成
　ほんじゃ早速作って行こう。使うソフトはUiPathだ。このソフトは個人だと無料で使えて、機能も高性能なのでおすすめ。見た目もダークモードだとかっこいい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/0e0e2343-3c7b-f165-1953-680ce530b4cc.png)

　私の最初の作戦は……「とにかくカードをクリックしまくってクリアする」だ。自分で適当にやってもクリアできたんだから、ブルートフォースアタックでクリア出来ちゃんじゃない？　という単純な理由。

　早速クリックアクティビティを配置し、カードを選択すると……おお、カードが一枚一枚認識できる！　これは楽勝なのでは……？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/f08fb0e0-f8da-a442-5674-cf735901d721.png)

　セレクターを覗いてみると、カードはCanvas要素で出来ているらしい。この`idx='52'`と記述されている部分がカードの番号なので、この部分を変数化してループで回してやれば、ひたすらカードをクリックしまくるロボットが出来る。

　あっという間にロボット１号が完成した。さあ挑戦だ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/f4edf11d-08dc-e9f3-9def-0797401a0185.png)

　おお……いい感じに動いている。動作も軽快で、これは早くも攻略できてしまったか？　と思った。思ったのだが……

　結論から言うと、ダメだった。ある程度までゲームが進むと、膠着状態になってしまい、クリア不可能になってしまった。

#ロボットの改良
　ロボット１号は何がダメだったかというと、とにかくどのカードでもクリックしてしまうこと。せっかく右端にカードを送っても、再びそれをクリックしてしまい、場にカードを戻してしまう。また、山札は下にあるカードをクリックしても一番上のカードをめくる仕様になっている。おかげでせっかく１があるのに、読み飛ばしてしまった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/3a2a2b64-5b8f-246d-c2f0-02b960d70193.png)

　結局クリアするには、右端のスペース以外のカードで、表になっているカードを認識してクリックするしかないという結論に至った。

　どうやって認識するか？　それは……この小さいスペースを画像認識するのだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/06254a02-a2cc-e1ba-53ea-f98b1b8e49ef.png)

　ついでに余計な場所をクリックしないように、画面上でスコープを設定した。これで右のスペースのカードをクリックすることもない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/d23478c1-f142-8af0-0650-12e51507ff47.png)

　表のカードを全部検出すると、次は山札をクリックするようにする。これは非常にシンプル。表のカードをクリックして、山札をめくるだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/e39ea531-6943-e30f-332a-ed0fe9e605e0.png)

　そして出来上がったロボットがコレ。上の二つのシーケンスを無限ループに放り込んだだけ。それじゃあ早速動かしてみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/802adeba-6e55-7fe4-f628-3ab4676cfae5.png)

#二回目の挑戦
　ロボットを起動させると……いい感じに動いている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/8ed9f355-2cad-28b2-b94c-14bef2a4a325.png)

　そしてロボットを放置して掃除しながら待つこと１５分。ロボットがソリティアをクリアした！　やったぞ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545204/b5dcc5e4-c7ff-eb9d-4f5b-283ce552cde3.png)

　その後も何度か動かしてみたが、上手くいくこともあれば上手くいかないこともあった。５分くらいでクリアすることもあれば、いくら待ってもクリアできないこともある。こればっかりはカードの組み合わせというものだろう。

　これ以上ロボットを改良するとなると……カードの数値と記号をOCRで読み取るか、画像マッチングで数値と記号を判別するしかないと思う。ちょっとやってみたが、私には果てしない道に思えた。今回はこれくらいで勘弁してもらいたい。

#ロボットで攻略するゲーム募集
　何回かやってみて思ったが、RPAでゲームを攻略するのは結構楽しい。もしこういうゲームを攻略してほしい、というのがあれば、言ってもらえると嬉しいです。