Androidでオセロゲームを作ってみる (1)
Androidでオセロゲームを作ってみる (2) ゲームロジックの実装
Androidでオセロゲームを作ってみる (3) 思考ルーチンの実装
Androidでオセロゲームを作ってみる (4) 文字列をぐるぐる回す方法
Androidでオセロゲームを作ってみる (5) 裏返しアニメーションを付けてついに完成!
前回の記事からあっと言う間に半月以上も経ってしまった。
その間、会社のXenServerがトラブったり、オフィスの引越し準備と大きなプロジェクトのカットオーバーが重なったりで、7月はなかなか大変な月だった。
そんな中で実はオセロの思考ルーチンを少しずつ実装したりもしていた。結局、仕事と子育てで一杯一杯なのはいつもの事なので、早朝5時起きしてでもなんとか自分の時間を作ってやって行くしかないかなあと思う。
思考ルーチンの実装
オセロの思考ルーチンを作り込む事は、このアプリを作り始めた時の「Androidでの2Dグラフィックス処理の習得」という目標からは完全に脱線している。でもどうしても誘惑に負けて、作り込まずにはいられなかった。(笑) 面白いのだから仕方がない。
下の2つのリンク先にはとてもとてもお世話になった。
-鶯教-コンピュータ・リバーシ講座
リバーシ(オセロ)プログラム (2018年現在リンク切れ)
今のところ、作成した思考ルーチン(?)は下の4種類。それぞれが ComputerPlayer クラスのサブクラスになっている。
(クラス名クリックでソースコードを表示します)
ComputerPlayer0 | 何も考えずに打てる場所の中からランダムに選んで打つ。 |
ComputerPlayer1 | 次に打つ場所の候補のリストを、事前に定義された評価テーブルにしたがってソートした上で、評価の最も高い場所に打つ。打った結果についての先読みはしない。 |
ComputerPlayer2 | 1手先までの局面の評価値を計算し、最も評価の高い手を選ぶ。 |
ComputerPlayer3 | 「ネガマックス法」にしたがって最大4手先までの局面の評価値を計算し、最も評価の高い手を選ぶ。 |
クラスの継承関係はこんな感じになっている。
Player (人間とコンピュータの両方に共通のコードを記述) HumanPlayer ComputerPlayer (スレッドの起動・停止など全ての思考ルーチンに共通する処理を記述) ComputerPlayer0 (各思考ルーチンの実装はこのレベルのクラスに記述) ComputerPlayer1 ComputerPlayer2 ComputerPlayer3
ゲーム実行時の基本的な流れとしては、HumanPlayerの番になるとボード上の有効な場所がタッチされるまで待ち、ComputerPlayerの番になると別スレッドを起動して思考ルーチンを走らせる様になっている。
思考ルーチンは戻り値としてPointを返すので、あとは人間がその座標をタッチした場合と同様の処理を行えばよい。
ただ、思考ルーチンが走っている間に電話がかかって来たり別のアプリが前面に呼び出されたりするとActivityが終了してしまう可能性がある。その場合は思考ルーチンのスレッドもきちんと終了させる必要があるので、その辺りにはちょっと気を使わないと行けない。
気になる強さは?
ComputerPlayer1と2はそれなりに遊べるとは思うけど、かなり弱い。
ComputerPlayer3は、個人的にはそこそこ強いのではないかと思う。ただめちゃくちゃ強いというほどでもない。自分で対戦して見た限りだと、5回やると4回は自分が負ける。1回ぐらいはぎりぎり勝てるという感じだ。
不思議な事に、こいつに自分が負けるとなぜか嬉しい。早起きして眠い目をこすりながらデバッグした甲斐があったというものだ。(笑)
ソースコードと次回の予定
現時点のプロジェクト全体のソースコードはこちら。
mikehibm/MiReversi at ver3 - GitHub
次回はいよいよ石を裏返す時のアニメーションとか、ゲーム終了時の結果表示画面などをグラフィック機能を駆使して作り込んでみたい。早寝早起きして頑張ろう。^^
Androidでオセロゲームを作ってみる (1)
Androidでオセロゲームを作ってみる (2) ゲームロジックの実装
Androidでオセロゲームを作ってみる (3) 思考ルーチンの実装
Androidでオセロゲームを作ってみる (4) 文字列をぐるぐる回す方法
Androidでオセロゲームを作ってみる (5) 裏返しアニメーションを付けてついに完成!
2012/1/12 追記:
ここにある思考ルーチンは最強かも!
Booby Reversi Download Page
強いオセロプログラムについて