スポンサーリンク

KotlinでAndroidアプリ#31

コンピュータ対戦

人対人の対戦では面白くない。そこでコンピュータと対戦できるようにする。

思考ロジックは、コンピュータ、人が交互に手を打ったと仮定し全パターン走査していく。途中コンピュータの勝ちならプラス10、人の勝ちならマイナス10などの評価値を設定し、それ以上深いレベル走査は行わないようにする。そして最終的にコンピュータにとって有利な(評価値が高い)手を決定するのだ。この方法はミニマック法と呼ばれている。

評価値は走査しているレベルで除算し算定するようにした。これはレベルが深いところのプラス10より、レベルの浅いプラス10が価値ある手だからだ。

再帰処理

レベルが深くなるにつれ、仮定で打った座標、手番、評価値など管理する情報が複雑になってしまう。さらに走査がどこで終了するか、走査していかないとわからない。これをプログラムするのはやっかいだ。そんな時は再帰処理で行う。

再帰処理は自分自信を呼び出す処理だ。呼び出すことにより新たに処理がメモリーに展開されるので、管理情報も引き渡していけばよい。

再帰処理の例として階乗計算プログラムを掲載する。

今回は次のレベルを探索する際に自分自信の関数を呼び出すことにする。

実装

クラスSquaresに関数stgを作成する。コンピュータ手番時にこの関数を呼び出すと全マス目を走査し最善手を返すようにした。

座標、評価値を格納するためのクラスSerchResutlを作成している。

実行

三目並べでは軽快に動いた。うゎーいパチパチパチ。でも、この後マス目を4×4にすると反応がない??

もしかしてと思い、電卓を叩く。3×3だと9マス。えーと、相手が先番なので、残り8マス。走査対象のマス目は・・・8の階乗?、40,320。すごい数だ。計算合ってるか?

4×4のマス目だと、16-1の15の階乗。なんと、1,307,674,368,000。計算合ってるか・・・。これじゃ全マス目を走査するのは無理だ。反応が無いハズだ…


前へ<ーーー>つづく

タイトルとURLをコピーしました