パスと投了の処理を移植したので、Igo1_13として公開します。
これで、ボタンの処理が一通りできました。
[NEW]ボタン:ゲームを開始します。
[REPLAY]ボタン:棋譜を再生します。
[PASS]ボタン:パスします。
[RESIGN]ボタン:投了します。
【図20 Igo v1.13の画面】
図では勝敗が一応表示されていますが、まだ勝敗の判定が不十分です。
勝敗の判定を作りこんでから公開しようかと考えていましたが、クラス間の関係がだんだんややこしくなっていくのを整理したくなったり、いろいろやっているうちに、「徐々に作る」というスタイルから外れそうになっていることに気づき、ここで一旦公開することにしました。
Small Basicのプログラムではクラスという概念がないので、ただただ作りこんでいましたが、Javaではクラスをどう設計するか、結構悩ましいです。クラスの設計は、ざっくり言うと、データ(フィールドやローカル変数)とアルゴリズム(メソッド)をどのクラスに所属させるのか、ということになると思いますが、現実の世界の概念からなるべくかけ離れないように自然な設計を目指したいと思います。クラスをうまく設計することで、似たような処理のコードをなるべく省略し、全体をコンパクト、シンプルにできれば、よい設計と言えるでしょう。
現在公開しているプログラムを大雑把に整理すると、以下のようなクラスで構成されています。
【アプレット – ゲーム本体とGUIを統合】
nonkit.applet.Igo — 囲碁アプレット <GameAppletを継承>
nonkit.boardgame.GameApplet — ゲームアプレット <GameVisualを継承>
【GUI – グラフィックスのデザイン】
nonkit.gui.GameVisual — (WindowBuilder Editorによる)GUIの設計
nonkit.control.IGoBoardControl — 碁盤のGUIコンポーネント <BoardControlを継承>
nonkit.control.BoardControl — ゲーム盤(三目並べ)のGUIコンポーネント
nonkit.control.PieceControl — 駒のGUIコンポーネント
nonkit.control.LED — LED(GUI)コンポーネント
【ゲーム本体 – 基本的にGUIを含まない】
nonkit.boardgame.igo.IgoGame — 囲碁のゲーム(ルール等) <Gameを継承>
nonkit.boardgame.Game — ゲーム(三目並べルール等)
nonkit.boardgame.igo.IgoBoard — 碁盤 <Boardを継承>
nonkit.boardgame.igo.Unit — 連 <Stonesを継承>
nonkit.boardgame.igo.Stones — 石の集合
nonkit.boardgame.Board — ゲーム盤(三目並べ)
nonkit.boardgame.GameRecord — 棋譜
nonkit.boardgame.IntMatrix — int型の2次元配列
nonkit.boardgame.Pos — 位置
nonkit.boardgame.Human — プレーヤー「人間」 <Playerを実装>
nonkit.boardgame.Random — プレイヤー「乱数」 <Playerを実装>
nonkit.boardgame.Player — プレイヤーインタフェース
これが本当にシンプルな設計なのか、まだ疑問を感じるところもあります。三目並べをベースにしているので、
ルールについてもGameとIgoGame
盤についてもBoardとIgoBoard、BoardControlとIgoBoardControl
アプレットについてもGameVisual、GameAppletとIgo
というクラスにコードが分散しています。クラスひとつひとつは小さくなりますが、クラス間の関係は複雑になっていきます。これからもクラス間でフィールドやメソッドを移動したり、クラスを分割・統合し、全体としてよりシンプルなコードになるようトライしていくつもりです。
それと並行して、囲碁アプレットの移植をなるべく早く終えたいと思います。
(つづく)