実機におけるボンブリスAI

ボンブリスとは?

Wikipedia参照のこと
ボンブリス - Wikipedia
つまりは爆発するテトリス。そのほかの違いはテトリミノの種類がかなり多くなっていることなど。

今回の目標

実機(SFC)である程度まともなAIを動かす
ボム部分の検知が面倒なのでとりあえずほぼテトリスAIと変わらないが、それは後々

構成

SFC -[USBキャプチャケーブル]-> PC -> Raspberry Pi -> SFC のような形。
キャプチャした映像をOpenCVPythonで解析して、入力信号をラズパイに投げ、分解したSFCコントローラから入力。
github.com


動作手順は以下の通り。

1.画像から盤面とネクストの領域を切り出す

pyautoguiでキャプチャし、numpy.asarray()でOpenCVで使える形に変換

2.ネクストのテトリミノを特定する

GaussianBlurを適用してアナログ取り込みによる誤差の影響を軽減したのち、二値化
取得しておいた以下のような各テトリミノの二値化画像と比較し、テトリミノを特定
f:id:Ord:20160619001724p:plain

3.盤面画像からブロックの有無を解析し、配列へ保存

背景はほぼ同一なので、チップを切り出して閾値と比較し、ブロックの有無を判定
これが
f:id:Ord:20160619002346p:plain
こうなる
f:id:Ord:20160619002035p:plain

4.ネクストミノが降るのを検知

ネクストミノが変わった瞬間を検知すればいいように思えるが、同じテトリミノが連続してネクストに来ることがある。
そのため画面上部にテトリミノが見えたときにもネクスト検知イベントが発火するようにしておく。

5.盤面とミノから最適位置を算出

テトリミノに対して、回転・落下をそれぞれシミュレートし、評価値の最も高い盤面を構成する操作を選択。
盤面をミノの最下点・囲まれたスペースの少なさなどによって評価するが、それぞれにかける重みは試行錯誤中。

6.移動量をRaspberry Piへ送信

テトリミノによって回転させたときの移動量や初期位置が異なるので、それらを考慮して操作量を算出、送出する。

7.Raspberry PiからSFCへ操作信号を入力

GPIOにつながったアナログスイッチ経由でSFCコントローラから信号を入力。
今回使用したICはこれ。
4回路アナログスイッチ SN74HC4066N: 半導体 秋月電子通商 電子部品 ネット通販

動作風景

www.youtube.com
概ね理想に近い動きをしているように見える。
しかし、10手目のT字ミノは明らかにおかしな動きをしている…

今後

ボンブリス要素が全くなかったのでボムを考慮したAIを作りたい
しかし、盤面のボムを判別するのは容易だが、ネクストのどの位置にボムが来ているかを判別するのが難しい。