大顽石

凡事太紧,缘分必早尽

  IT博客 :: 首页 :: 联系 :: 聚合  :: 管理
  9 Posts :: 0 Stories :: 14 Comments :: 0 Trackbacks
看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长条加13种。2长条加23种,每种又最多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。不过,它很有可能在前后都加空格,所以在做字符比较的时候,要注意先把空格去掉。

 

 

posted on 2009-01-18 17:10 大顽石 阅读(656) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。