貌似最近CPPBLOG写一门脚本语言比较流行,连我这种山寨程序员都搞出一个像C又像
BASIC的所谓脚本语言,可见其流行程度。
这个kl脚本例子,是一个具有基本功能的贪食蛇游戏。这个例子中使用了两个插件:
HGE引擎、以及一个撇脚的二维数组插件。因为kl对于数组的实现不是那么漂亮,而我实在
不想因为加入二维数组的支持而让代码看起来更乱,所以直接不支持这个特性。考虑到二维
数组的应用在一些小游戏中还是比较重要(例如这个贪食蛇,总需要个容器去保存游戏区域
的属性),所以撇脚地加了个支持number的二维数组插件。
HGE插件我只port了部分接口,也就是注册了一部分函数到脚本里,提供基本的贴图功
能。(port--我实在找不到一个合适的词语来形容这种行为---HGE到一门脚本语言里,我似
乎做过几次)
不知道有没必要提供贪食蛇的实现算法,这似乎说出来有点弱智。- - 不过为了方便别
人阅读kl脚本代码,我还是稍微讲一下。游戏中使用一个二维数组保存整个游戏区域,所谓
的游戏区域就是蛇可以活动到的地方。每一个二维数组元素对应游戏区域中的一个格子,姑
且称为tile。每个tile有一个整数值表示其属性,如BODY、WALL、FOOD、NONE。蛇体的移动
归根结底就是蛇头和蛇尾的移动。蛇头和蛇尾属性一样,但是蛇头负责把所经过的tile设置
为BODY,而蛇尾则把经过的tile设置为NONE。蛇头的移动方向靠玩家控制,每次蛇头转弯时
,都会记录一个转弯点到一个队列。转弯点包括转弯XY坐标以及转向的方向。蛇尾每次移动
时都会检查是否到达了一个转弯点,是的话就设置自己的移动方向为该转弯点记录的方向。
虽然我写了kl这个脚本语言,但是语言特性并不是我设计的。我只是取了C语言的一些
特性。所以在写这个sample的时候,我对于kl这个脚本语言的感觉,就是一个像basic的C。
因为它太单一,就像BASIC一样只拥有语言的一些基本功能,不能定义复杂的结构,没有天
生的对各种数据结构的支持(例如某些语言直接有list, tuple之类)。
以前中学的时候在电子词典上用GVBASIC写小游戏,当时除了BASIC什么也不知道。今天
写这个贪食蛇例子,感觉就像以前用BASIC。
回头说说一些kl脚本里的特性。从这个例子里(见下载包里的snake.kl),诸如while,
for,if...else if...被支持(之前发布的版本里还不支持for和else if)。全局变量支持
赋初值(上个版本不支持)。当然,还演示了如何使用插件函数。
但是,仍有一些特性在我的懒惰之下被置之不理。例如return后必须跟一个表达式,这
意味着单纯的return;将被视为语法错误。对于if( a && b ),kl会计算所有的表达式,而
别的语言也许会在a会false后不计算b,这也许不算个问题,但起码我还没修正。还有,kl
内部对于错误的报告依然没被修复,少打一个分号你会得到一系列错误的报告,但是却没有
准确的行号。甚至,你会看到解释器崩掉。不要紧,在我心里,它作为当年电子词典上那个
GVBASIC而言,已经很强大的了。:DD
最近接触了很多UNIX和GNU之类的东西,发觉没有提供版权说明的‘开源’,原来都是伪
开源。虽然我也想按照GNU编码标准里所说为kl的发布包里附加Changelog之类的说明,但是
出于懒惰,还是以后再说吧。同样,这次提供的下载里包含了一些编译好的东西,所以我不
保证它在你的机器上依然可以运行。我使用了MingW来编译这些,并且提供有点丑陋的Makefile。
HGE使用了1.81版本。
贴张图给懒得下载的人:
下载例子,包含脚本代码。
如果要获取kl实现代码,建议从我在google的SVN获取:
http://code.google.com/p/klcommon/