STEP-05
局面クラスを作ってみよう
さあ、コンピュータ側のアルゴリズムを考えましょう。最低限必要なのが局面を評価する機能ですね。それと、ある程度強いアルゴリズムにしようと思うと、数手先の局面を読む機能も必要になります。おや?ちょっと待ってください。 局面という言葉がどちらの機能にも登場します。おそらく、これから先、コンピュータ側のアルゴリズムを作っていこうとすると、いろんな形で局面というものとお付き合いしないといけないのではないでしょうか?ならば、いっそのこと、この局面をひとつのクラスにまとめてしまった方が良くはないでしょうか?
というわけで、予定を変更して、アルゴリズムを作る前の下準備として、局面クラスを作成することにしました。(最初から設計をしっかりしていれば、途中で作り替えることもないんだろうけど... (^^;;。でも、最初から完璧な世界を作るなんて、神様でも難しいことだと思いません?)
さて、局面クラスについて考えましょう。局面クラスが持つべき情報にはどんなものがあるでしょうか?まず、盤上の石の配置が必要です。それから、次がどちらの番かという情報も必要ですね。これらは、局面クラスのインスタンス変数として定義すればよいでしょう。
次に、局面クラスに欲しい機能は、と考えると...石の数を数える機能、石を置いて次の局面に進める機能、石が置けるかどうか調べる機能に...おやま、今まで作った多くのメソッドは、局面クラスに持たせるとよいことになります。これで、オセロクラスはだいぶスマートになることでしょう。
今回は、いかにもオブジェクト指向という感じになりました。オブジェクト指向というと魔法の杖のようなイメージがありますけど、クラス設計をきちんとしようと思うと、作業量もコード量も増えるんですよね、ふう。(オブジェクト指向なんて考えなければ、今回の作業は必要ありませんし、前回と比較して、明らかにコード量は増えています。)でも、プログラムの見通しはよくなりますし、おそらく、次回からのアルゴリズム作成において、局面クラスは大きな武器になってくれることでしょう、きっと。(そう信じることにしましょう(^^))
[STEP-04へ] [Making of Othelloへ] [STEP-06へ]
Tips
- オブジェクト指向プログラミングは、先行投資。将来回収できる見込みがなければ、無理にオブジェクト指向にすることもないんじゃない?(なんて素人が言ってると、識者に怒られそうですが。)
[Source code]
NAKAGAWA Masami ( nakagawa@yo.rim.or.jp )