テトリミノ:石の配置

既存のモジュール hexagon.py を再利用しながら、新たなモジュールの動作を検証するために、テストケースを作成します。

class Omino(object):
    def _shape(self, x, y, phase):
        self.phase = self._rotate1(phase)
        
        s = []
        for n in self.mino1:
            s.append(Polygon(
                HorizontalAlignment=HorizontalAlignment.Center,
                VerticalAlignment=VerticalAlignment.Center,
                Stroke=self._strokeColor,
                Fill=self.color,
                Points=self.matrix1[self._rotate1(n)],
                ))
        return s

すべてのテトリミノに共通する特性を規定するとともに、内周の石 s を配置します。内周の石の配置は、self.mino1 の各要素が示すオフセットによって決まります。

class SigOmino(Omino):
    def _shape(self, x, y, phase):
        pivot = Polygon(
            HorizontalAlignment=HorizontalAlignment.Center,
            VerticalAlignment=VerticalAlignment.Center,
            Stroke=self._strokeColor,
            Fill=self.color,
            Points=self.pivot,
            )
        s = super(SigOmino, self)._shape(x, y, phase)
        return [pivot] + s

回転の枢軸となる石 pivot の回りに、内周の石 s を配置します。枢軸の石 pivot を先頭にして、その後に内周の石 s が続きます。

class PiOmino(SigOmino):
    def _shape(self, x, y, phase):
        s = super(PiOmino, self)._shape(x, y, phase)
        for n in self.mino2:
            s.append(Polygon(
                HorizontalAlignment=HorizontalAlignment.Center,
                VerticalAlignment=VerticalAlignment.Center,
                Stroke=self._strokeColor,
                Fill=self.color,
                Points=self.matrix2[self._rotate2(n)],
                ))
        return s

内周の石 s に加えて、外周の石を配置します。外周の石の配置は、self.mino2 の各要素が示すオフセットによって決まります。