看TK,顺手编写了一个俄罗斯方块的小程序。源码如下:
http://www.cnitblog.com/Files/bigstone1998/russianbrick.rar运行在activeTcl 8.4.16.0环境下。双击程序应该就可开始运行了。也可以把代码拷贝到TK的console环境下去运行。
编写的思路就很简单了:
1.1. TK的俄罗斯方块
1.1.1. 动作分解
1, 定制一个矩阵;
2, 设置一个砖头列表。应该是一个3维数组;
3, 启动一个定时器;
4, 响应键盘事件;
1.1.1.1. 矩阵定义
以我现在的理解,TCL中对矩阵的操作就是一个一个去赋值。可以如下设置:
set glb_x 7 ;# x dimension
set glb_y 11 ;# y dimension
for { set loopi 0 } { $loopi< $glb_x } { incr loopi } {
for { set loopj 0 } { $loopj< $glb_y } { incr loopj } {
set wallarray($loopi,$loopj) 0
}
}
注意,在多维数组的维数变量间,不能够有空格。
1.1.1.2. 设置砖头列表
俄罗斯方块中的砖头就7种。4长条1种,3长条加1弯3种。2长条加2弯3种,每种又最多4种旋转状态。所有,有7*4种砖头格式。每种要用4*4的矩阵来描绘。
1.1.1.3. 启动定时器
下面的例子,有点像一个定时器:
proc thandle { } {
global x
incr x
puts "x is $x.\n"
after 1000 thandle
}
定时器程序要完成的功能是:
下降砖头位置。动不了,就考虑是否删除行。
1.1.1.4. 界面显示
设置7*11个格子,每个格子大小为20*20。所以,总共主窗口就是
调整主窗口大小:wm geometry . 200x100
set x 100
set y 200
wm geometry . $x\x$y
界面显示先用最简方法:每次调用,都依照矩阵的内容,把每个方块都画一遍。不过,可以考虑用点优化,就是保留上次的矩阵,对比差值,来绘图。
1.1.1.5. 设置键盘事件
原理说起来比较简单。用bind . <KeyPress> p_keyproc来把程序和击键挂钩上。实践中要注意的是,具体的键,在%K中反映。但是,这个%K不能够在p_keyproc中用,而只能够在bind . <KeyPress> { …. }中的命令中用。所以,我用了这种形式:
bind . <KeyPress> { p_key { %K } }
把具体的键作为参数传入到函数中。
第二个注意点就是,当我们电击->键的时候,%K返回Right。不过,它很有可能在前后都加空格,所以在做字符比较的时候,要注意先把空格去掉。