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