[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
------------------------------------------------------------