[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: [jfriends] Re: オセロのクラス構造




前橋です。

ご意見ありがとうございます。

遠藤さん:
>>・AWT以外の実装もあるかも知れないので、ひとつのインプリメン
>>  トとして、インタフェースの陰に隠します(だったら名前にAWTを
>>  入れるべきか?)。
>
>将来 Swing とかに拡張するなら、そうした方が良いかも。

Swingとか、Appletではなくアプリケーションでも動くようにして、
コマンドラインとか(^^;

>>  Action getEvent() ... Actionは、int x, int yをメンバとする
>>    クラスです。どこがクリックされたかしら、という情報を返します。
>>    これを呼び出すスレッドは、Judgeのスレッドなので、アプレッ
>>    トのイベントドリブンなスレッドと、wait()/notify()を使っ
>>    て待ち合わせます。
>
>java.util.EventObject を拡張したイベントクラスを書いて、
>これを受け取れる Listener を書いた方が良いです。

実は、私がJavaでそこそこのプログラム(でもおもちゃ)を書いたの
は、みんなJDK1.0だったりするので、こっちのイベントモデルにつ
いてはほとんどやってなかったりするのですが、

えっと、Listenerを書いても、イベントを受け取るメソッドはアプ
レットの(イベントドリブンな)スレッドで動くので、スレッド間の
待ち合わせは必要なのでは?

getEvent()を呼ぶ側のスレッドは、Judge内で動いている、ゲーム
終了までぐるぐる回り続けるループから起動されます。

オセロのようなゲームの進行って、やっぱり私には、ループである
ように見えます。

>この場合、OthelloPanel とかいう名前の、JavaBeans として
>書く事になると思います。

Beansはやったことないですが、Beansにできるように書くべきでしょ
うかね。

>>  # setBoard()メソッドは、OthelloWindowインタフェースに含める
>>  # べきでしょうか? それとも、OthelloWindowImplでいい?
>
>OthelloPanel インターフェースかな。

ですか。

インタフェースは属性を持たないモノの筈なのに、setterを持つ、
というところに違和感があるわけです。getする方ならともかく、
この場合のsetterはほとんど「舞台裏」なので、インタフェースに
載せるのはどうかなあ、とも思ったのですが...

>>・put(int x, int y, int senteOrGote) にて、石が置けます(どう
>>  してもenumが欲しい!!).
>
>boolean isSente でもオーケー?

う〜〜〜〜〜む〜〜〜〜〜〜 (^^;

私ならNGです。

>>・Boardと、ふたつのPlayerに対してポインタを保持します。
>「Boardのインスタンスと、ふたつのPlayerインスタンスを保持します」
>の方が分かりやすいです。

私は「Javaにはポインタがあると主張する会」会員番号4096番だっ
たりします。ウソです。

「インスタンス保持」というと、そのインスタンスを包含している
(他の人は絶対にそれを指していない)ような気がしてしまうので、
妥協して「Java的表現」をするとしても、

「Boardと、ふたつのPlayerに対して参照を保持します」

でしょうか。

...
>>◎HumanPlayerクラス
>>・人間のプレイヤを代行するクラスです。
>
>これは将来通信対戦したりできるように拡張するんですか?

書き忘れましたが、HumanPlayerとComputerPlayerは、Playerのサ
ブクラスです。Boardは、ふたつの *Player* へのポインタを持っ
ているだけなので、最初にBoardにPlayerを設定する時点で調整し
てやれば、人間同士の対戦、コンピュータとの対戦、コンピュータ
同士の対戦の切り替えは自由にできます。

通信対戦についても、元のC++(with X-Window)バージョンでは、
X-protocol経由でできたのです。Boardに対して、複数の
OthelloWindowが付くようになっていたのでした。

# 最初、Boardに、複数のOthelloWindowの管理をやらせていたら、
# Boardが太ったので、OthelloWindowManagerクラスを作って、
# Boardはそいつの相手だけをするようにしました。って、これは
# 余談。

でも、アプレットだと、そのままでは作れそうにないですよね。

>(そうすると、
>OthelloサーバーとOthelloクライアントとして実装する必要が..)

OthelloWindowをインタフェースにしたのだから、これこそ、その
バックエンド(Boardから見た話。人間にとってはフロントエンド)
を交換するだけで実現できないでしょうか。

あ、先手の待ちの時に、後手のウィンドウから入力できちゃうと問
題ですね。OthelloWindowインタフェースにイベントを取得に行く
時に、SENTE, GOTEを指定しなきゃだめか...

>>・OthelloWindowへのポインタを保持しています。
>なぜこのインスタンスを保持する必要があるのでしょうか。
>>・requestAction()がコールされたら、OthelloWindowのgetEvent()
>>  メソッドを呼んでどこがクリックされたかを取得し、Boardの
>>  put()をコールします。
>>・noticePass()がコールされたら、OthelloWindowにお願いして、
>>  ダイアログを出してもらいます。
>この辺が良く分からないです。HumanPlayerがイベントを中継してやる
>のでしょうか?

そうです。

BoardとJudgeにしてみれば、相手にするのは常にPlayerであって欲
しいわけです。

>>◎OthelloConstantsクラス
>>・定数を定義します。BOARD_SIZE(8)とか、SENTEとか、GOTEとか、
>>  SENTE_CELLとかGOTE_CELLとかBLANK_CELLとか...
>
>BOARD_SIZE は Board が知っているべき定数なので、
>Board に含めるべきだと思います。

なるほど。これはそうですね。
# と、思ったんですが... (後述)

>他の定数値も同様で、
>それぞれ収めるべきクラス(またはインターフェース)が
>あるはずです。

うーむー。SENTE_CELL, GOTE_CELL, BLANK_CELLはBoardかなあ、
という気はしますが、OthelloWindowでもいいような気もしますし...

SENTEやGOTEはなおさら持って行き所がないような...

先手と後手が存在する、というのは、オセロというゲーム自体の
性質に関わる話ですよね。

あと、実際問題として、BOARD_SIZEみたいなのは、カスタマイズ可
能なパラメータという見方もあるわけで、そういうのを一箇所にま
とめるのは、悪いことではないようにも思います。
# 実行時変更するほど頻繁に変更はしなさそうだけども、絶対に変
# えないとも言い切れないよなあ、という類いのものをまとめる。
# オセロならともかく、実用アプリケーションでは、もっと沢山あ
# りそうです。

SENTEやGOTEを変更することはなさそうなので、OthelloConstants
ではなくて、CostomizeParameterクラスを別に作るという手はあり
そうですけれども。

>SENTE、GOTE については、私なら boolean を使ってしまいます。

さすがにこれはちょっと。(^^;

------------------------------------------------------------
  前橋 和弥                             maebashi@xxxxxxxxxx
  中部ソフトエンジニアリング(株)
    〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
    Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------