Web上のパズルゲームをSeleniumを使って自動で解く

記事
IT・テクノロジー

Selenium

SeleniumはWebドライバーAPIと相互にやり取りを行って、Webブラウザを自動化するためのライブラリーとして、Webサイトの動作テストやスクレイピングによく使われます。

SeleniumはJavaScriptを実行してWebページの操作を行うことが出来るので、Web上のゲームの操作も自動化することが出来ます。

任意のJavaScriptコードを実行することが出来るので、ハックしてゲームで任意スコアを出したかのように見せかけることもできます(この記事ではやりません)。

この記事ではSeleniumを用いたブラウザ自動化の利用例の一つとして、Python + Seleniumを用いてパズルゲームの自動化を行います。
今回はPythonを使用しますが、SeleniumのバインディングとしてPythonの他にJava、JavaScript等があります。

2048

この記事では「2048」というWebページ上にあるパズルゲームを自動化します。

「2048」は4×4マスにある数字が書かれたタイルを矢印キーを押すことで上下左右どれかの方向にスライドさせ、「同じ数字」がぶつかると合体し、タイルの数字が足し合わされます。

以下の動画は実際に私がPython + Seleniumで自動化プログラムを作成し、実行した様子を撮ったものです。


2048ルール
・同じ数字のタイルがぶつかれば、その数字の分だけスコア獲得
・最終的に2048のタイルを一つでも作ることが出来ればクリア
・クリア後もゲームを続行して2048以上の数字を作ることも可能
・タイルを動かすことが出来ない状態になればゲームオーバー

「2048」をGoogle検索して公式ホームページを訪問し、実際に手動でプレイしてみるとわかりますが、運要素もありゲームクリアは簡単ではありません。

自動化ソルバーの実装

上述したようにPython + Seleniumを使用してプログラムを実装しました。

盤面状態の情報取得
盤面のHTML要素を抽出し正規表現を使って取り出しました。
アクション・盤面更新
スライドさせたい方向が決まったら、盤面に対して指定の矢印キーを押すようにSeleniumに命令し、盤面を更新させました。
次の一手探索
深さ優先探索を用いて4手先の状態まで探索を行いました。
戦略
4手先までの行動評価値が一番いい操作を次の一手の操作として選択しました。行動評価値は1手ごとの獲得スコアの二乗の和とし、操作ごとに上位数個の状態評価値を平均して操作を選択しました。
平均をとったのはタイルの生成がランダムなためです。

探索時間短縮のため、1手ごとに分岐先を絞ってランダムに枝狩りしました。

結果
動画を見ていただくとわかりますが、定石を無視して、かなりアクロバッティックなゲームの進め方をしており、人力で真似をするのは困難かと思います。

20回ゲームの試行を行い、Maxタイルの数字でデータをとった結果が下記になります。
1024 : 4回
2048 : 15回
4096:  1回
これより自動化プログラムが8割程度の確率でゲームクリアすることが出来ることを確認しました。

まとめ

盤面の状態を考慮していないなど、スコアを伸ばすために改善の余地はあると思われます。

Seleniumを用いたブラウザ自動化の利用例の一つとして、パズルゲーム自動化を紹介しました。





サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す