スピードアップ
プログラムを改善し4×4以上のマス目でも対戦できるように、下記のスピードアップを行った。
- 勝敗判定を全マス目から指し手マス目のみのチェックへ変更
- 思考ロジックを周りのマス目が全て空白の時は走査しないように変更
- 思考ロジックを走査レベルの制限を設けるように変更
この変更により4×4以上のマス目では全パターンの走査を諦めた。このため非常に弱いコンピュータになってしまった。別方法でのアプローチを考えたが、元々Kotlinの学習で始めたゲーム作り、次回リベンジすることにする。
UIスレッド
これでゲーム完成としたいがUIに納得がいかない箇所がある。それは「自分が手を打つ->コンピュータ思考->自分の手、コンピュータの手が同時表示される」ところだ。
本来は「自分が手を打つ->自分の手表示->コンピュータ思考->コンピュータの手表示」としたい。
このような現象が発生する理由はAndroidアプリでは基本的に処理する単位(スレッド)が1つのため、思考ロジックが動作している間は画面をリフレッシュできないからだ。
解決手段として「thread」命令で思考ロジックを別スレッドで動作させる。これによりメイン、思考ロジックを並列動作させることができるので、思考中でも自分の手を表示できる。
runOnUiThread
別スレッド化により他の問題が発生する。それは別スレッドからUI部品の操作を行うと異常終了することがあるのだ。例えば、別スレッドになった思考ルーチンで「お待ちください。」などのメッセージ設定(TextViewに設定)を行うと異常終了してしまうことがある。
UI部品へのアクセスはメインのスレッドから行わなければいけない。別スレッドから行いたい場合は、「runOnUiThread」命令を使用する必要がある。
コード&実行結果
別スレッド化、runOnUiThread対応を行ったコードを掲載する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
fun my(){ thread { //別スレッド発生 var ret = squares.stg(next, 1.0, numberPicker2.value, numberPicker.value)//思考ロジック if (ret != null) { this.runOnUiThread { //UI更新 squares.click(ret.y, ret.x, next) var win = squares.jug(ret!!.y, ret!!.x, numberPicker2.value, numberPicker.value) textView3.text = getString(R.string.MSG_PROMPT) if (win != Const.KUHAKU) { final(win) } if (checkCount()) { final(Const.DRAW); } next = !next } } } } |
実行結果。