第7章 ライフゲーム(amorphous/torus surface)6/15, IronPython
‖記事一覧‖ C#.use(better, IronPython=”WPF”)
IronPython で学ぶ WPF プログラミングの世界
指針:モデルの再利用
既存のモジュール(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