STEP-06
審判に登場してもらいましょう
前回の変更にバグがありました。まだ石を置く場所が残っているのに、ゲームオーバーと判断してしまうバグです。気がついた人いるだろうなあ、きっと。さて、今回こそは、コンピュータのアルゴリズムをと思っていたのですが、またまた気になることが出てきました。それは、ゲームの進行が今までのように簡単にはいかなさそうだということであります。
今までは、マウスクリックで石を置いて次のマウスクリックを待つという形でゲームを進行すればよかったのですが、コンピュータが相手だと、そうはいきません。コンピュータはマウスをクリックしてくれないのです。(当たり前か...)
コンピュータ対人間というように限定してしまえば、まだ少しは楽なような気がします。でも、折角人間どうしでも遊べるようになっているのに、その機能を削ってしまうのはシャクです。また、コンピュータのアルゴリズムどうしを戦わせるのも面白そうですし、できることなら、対戦相手の組み合わせは自由に選べるようにしたいところです。
では、どうするか?
いくつか方法が考えられると思うのですが、私は、ここで、審判(Judgeクラス)に登場してもらうことにしました。つまり、審判に試合の進行を管理させて、次がどちらの番かを決める権限を持たせることにしたのです。これなら、コンピュータがズルをして、2手続けて打ったりすることも防げそうです。ただ、審判にコンピュータと人間という全く異なる性格のプレイヤーを管理させるのも結構たいへんなような気がします。でも、考えてみると、コンピュータも人間も、ここでは同じオセロプレイヤーなんですよね。そうです、同じオセロプレイヤーという役割を持っているわけです。 Javaには、この同じ役割というやつを表現するのにちょうどよい機能があります。
インターフェースです。そこで、Playerというインタフェースを作成しました。
このPlayerには、Point where(Kyokumen kyokumen)という抽象メソッドだけを定義しています。つまり、Playerというインタフェースを持つオブジェクトは、必ず、whereというメソッドを実装しなければならないということだけが、ここで定められているのです。
Playerというインタフェースを持つオブジェクトは、局面を引数としてwhereをコールされると、その局面に対して、どこに石を置くかを決定して、 Point型(xとyの2つの値を持つクラス)のオブジェクトを返さなければならないわけです。ここまで決まっていれば、審判はずいぶんと楽になります。だって、プレイヤーが人間だろうがコンピュータだろうが、おかまいなしに、 where(どこ?)と聞けばいいだけですからね。
で、コンピュータは、Playerというインタフェースを持つComputerPlayerに、人間は、同じPlayerというインタフェースを持つHumanPlayerになったのでありました。
やれやれ、今回の変更も、かなり膨らんでしまったようであります。次回こそは、コンピュータのアルゴリズムをば...(^^;;
あっ!言い忘れてたけど、一応、ComputerPlayerには、アルゴリズムが入ってるんでした。ランダムに打つというアルゴリズムがね。
負けるのは絶対イヤだという人は、今がチャンスだよ〜ん。[STEP-05へ] [Making of Othelloへ] [STEP-07へ]
Tips
- 異なるクラスのオブジェクトを同じように扱いたい(同じ役割を持たせたい)場合、 Interfaceが役に立ちます。
- スレッドの実行を中断して、待ち合わせをしたい場合、wait()を使用します。そのスレッドを起こすのは、notify()です。 HumanPlayer.javaの中で、マウスが押されるのを待つのに、wait()が使われています。また、Judge.javaの中で、審判が試合開始を待つのにも、wait()が使われています。
wait(),notify()は、synchronizedで、排他制御する必要があります。[Source code]
- Othello.java
- ControlPanel.java
- Kyokumen.java
- Judge.java
- Player.java
- ComputerPlayer.java
- HumanPlayer.java
NAKAGAWA Masami ( nakagawa@yo.rim.or.jp )