Blue Prism でマインスイーパーを自動化する(改善編)
前回、とりあえず軽い気持ちで
Blue Prism によるマインスイーパーの
自動化を行いました。
今回は、ちょっとだけ真面目に
取り組んでみます。
部品化をしよう
前回、使ったオブジェクトがこちら☆
我ながら・・・ひどい出来だ。。
(もう、グチャグチャ☆)
調査や検証のフェーズなら、
こんなんでも意味はありますが、
ある程度、わかってきたら、
オブジェクトの作り、プロセスの作りを
考えることができます。
良く使う細かい処理を部品化する
まずは同じ処理がたくさんあるので、
これをまとめていきます。
マインスイーパーなので、
セルの状態を調べるというのは、
基本的な処理であり、
多用される処理になります。
前回、書いたように、
セルの中身は HTML 的にこんな風になっているので、
- セルの場所(X, Y)を指定したら(入力)
- そのセルの数値、開いてるかどうか、旗が立ってるかどうかを調べる(出力)
みたいなアクションがあると便利です。
こんな感じですね。
同様にして、
- 左クリックしてセルを開ける
- 右クリックして旗を立てる
- セルの周囲を調べる
といった処理も、共通的なアクションにしていきます。
似たような処理を汎用的にする
最初に作った(ひどい出来の)オブジェクトでは、
「1」の周囲のセルを開ける処理とか
「2」の周囲のセルを開ける処理は、
それぞれ別々に作られていました。
しかし、これらは本質的には同じ処理です。
要するに、そのセルの周囲に、
セルの値と同じだけ閉じているセルがあれば、
旗を立てるわけです。
こんな感じですね。
一方で、セルの値と同じだけ旗が立っていれば、
それ以外の閉じたセルを開けるわけです。
こんなときですね。
したがって、
- 周囲に旗を立てる
- 周囲を開ける
というアクションがあれば、
セルの値にかかわらず、使うことができます。
無駄な処理をなくそう
さっきの(ひどい出来の)オブジェクトでは、
かなり甘い基準でクリックしています。
それこそ、すでに開いているセルを左クリックしたり・・・
(判定ロジックを作るのを後回しにした)
そのあたりにも、メスを入れます。
無駄なクリックを減らす
まずはきちんと判定ロジックを入れ、
無駄なクリックを減らします。
たとえば、左クリックなら、
閉じている時だけ左クリックをします。
こんな感じです。
調査が不要なセルを再調査しない
これも重要です。
セルの状態を調べて、セルの周囲も調査する、
これが非常に時間がかかります。
たとえば、セルの数値が0、つまり
何も書いてないセルの周りを調べても時間の無駄です。
また、すでに周囲に旗を立てきり、
周囲のセルを開け切った場合、
再調査は不要です。
これについては、
マインスイーパーのセル(初級だと9×9)と
同じ大きさのコレクションを用意し、
再調査の必要のないセルの場所を管理するようにしました。
改善後
改善後は、以下のような呼び出し関係になります。
完璧には程遠いが、、
だいぶスッキリ☆
改善後の動きはこんな感じです。
マインの配置が良ければ、
まぁまぁ見られるスピードになってきた。。
やったぜ。
まとめ
- ちょっとだけマインスイーパーの自動化を真面目にやった
- 部品化と、処理の無駄を除いて、少しは見られる形にした
- 処理速度もまぁまぁ上がり、ようやくスタートラインに立てた?
とはいえ、マインの配置が良くても、
100秒かかっちゃうんだな。。
もっと詳細な分析をしたい。。
プロセスマイニングとか、使えないだろうか・・・?