第7章 ライフゲーム(amorphous/torus surface)6/15, IronPython

記事一覧 C#.use(better, IronPython=”WPF”)

IronPython で学ぶ WPF プログラミングの世界

《著》小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部
第3版♪2008/04/28


指針:モデルの再利用

既存のモジュール(Swing/Jython 版)を再利用することを最優先します。

from hexOthello import HexStone

ビュー(Swing)に依存しない、モデル(Jython)を記述した hexOthello.py を再利用します。ここでは、WPF アプリケーションとして実現するので、ビュー(Swing)に依存しない、独立したモジュール管理が肝要です。

生命体が占有するセルを配置する

テストケースの動作を確認するために、2つの生命体をコロニーに配置します。

class ExWindow(Window):
    def init(self):
        target = "canvas",
        self._Controls(target)
        self.colony = self._colony()

インスタンス属性 self.colony は、多数の生命体が集うコロニーを管理します。

    def _colony(self):
        colony = Colony()
        for e in [
            ExHexStone(self, 2, 2, False,
                Stroke=Brushes.Blue, Fill=Brushes.Cyan  ),
            ExHexStone(self, 4, 2, False,
                Stroke=Brushes.Red,  Fill=Brushes.Yellow),
            ]:
            self.canvas.Children.Add(e.shape)
            colony.addCell(e)
        return colony

2つの生命体(青/赤)が占有するセルを用意して、それぞれをコロニー colony に追加 addCell します。

生命体が占有するセルを生成する

既存のモジュール hexOthello.py を再利用するとともに、WPF に固有の情報を付加します。

class ExHexStone:
    def __init__(self, client, x, y, state, Stroke=None, Fill=None):
        self.client = client
        self.name = "_%d_%d"%(x, y)
        self.shape = self._shape(x, y)
        if Stroke:
            self.shape.Stroke = Stroke
        if Fill:
            self.shape.Fill = Fill

生命体が占有するセルを生成するときに、輪郭(Stroke=)内部(Fill=)の色を設定できるようにします。

    def _shape(self, x, y):
        name = "_%d_%d"%(x, y)
        x = HexStone._dx + x * HexStone._width
        y = HexStone._dy + y * HexStone._height
        
        points = PointCollection()
        for dx, dy in HexStone(x, y, False).vertices:
            points.Add(Point(x+dx*2, y+dy*2))

        s = Polygon(
            Name=name,
            HorizontalAlignment=HorizontalAlignment.Center,
            VerticalAlignment=VerticalAlignment.Center,
            Stroke=Brushes.Black,
            StrokeThickness=1,
            Fill=Brushes.Green,
            Points=points,
            )
        s.MouseUp += self.mouseUp
        return s

セルを構成するときには、既存のモジュール hexOthello.py を再利用します。プロバティー Name= を使って、各セルを識別します。

    def mouseUp(self, sender, e):
        life = self.client.combineLife(sender.Name)

        points = PointCollection()
        for e in life.points:
            points.Add(e)

        self.client.addShape(Polygon(
            HorizontalAlignment=HorizontalAlignment.Center,
            VerticalAlignment=VerticalAlignment.Center,
            Stroke=sender.Stroke,
            StrokeThickness=3,
            Points=points,
            ))

選択したセルの識別情報 sender.Name をもとに、一方の生命体を指定すると、隣接する他方の生命体と接合した、新たな多細胞生命体 life が得られます。その頂点の座標 life.points をもとに、新たな多角形をキャンバスに追加 addShape します。

》こちらに移動中です《
TOP


関連記事

Last updated♪2009/12/01