テトリミノの状態を更新する

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

class Omino(object):
    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)]
        self._update()      # here goes ... (^.^)

    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])
        self._update()      # here goes ... (^.^)

テトリミノの回転/シフトに伴って、その状態を更新 self._update() します。

    def _update(self):
        s = self.spots()
        if self.any([e in self.tray.leftEdges  for e in s]):
            self.shiftRight()   # left -> right
        if self.any([e in self.tray.rightEdges for e in s]):
            self.shiftLeft()    # right -> left

    def all(self, s):           # compensate for Python 2.5
        return False not in s
    
    def any(self, s):           # compensate for Python 2.5
        return True in s

テトリミノの回転/シフトに伴って、その状態を更新します。領域内に収まらないときには、テトリミノを(必要なだけ)左右にシフトします。ここで注意して欲しいのは、相互参照による再帰呼び出しになっていることです。さもないと、無限ループに陥りかねません。


《Note》組み込み関数 all/any:Python 2.5/IronPython 1.1.1 の互換性の問題から、組み込み関数 all/any に準拠したメソッドを用意しました。ただし、これらのメソッドの本体は、テストケースに特化したもので、組み込み関数 all/any との完全互換性には配慮していません。IronPython の次期リリースを見込んだ、暫定的な措置と考えてください。また「プロセス指向」の立場から、特定のリリースに依存しないように、これらのメソッドを温存するという戦略も考えられます。□