《付録》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,