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