#きっかけ
@RyoMoriseaさんの記事で、挑戦者求む!ソリティアをRPAで自動化させてみた!という面白い記事があったので、それに触発されてやってみることにしました。
#Googleのソリティア
@RyoMoriseaさんの記事やITMediaの記事では、Microsoftのソリティアを使用しているようですが、私は以前Googleのゲームを自動化していることもあり、Googleのソリティアに挑戦することにします。こっちはブラウザさえあればだれでも遊べます。
遊び方は簡単。Googleで「Solitaire」と入力するだけ。
#ルールの確認
早速自動化……と言いたいところだけど、実は私はソリティアのルールをよく知らなかった。とりあえず遊んでみる。
ううーん……なんだかよくわからんけど、右端のスペースに1から順番にカードを入れて行けばいいわけだな! とりあえず適当にクリックしてたらクリアできた。適当でもクリア出来るんだから、ロボットにも出来るだろう。たぶん。
#ロボットの作成
ほんじゃ早速作って行こう。使うソフトはUiPathだ。このソフトは個人だと無料で使えて、機能も高性能なのでおすすめ。見た目もダークモードだとかっこいい。
私の最初の作戦は……「とにかくカードをクリックしまくってクリアする」だ。自分で適当にやってもクリアできたんだから、ブルートフォースアタックでクリア出来ちゃんじゃない? という単純な理由。
早速クリックアクティビティを配置し、カードを選択すると……おお、カードが一枚一枚認識できる! これは楽勝なのでは……?
セレクターを覗いてみると、カードはCanvas要素で出来ているらしい。このidx='52'
と記述されている部分がカードの番号なので、この部分を変数化してループで回してやれば、ひたすらカードをクリックしまくるロボットが出来る。
おお……いい感じに動いている。動作も軽快で、これは早くも攻略できてしまったか? と思った。思ったのだが……
結論から言うと、ダメだった。ある程度までゲームが進むと、膠着状態になってしまい、クリア不可能になってしまった。
#ロボットの改良
ロボット1号は何がダメだったかというと、とにかくどのカードでもクリックしてしまうこと。せっかく右端にカードを送っても、再びそれをクリックしてしまい、場にカードを戻してしまう。また、山札は下にあるカードをクリックしても一番上のカードをめくる仕様になっている。おかげでせっかく1があるのに、読み飛ばしてしまった。
結局クリアするには、右端のスペース以外のカードで、表になっているカードを認識してクリックするしかないという結論に至った。
どうやって認識するか? それは……この小さいスペースを画像認識するのだ。
ついでに余計な場所をクリックしないように、画面上でスコープを設定した。これで右のスペースのカードをクリックすることもない。
表のカードを全部検出すると、次は山札をクリックするようにする。これは非常にシンプル。表のカードをクリックして、山札をめくるだけ。
そして出来上がったロボットがコレ。上の二つのシーケンスを無限ループに放り込んだだけ。それじゃあ早速動かしてみよう。
#二回目の挑戦
ロボットを起動させると……いい感じに動いている。
そしてロボットを放置して掃除しながら待つこと15分。ロボットがソリティアをクリアした! やったぞ!
その後も何度か動かしてみたが、上手くいくこともあれば上手くいかないこともあった。5分くらいでクリアすることもあれば、いくら待ってもクリアできないこともある。こればっかりはカードの組み合わせというものだろう。
これ以上ロボットを改良するとなると……カードの数値と記号をOCRで読み取るか、画像マッチングで数値と記号を判別するしかないと思う。ちょっとやってみたが、私には果てしない道に思えた。今回はこれくらいで勘弁してもらいたい。
#ロボットで攻略するゲーム募集
何回かやってみて思ったが、RPAでゲームを攻略するのは結構楽しい。もしこういうゲームを攻略してほしい、というのがあれば、言ってもらえると嬉しいです。