対戦型五目並べ

目次

  1. 動作の概説
  2. 共用ライブラリ
  3. サーバ
  4. アプレット
  5. 五目並べ競技ルール判定
  6. 感想

Deep Side of Java〜Java 言語再入門」でデザインパターンの解説をしたが、その実例として「対戦型五目並べ」を作ってみた。まあ、こういうプログラムのソース&解説はあまりないので、きっと面白いと思う。

ちなみにこの内容が書籍になってしまった...勿論この内容を書籍向けにさらに書き直し&パワーアップしたものである! 詳細はこっちだ。

なぜ「対戦型五目並べ」にしたのか、というといくつかの理由がある。

  1. デザインパターンを多く紹介しようと思うと、それなりに規模の大きいプログラムにならざるを得ない。
  2. それなりにちゃんと設計して作らなければ無理な程度の、多少は複雑なプログラムでないと、筆者的に詰まらない。サーバ・クライアントのものだと、それなりに複雑になるのでいいな。
  3. サンプルだから、それなりに自己完結したプログラムがいい。具体的な実行環境で「特殊ケース」が出てこないようなものがいい。
  4. WWW講座」で、対戦型五目並べシステムを紹介しているから、それをリファクタリングするのが手っ取り早い。
  5. これなら具体的に遊べるから、単に落として遊ぶだけでもビジターにメリットがあるな。
  6. ついでだから、Java 1.4 で追加された java.util.logger とか、java.text とかの新しめのAPIも使ってみようじゃないの。
  7. ついでだから、そのうちに Struts ベースで対戦システム自体(複数のプレイヤーが待ち合わせて対戦する)を構築してみようじゃないの。

要するにいろいろな「デザインパターン本」を読んでいても、紙幅の都合であまり高度な例が載っていなんだよね。まあそりゃGoFのデザインパターンは23個もあるわけで、全部きっちり解説してプログラムも面白くって、というのはちょっとムリだ。というわけで対戦型五目並べ(当然サーバ・クライアントのもの)で、可能な限りデザインパターンを使い倒して書いてみたのである。言語は「Deep Side〜」の続きで Java でやったので、きっと皆さんの環境でも遊ぶことができるだろう。一応 Java 1.4 で書かれているが、まあ、皆さんもとっくの昔に 1.4 くらは入れていることだろう。

配付パッケージはとりあえず Windows 版と UNIX 版を用意してあるが、これは単に文字コードの問題に過ぎない。日本語を結構使っているので、「文字が化ける」ことがあれば、適当に変換されたい。

遊び方は単純。ダウンロードしたファイルを解凍したディレクトリで、

% java -jar goserv.jar

と叩くと、サーバが起動する。適当な起動メッセージが出る。そしたらインストールディレクトリの test.htm と gedo.htm を適当なブラウザで開いてやる。出来れば Java インタプリタは2プロセス用意した方が干渉がなくて良いので、ブラウザの「ウィンドウを開く」で2つブラウザを立ち上げない方が良いだろう。そうすると、自動的にサーバに接続し、「ゲーム開始」という寸法だ。両方のリンクを保持した both.htm というファイルも用意されているので、それからアクセスするのが楽でいいかもしれない。

簡単に配付パッケージのファイルを解説しておこう。

ディレクトリ
GoAppletアプレットのソース
GoPropertyプロパティライブラリのソース
GoRule五目並べのルール・オブジェクトのソース
GoServサーバのソース
GoSQLSQL操作ライブラリのソース
GoTimerタイマライブラリのソース
コンパイル用のファイル
build.xmlant 用ビルドファイル
Manifest.mf.appアプレット用マニフェスト(jar で使う)
Manifest.mf.servサーバ用マニフェスト(jar で使う)
テスト環境用のファイル
goserv.jarサーバ用の jar ファイル
goapplet.jarアプレット用の jar ファイル
GoServ.logログファイル(パッケージにはなし)
GoServ.rscサーバのリソースファイル
both.htmテスト用のHTMLへのリンクが入っている
gedo.htmテスト用HTML(1)
test.htmテスト用HTML(2)
gomoku.batサーバ起動用のバッチファイル

というわけで、とりあえず自分でコンパイルしなくても遊べるように、配付パッケージは作ってある。コンパイルするには J2SDK 1.4 と、ant を使っている。ant はインストールすることを薦めるが、なくても手動でコンパイルできるのは当り前だ。ただし、動的ローディングを結構使っているので、手動でコンパイルするとコンパイルし落しすることもあるので、ちょっと気をつけよう。

では、本題のデザインパターン解説をしていこう。「デザインパターンとは何ぞや」を改めて書くのは面倒だ。「Deep Side of Java」にその説明はあるので、まずこれを読んでくれたまえ。


利用デザインパターン一覧

Adaptor
あるクラスのインターフェイスを、クライアントが求める他のインターフェイスに変換する。Adaptor パターンは、インターフェイスに互換性のないクラス同士を組み合わせることができるようにする。→プロパティ・ライブラリ
Builder
複合オブジェクトについて、その作成過程を表現形式に依存しないものにすることにより、同じ作成過程で異なる表現形式のオブジェクトを生成できるようにする。→通信オブジェクト・クラス
Facade
サブシステム内に存在する複数のインターフェイスに1つの統一インターフェイスを与える。Facade パターンはサブシステムの利用を容易にするための高レベルインターフェイスを定義する。→ソケット操作ライブラリ
Iterator
集約オブジェクトが基にある内部表現を公開せずに、その要素に順にアクセスする方法を提供する。→イテレータ
Mediator
オブジェクト群の相互作用をカプセル化するオブジェクトを定義する。Mediator パターンは、オブジェクト同士がお互いに明示的に参照し合うことがないようにして、結合度を低めることを促進する。それにより、オブジェクトの相互作用を独立に変えることができるようになる。→メディエーター・クラス
Observer
あるオブジェクトが状態を変えたときに、それに依存するすべてのオブジェクトに自動的にそのことが知らされ、また、それらが更新されるように、オブジェクト間に一対多の依存関係を設定する。→タイマー・ライブラリ 通信スレッド・クラス
Singleton
あるクラスに対してインスタンスが1つしか存在しないことを保証し、それにアクセスするためのグローバルな方法を提供する。→プロパティ・ライブラリ
State
オブジェクトの内部状態が変化したときに、オブジェクトが振る舞いを変えるようにする。クラス内では、振る舞いの変化を記述せず、状態を表すオブジェクトを導入することでこれを実現する。→ステータス・クラス
Strategy
アルゴリズムの集合を定義し、各アルゴリズムをカプセル化して、それらを交換可能にする。Strategy パターンを利用することで、アルゴリズムを、それを利用するクライアントからは独立に変更することができるようになる。→SQL操作ライブラリ 五目並べ競技ルール判定基底クラス
Templete Method
1つのオペレーションにアルゴリズムのスケルトンを定義しておき、その中のいくつかのステップについては、サブクラスでの定義に任せることにする。Template Method パターンでは、アルゴリズムの定義を変えずに、アルゴリズム中のあるステップをサブクラスで再定義する。→プロトコル基底クラス
Visitor
あるオブジェクト構造上の要素で実行されるオペレーションを実現する。Visitor パターンにより、オペレーションを加えるオブジェクトのクラスに変更を加えずに、新しいオペレーションを定義することができるようになる。→通信オブジェクト・クラス

詳細目次

  1. 動作の概説
    1. 設計方針
    2. プロトコル
    3. 設定ファイルなど
    4. コンパイル
  2. 共用ライブラリ
    1. プロパティ・ライブラリ(SugProperty.java)
    2. タイマー・ライブラリ(GoTimer.java)
    3. SQL操作ライブラリ(SQLManager.java)
    4. ソケット操作ライブラリ(SocketIO.java)
  3. サーバ
    1. メインクラス(GoServ.java)
    2. サーバのスレッド(ServerThread.java)
    3. 五目並べサーバスレッド(GomokuServerThread.java)
    4. プロトコル基底クラス(Protocol.java)
    5. 五目並べ用のプロトコルクラス(GomokuProtocol.java)
  4. アプレット
    1. メインクラス(GoApplet.java)
    2. メディエーター・クラス(Mediator.java)
    3. 通信スレッド・クラス(CommThread.java,CommNotify.java)
    4. 通信オブジェクト・クラス(CommItem.java,HandCommItem.java,WinCommItem.java,LoseCommItem.java,NogameCommItem.java)
    5. GUIオブジェクト・クラス(BoardImage.java,Controls.java,JumpDialog.java)
    6. ステータス・クラス(Status.java,SelfStatus.java,PartnerStatus.java)
  5. 五目並べ競技ルール判定
    1. 基底クラス(Rule.java)
    2. イテレータ(RuleIterator.java)
    3. 勝負判定クラス(GomokuRule.java)
  6. 感想



copyright by K.Sugiura, 1996-2006