テトリミノの状態を更新する
(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 の次期リリースを見込んだ、暫定的な措置と考えてください。また「プロセス指向」の立場から、特定のリリースに依存しないように、これらのメソッドを温存するという戦略も考えられます。□