ゲームに学ぶフレームワーク #3.8: 演算子 not を利用する

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

ゲームに学ぶ Jython/Swing フレームワーク《Jython2.5》
演算子 not を利用する

《著》森こねこ+小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第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 


>>> Exception: *** (x.x) too bad ***
初期設定された4つの石の上には、他の石(黒/白)を置けません。例外 Exception を生成します。


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


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


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

》作業中です《

事例: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

現在の手 _current を管理(先手は黒 True)します。

    _offset = [(x, y)
        for y in range(-1, 2)
        for x in range(-1, 2)
        if x or y
        ]

隣接(8連結)するマス目のオフセット値 _offset を設定します。

    def _mouseClicked(self, e):
        point = Point(e.x, e.y)
        e = self.detect(lambda e: e.geom.contains(point))
        if e.state == None:
            e.state = self._current
            self._current = not self._current
            self.repaint()
        else:
            raise Exception("*** (x.x) too bad ***")

マス目に他の石がないなら、交互に石(黒/白)を置けます。演算子 not を利用して、インスタンス属性 self._current の値が、True/False と交互変化します。

Tips

Last updated♪09/07/01