《付録》exTetrimino2.py

# -*- coding: utf-8 -*-
#===============================================================================
#    Copyright (C) 2000-2008, 小泉ひよ子とタマゴ倶楽部
#
# Change History: Games
#    1988/05, Smalltalk
#    2004/09, Java
#    2005/02, C#
#    2005/03, Jython
# 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 _ant import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Input import *

from Tetrimino2 import *
## --------------------
class TestCase:
    types = "COpbYZLIJS"

    def __iter__(self):
        m = self.items()
        for e in self.types:
            yield e, m[e]

    def items(self):
        return dict*1,
            Key.Left : (self.mino.shift, (-1,)),
            Key.Up   : (self.mino.counterClockwise, ()),
            Key.Down : (self.mino.rotateClockwise , ()),            
            })
        self.button.Content = self.state()
        
    def state(self):
        return "Type-%s: rotation = %d"%(
            self.mino.__class__.__name__[-1], self.mino.phase)

class KeyValues:
    def __init__(self, value):
        self.value = value

    def switch(self, cases):
        for key, (f, args) in cases.items():
            if key == self.value:
                apply(f, args)

## --------------------               
if __name__ == "__main__":
    import sys
    xaml = sys.argv[1]
    win = ExWindow(
        Title=__file__,
        Width=232, Height=230,
        Content=xaml,
        )
    Application().Run(win)

## --------------------               

*1:e, eval("Tetrimino%s(4, 4)"%e.upper())) for e in self.types) ## -------------------- class ExWindow(Window): def __init__(self, Content=None, **args): self.InitializeComponent(Content) self.init() def InitializeComponent(self, Content): self.Content = LoadXaml(Content) def _Controls(self, target): controls = xaml_controls(self) for e in target: setattr(self, e, controls[e]) def init(self): target = "tabControl", "button", self._Controls(target) self.items = {} for e, mino in TestCase(): self.items[e] = mino item = TabItem(Header=e) self.tabControl.Items.Add(item) panel = Canvas() item.Content = panel self.addMino(panel, mino) self.tabControl.SelectionChanged += self.selectionChanged self.button.Click += self.click self.KeyDown += self.keyDown def addMino(self, panel, mino): for e in mino.shape: panel.Children.Add(e) def selectionChanged(self, sender, e): self.mino = self.items[sender.SelectedItem.Header] self.button.Content = self.state() def click(self, sender, e): self.mino.rotateClockwise() sender.Content = self.state() def keyDown(self, sender, e): KeyValues(e.Key).switch({ Key.Right: (self.mino.shift, ( 1,

テストケース2:テトリミノのシフト

テストケースを起動すると、ウィンドウが開きます。

回転 シフト

 

 

キー ↓ を押すと(時計回りに)順回転します。

キー ← を押すと、左方向にシフト(平行移動)します。

10種類のテトリミノが、各タブごとに提示されます。テストケース1で作成した、ボタンを押すと順回転する機能は、ここでも有効です。

《Note》Swing/Jython 版では、順回転のみでしたが、今回は逆回転もできます。 □

《Note》矢印キー(←|→)は、タブの選択とも連動しています。そのため、テトリミノを左右にシフトするときは(tab キーなどを使って)タブの選択を外して(ボタンにフォーカスして)からにしてください。□

キー ↑ を押すと(反時計回りに)逆回転します。

キー → を押すと、右方向にシフト(平行移動)します。

テストケースを俯瞰する(2)

既存のアプリケーションに組み込む前に、それとは独立した環境下のテストケースで、新規のモジュールの動作を確認します。


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


Previous|5/36|Next