85DATA HOMEへ
MYCAR情報掲示板BLOGプロフィール

HOME →  テトリスを作る(セガ アーケード版)

■テトリスを作る その3 コンピュータにテトリスをプレイさせる  (AI テトリス)
  2014年2月1日

 

まだ、セガ・アーケード版テトリスの動作仕様の検証は全て行えていませんが、ちょっとブレイク
 (それでも、かなりホンモノに近づけたとは思っています)

このゲームシステムを利用して、コンピュータにテトリスをプレイさせてみようかと思いました。
AIシステム (って言える?) を作ってみます。

まずは、テトリスの動作のみのソース※(グラフィック画像無し)を利用して作りました。

※不具合箇所の特定を容易にする為に必要最低限の基本的なソースを利用
検証の為、最低10000回はブロックを積んでみます。その為にも余計な装飾なんて不要です。

評価計算は基本的には減点法にしています。

@ 高低差の累計
A 隙間(上にブロックがある)
B 深さ2の穴がある(縦長の穴)
C 深さ3以上の穴がある(縦長の穴)
D 危険ゾーン (アラート箇所:ブロックの出現箇所のすぐ下)のブロックの存在
E 積み上がったブロックの高さの平均

例外として以下のふたつは、加点しています。

Fクリア行数
Gリーチ行数


この@からGに対して”係数”を乗じ評価値を算出して最高得点の位置、回転箇所を選択するようにしました。

これは、1手先(NEXT)を読んで計算しています。
ふたつのブロックを全てのパターンで積んでみて一番良い評価値を選択するのです。
なお、ひとつ目のブロックを積んだ後に消去行があれば消去処理を行いますが、ふたつ目のブロックは消去行はカウントのみとして消去処理は実行しません。これは処理コストを削減する為にそうしています。

「この”係数”の調整って、奥が深いのだろうな」

一応、E積みあがったブロックの高さ(平均)が高くなったら早く消すように係数は変化させています。逆に言えば少ない高さならばリーチを多くするようにしています。

私は、かなり”適当”に作りました。(また”適当”と云う言葉が出てきた。悪い意味での”いいかげん”と同意味です。もちろん)

とても効率的なブロックの積み方ではありませんが、25000個のブロックを落としましたが、ゲームオーバーにはなりませんでした。


一発で(初回で)このレベルならば、合格ではあるまいか。

もちろん、初回ならばの意味であり、およそ効率的な積み方とは思えません。
何しろ、25000余りのブロックを積んだのに、テトリス(4行消し)が、たったの149回しかありません。

ゲームオーバーを恐れ、積極的にテトリスを狙っていないのですね。
これは、リーチやクリア行数 (4行消しも含め)の評価が低い事が原因なのですが、これを(係数を)強くしすぎると、ゲームオーバーになってしまいました。
ブロックの積み具合によって、係数をもっと柔軟に可変化する必要があるように思えます。

もうちょっと、評価関数の研究が必要だと思っています。

その確認が以下になります。
(ウェイトを掛けてあるので、ゆっくりの動画です)

 

 

 

まだまだなAIシステムではありますが、”まずは” (こんなテキストのテトリスでは無く)本移植作にも、このAIシステムを実装してみます。

早速実行してみたら、テストプログラムでは、全く(25000個ブロックを落としても)ゲームオーバーにならなかったのですが、こちら側ではゲームオーバーになってしまいました。

SCORE  131046
LINES        199
LEVEL         46

落下が最高速度に達すると、目的の場所まで移動が出来ていないのです。
これは、ゲームシステムの操作レバー”ため”により、目的の場所(横位置)まで到達する前に、ブロックが着地してしまっています。

※ここで、書く「ため」とは、キーリピート間隔のようなものです。
(普通、文字入力をする際にキーを押し始めてから0.5秒〜1秒程度経過するまではキーリピートされません。1文字入力するつもりでも複数文字入力されてしまう現象を防ぐためです。テトリスもこれと同様で、意図せず複数動いてしまう事を防いでいます)

着地後も(このゲームシステムでは)0.5秒間(30フレーム分)は、左右、回転の修正は可能ですが、目的の横位置までにジャマなブロックが存在すると、それに引っ掛かってしまい最終的には目的の場所まで到達せずに、ブロックが接着されてしまいます。

このようになってしまう事は想定していました。
むしろ、ドコまでこのAIシステムでゲームが進められるのかを楽しみにしていたくらいです。

LEVELが46まで行ったのであれば、まずまずな気がしますが、ゲームオーバーにならないようにしてみます。

操作の”ため”を効かなくする為に、操作レバーを連打するように、コンピュータに指示させます。

1時間位プレイさせましたが、今度はゲームオーバーにならずカンストさせる事が出来ました。
(テストプログラムと同様に動いているはずですから、当然と云えば当然なのですが・・・)

以下が動画(操作レバーを連打させている)
テトリス コンピュータがプレイ(AI)

 

 

 

これだと、(積み方は別として)人間らしくない・・・

やはり、速度が上がってきたら、着地後に修正するという動作の方が見ていて面白いと思います。
次回は、(操作レバーを連打させずに)ゲームオーバーにならないような工夫をしてみたいと思っています。ちょっと難しいかなぁ