ゲームに学ぶフレームワーク #3.8: モジュール分割:リファクタリング

前の記事記事一覧次の記事

ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》
モジュール分割:リファクタリング

《著》森こねこ+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第1版♪2003/05/23 ● 第2版♪2009/04/03

■ 概要

アプリケーションを作成する過程を通して、Jython/Swing によるフレームワークを習得します。

典型的なオセロゲームから始めて、蜂の巣(6角形)状の盤面を作り、3人で対戦できるゲームへと進化させます。

《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。

■ 関連記事


》作業中です《

事例:モジュールを起動する

モジュールを起動すると、次のようなウィンドウが現れます。

$ jython2.5.0 -i step07/othelloEx.py 


初期設定された4つの石の上には、他の石(黒/白)を置けません。


最初に、空いたマス目には「黒」石を置けます。ただし、挟んだはずの「白」が「黒」に変化しないのは問題です。


次に、空いたマス目には「白」石を置けます。置ける石が「黒」から「白」に変化したのを確認できます。


さらに、空いたマス目には「黒」石を置けます。ただし、ここに石を置けるのは問題です。

ここでは、空いたマス目なら石を置けることと、その石が交互に(黒/白)変化することを確認します。

事例:Java の世界を Jython から観察する

実行中の Java アプリケーションの状態を、Jython の対話モードで確認できるので便利です。

>>> view = Xview
>>> view
java.awt.Canvas[canvas0,0,0,200x128]

大域変数 Xview を介して、Canvas を参照できます。すると、キャンバスの大きさ(幅x高さ)が 200x128 になっているのが分かります。ここで、次に示すコードの断片と比較してください。すると、幅 150 のウィンドウを指定したのに対して、実際にはキャンバスの幅が狭くなっているのが分かります。

事例:コードの解説

■ モジュール:othelloModel.py
class Model(object):
    def __repr__(self):
        s = self.state
        return "%s(%d,%d,%r)"%(self.__class__.__name__,
            self.geom.x, self.geom.y, ("BW"[not s], "_")[s == None])

石の状態(黒/白)を確認できます。

《Note》3項演算子に代わる「定石」を踏襲しています。

■ モジュール:othelloView.py
class GameBoard(Canvas):
    ...
    _current = True
    
    def _mouseClicked(self, e):
        point = Point(e.x, e.y)
        for k, stone in self.stones.items():
            if stone.geom.contains(point):
                break
        if stone.state == None:
            stone.state = self._current
            self._current = not self._current
            self.repaint()
        else:
            raise Exception("*** (x.x) too bad ***")

マス目に他の石がないなら、交互に石(黒/白)を置けます。

Tips

Last updated♪09/06/26