《付録》Tetrimino2.py

# -*- coding: utf-8 -*-
#===============================================================================
#    Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# Change History: Games
#    1988/05, Smalltalk
#    2004/09, Java
#    2005/02, C#
#    2005/03, Jython
# Change History: WPF examples
#    2008/01/25, IronPython 1.1.1 (download)
#    2008/08/22, IronPython 1.1.2 (download)
#    2008/03/16, ver.2.0, WPF
#    2008/00/00, ver.2.1, IronPython 1.1.2 
#===============================================================================
from System.Windows import *
from System.Windows.Media import *
from System.Windows.Shapes import *

from hexagon import HexStone
## --------------------               
class Omino(object):
    _mat1 = [
        ( 1, -2),
        ( 2,  0),
        ( 1,  2),
        (-1,  2),
        (-2,  0),
        (-1, -2),
        ]
    _mat2 = [
        ( 0, -4),
        ( 2, -4),
        ( 3, -2),
        ( 4,  0),
        ( 3,  2),
        ( 2,  4),
        ( 0,  4),
        (-2,  4),
        (-3,  2),
        (-4,  0),
        (-3, -2),
        (-2, -4),
        ]
    _strokeColor = Brushes.Black

    def __init__(self, x, y, phase=0,
            color=None, mino1=, offset=1,
            ):
        self.x = x
        self.y = y
        self.phase  = phase
        self.color  = color
        self.mino1  = mino1
        self.offset = offset

        self.matrix1 = self._matrix(x, y, self._mat1)
        self.shape   = self._shape (x, y, self.phase)

    def _matrix(self, x, y, matrix):
        M = 2
        Ox = HexStone._dx; W = HexStone._width
        Oy = HexStone._dy; H = HexStone._height

        X = Ox + W*x
        Y = Oy + H*y
        self.pivot = self.pointCollection([Point(X + dx*M, Y + dy*M)
            for dx, dy in HexStone(X, Y, False).vertices])

        s = 
        for ix, iy in matrix:
            X = Ox + W*(x+ix)
            Y = Oy + H*(y+iy)
            s.append(self.pointCollection([Point(X + dx*M, Y + dy*M)
                for dx, dy in HexStone(X, Y, False).vertices]))
        return s

    def pointCollection(self, vertices):
        s = PointCollection()
        for e in vertices:
            s.Add(e)
        return s

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

    def _rotate1(self, n, sign=1):
        return (n*sign + self.phase) % len(self._mat1)

    def rotateClockwise(self):      # clockwise
        self.rotate(1)

    def counterClockwise(self):     # counterclockwise        
        self.rotate(-1)

    def rotate(self, sign):
        self.phase = self._rotate1(1, sign)
        for e, n in zip(self.shape[self.offset:], self.mino1):
            e.Points = self.matrix1[self._rotate1(n)]

    def shift(self, n=0):
        self.x += n
        self.matrix1 = self._matrix(self.x, self.y, self._mat1)
        W = HexStone._width
        for s in self.shape:
            s.Points = self.pointCollection([Point(e.X + n*W, e.Y)
                for e in s.Points])

## --------------------               
class SigOmino(Omino):
    def _shape(self, x, y, phase):
        return [Polygon(
            HorizontalAlignment=HorizontalAlignment.Center,
            VerticalAlignment=VerticalAlignment.Center,
            Stroke=self._strokeColor,
            Fill=self.color,
            Points=self.pivot,
            )] + super(SigOmino, self)._shape(x, y, phase)
    
## --------------------               
class PiOmino(SigOmino):
    def __init__(self, x, y, phase=0,
            color=None, mino1=[], offset=1,
            mino2=None,
            ):
        self.mino2   = mino2
        self.matrix2 = self._matrix(x, y, self._mat2)
        super(PiOmino, self).__init__(x, y, phase,
            color, mino1, offset)

    def _shape(self, x, y, phase):
        return super(PiOmino, self)._shape(x, y, phase) + [
            Polygon(
                HorizontalAlignment=HorizontalAlignment.Center,
                VerticalAlignment=VerticalAlignment.Center,
                Stroke=self._strokeColor,
                Fill=self.color,
                Points=self.matrix2[self._rotate2(n)],
                ) for n in self.mino2]
    
    def _rotate2(self, n, sign=1):
        return (n*sign + self.phase*2) % len(self._mat2)

    def rotate(self, sign):
        super(PiOmino, self).rotate(sign)
        for e, n in zip(self.shape[len(self.mino1)+1:], self.mino2):
            e.Points = self.matrix2[self._rotate2(n)]

    def shift(self, n=0):
        super(PiOmino, self).shift(n)
        self.matrix2 = self._matrix(self.x, self.y, self._mat2)

## --------------------               
class TetriminoC(Omino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 1, 2, 3), color=Brushes.Brown,
            offset=0,
            )
## --------------------               
class TetriminoO(SigOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 1, 2), color=Brushes.Yellow,
            )
class TetriminoP(SigOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 1, 3), color=Brushes.Magenta,
            )
class TetriminoB(SigOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 2, 3), color=Brushes.Purple,
            )
class TetriminoY(SigOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 2, 4), color=Brushes.Gray,
            )
## --------------------               
class TetriminoZ(PiOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 2), mino2=(0,), color=Brushes.Red,
            )
class TetriminoL(PiOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 3), mino2=(0,), color=Brushes.Orange,
            )
class TetriminoI(PiOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 3), mino2=(1,), color=Brushes.Cyan,
            )
class TetriminoJ(PiOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 3), mino2=(2,), color=Brushes.Blue,
            )
class TetriminoS(PiOmino):
    def __init__(self, x, y, phase=0):
        super(self.__class__, self).__init__(x, y, phase,
            mino1=(0, 4), mino2=(2,), color=Brushes.Lime,
            )
## --------------------