[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] オセロのクラス構造
前橋@別にヒマなわけではない です。
長文です。連休中のネタ提供?
うちの会社の中で、JavaとUMLの勉強会みたいなのをしているとこ
ろがあって、そこで、今度、練習問題として、オセロゲームを作る
そうな。
私はそこには参加してないんですが、以前、C++でオセロを書いた
ことがあるので(社内でコンテストがあった)、クラス構造について
参考意見を聞かせてくれ、と言われて、昨日の夜、隣りのビルまで
のこのこ出掛けていったのでした。
で、そこでは私なりのクラス構造について、説明したわけですが、
皆さんは、どのように設計されますでしょう?
************************************************************
ちなみに、以下が私の設計です。
メイルでは図が書けないので、各クラスの説明だけ。
◎OthelloAppletクラス
・アプレットです。
・OthelloWindowImplと、制御用のボタンを貼ります。
・制御用のボタンの中には「スタート」ボタンがあって、それを押
すと、Judge のスレッドを作って起動します。
◎OthelloWindowImplクラス
・オセロの盤面を表示します。
・OthelloWindowインタフェースをimplementsします。
# でも、いろいろ考えたら、OthelloWindowをimplementsするの
# はAppletであるべきなような気がしてきた...
・AWTのPanelのサブクラスです。
・AWT以外の実装もあるかも知れないので、ひとつのインプリメン
トとして、インタフェースの陰に隠します(だったら名前にAWTを
入れるべきか?)。
◎OthelloWindowインタフェース
・オセロの画面表示機能をもつインタフェースです。
・以下のメソッドを持ちます。
redraw() ... 画面全体を再描画します。
drawCell(int x, int y, int senteOrGote)... 特定のセルを再
描画します。
Action getEvent() ... Actionは、int x, int yをメンバとする
クラスです。どこがクリックされたかしら、という情報を返します。
これを呼び出すスレッドは、Judgeのスレッドなので、アプレッ
トのイベントドリブンなスレッドと、wait()/notify()を使っ
て待ち合わせます。
その他、どっちの番か表示したり、パスのダイアログを出したり。
・画面の描画について、情報はBoardに問い合わせます。
# setBoard()メソッドは、OthelloWindowインタフェースに含める
# べきでしょうか? それとも、OthelloWindowImplでいい?
◎Boardクラス
・オセロの盤面のクラスです。
・int の2次元配列で盤面を保持します(やっぱりenumが欲しい!!)。
・put(int x, int y, int senteOrGote) にて、石が置けます(どう
してもenumが欲しい!!).
・石が置かれたら、挟まれた石をひっくり返す、というように、盤
面の管理について責任を持ちます。
・盤面全部、あるいは特定のセルについて、聞かれたら情報を答え
るメソッドを提供します。
◎Judgeクラス
・ゲームの進行役です。
・Runnableインタフェースをimplementsして、アプレットとは独立
したスレッドで動きます。
・Boardと、ふたつのPlayerに対してポインタを保持します。
・ぐるぐるループしながら、先手・後手に対し、かわるがわる
requestAction()メソッドをコールします。
・ゲーム終了状態になってないかしら、とか、パスしなければいけ
ないのではないかしら、ということに関しては、Boardに問い合
わせます。
◎Playerクラス
・プレイヤを意味する抽象クラスです。
・Boardに対してポインタを持ちます。
・以下のメソッドを持ちます。
requestAction()...Judgeさんが、Playerに対して、「次、君、
指せ」と要求するときにコールする抽象メソッドです。
noticePass()...Judgeさんが、「次、君、パスね」ということを
通知するためのメソッドです。このメソッドは実装を持ち、中
身はカラです(パスなので、Playerはすることがない)。
◎HumanPlayerクラス
・人間のプレイヤを代行するクラスです。
・OthelloWindowへのポインタを保持しています。
・requestAction()がコールされたら、OthelloWindowのgetEvent()
メソッドを呼んでどこがクリックされたかを取得し、Boardの
put()をコールします。
・noticePass()がコールされたら、OthelloWindowにお願いして、
ダイアログを出してもらいます。
◎ComputerPlayerクラス
・コンピュータ側のプレイヤのクラスです。
・requestAction()がコールされたら、自分で手を考えて、Boardの
put()をコールします。
◎OthelloConstantsクラス
・定数を定義します。BOARD_SIZE(8)とか、SENTEとか、GOTEとか、
SENTE_CELLとかGOTE_CELLとかBLANK_CELLとか...
どう思われますでしょうか... うー、俎の上のコイですね(^^;;;;。
設計関連の本を買うことはあっても、真ん中辺からナナメ読みになっ
たり、積ん読に移行することが多いので、シロートの設計ですが...
# 英語力のなさの方が恥ずかしかったりもします。
ご意見お待ちしております。
...でも、連休明けまで、メイルは読めても、MLに返事を出せない
可能性大です(_o_)。
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxxx
中部ソフトエンジニアリング(株)
〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------