ゲームに学ぶフレームワーク #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 で再構成しました。
■ 関連記事
- INDEX〈Python〉
- INDEX〈Swing〉
- Java プログラマーのための Python 導入ガイド
- IronPython で学ぶ WPF プログラミングの世界《IronPython2.6》改訂版
事例:モジュールを起動する
モジュールを起動すると、次のようなウィンドウが現れます。
$ 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