| xin's profile流隙PhotosBlogLists | Help |
流隙我的灵魂平静而明亮,宛若清晨的群山。可是他们认为,我冷酷,是开着可怕玩笑的嘲讽者。 |
||||||||
|
J2ME开发
|
March 20 j2me脚本引擎Snake脚本编译器已升至1.2
虚拟机没什么改动还是1.1
修正bug
1.#define宏定义问题
2.增加主引擎脚本调用方法
重点是第二项改变,做游戏的同胞一定会用得到
里面有主引擎调用脚本方法的例子
August 01 SnakeScript1.1.0SnakeScript1.1版本(截止8.1)
新增功能及特性
1.动态优先级设定
可以在程序运行的时候动态改变某个脚本的优先级 2.动态实现脚本的加载、释放、暂停、恢复、结束等控制
这些对脚本运行的控制已经可以写入不同脚本里,而不是主引擎去调用这些功能, 这意味着RPG脚本分为主脚本和很多子脚本,主脚本负责在游戏运行过程中动态的 管理所有的子脚本 3.自动堆栈平衡 如果进行对主引擎函数的调用,则调用结束后无需手动传入参数个数来平衡堆栈,脚本引擎代劳,防止人为因素的错误发生 4.无限级别函数调用
曾经用了一个函数追踪栈来记录函数之间的调用信息,因为初始化的追踪栈是有限的,所以只支持有限级别的函数调用(比如32级) 现在通过更好的方法将函数调用信息记录到堆栈上,实现了无限级别调用,可以实现完全的地归操作,(受限与堆栈大小) 5.主引擎对脚本函数的异步及同步调用
这个是实现起来最复杂功能(占用新版本开发的50%时间),可以在任意时候,任意位置来让主引擎去调用脚本里的方法,同步异步都支持 不明白同步异步的同学去看脚本例子,内含介绍 6.脚本和脚本之间函数的同步和异步调用
这也是新版本的核心功能,现在设计脚本RPG的模式就非常清晰了,比如一个npc脚本使用了一个爆炸道具,这个npc脚本就能通知附近的油桶脚本(函数调用) 让油桶脚本播放爆炸的动画,很酷!!! 7.函数参数类型化声明
在声明函数的时候无需像以前一样传入参数个数,而是传入参数名和希望的类型,这样可以让调用者明白传什么样的参数最合理 8.静态内存初始化
一个朋友希望数组初始化能像C或java一样简单,而不是一个一个赋值,我想了一下觉得建议很好,立即实现这样初始化 比如 var xiaoxin[4] = {1, 2, "xiaoxin", 3, 5} 9.支持内嵌虚拟指令集
我非常喜欢C++里的内嵌汇编模式,于是在脚本编译器上也实现了同样的功能 _svm{ PUSH 10 PUSH 20 POP _T1 POP _T0 ADD _T0, _T1 PUSH _T0 POP _RetVal } 一个简单的加法虚拟机指令代码,可以嵌入.ss脚本代码的方法里 10.struct结构支持
还是应为很喜欢C代码的缘故,加入struct数据结构,这个没什么可说的,就是方便组织数据 struct结构可以嵌套 例: struct Anima{ var data[20] } struct Player{ var x; var y; Anima ani; } 11.实现include指令
可以编写静态库,功能和C的是一样,编译的时候查找并链接,我写了一个system库,主脚本如果要实现对虚拟机的控制需要#include预编译指令链接 12.优化脚本虚拟效率再提升30%
测试机 SE w810 SnakeScript1.0 每秒运行运行指令个数 24000条 SnakeScript1.1 每秒运行运行指令个数 35000条 看看在J2SE上的运行 SnakeScript1.0 每秒运行运行指令个数 4584030条 SnakeScript1.1 每秒运行运行指令个数 6276859条 注意: 影响效率的因素:1.多脚本并发执行,上下文切换有性能损失(5%) 2.脚本对主引擎API调用(host方法调用),性能损失(10%) 3.脚本之间的函数异步调用,性能损失(10%) 下载地址 June 24 SnakeScript1.0正式版(优化)最近抽了点时间对脚本进行了升级,升级的重点放在易用性和执行效率上 比如
在脚本李可以很轻松的编写switch语句
swtich(a){
case 1:
//.....
break;
case 2:
//....
break;
default:
//,,,,
break;
}
也可以很容易编写这个语句
for(var a = 0; a < 10; a += 1){
//todo
}
修改了手机端执行引擎的部分代码,让执行更有效率
遗憾的是没能实现累加和累减操作 比如a++ --a,虽然底层指令集支持但是要和上层的脚本编译器融合需要一点时间
加入了一个可视化的编译器(带UI)但是没什么编辑功能,推荐用ultraedit写脚本
附带几个开发时的文档,有一定的研究价值
下载地址
GameSnake 荣誉出品 October 29 SnakeScript0.8 (蜕变)September 08 遗传算法—寻路篇 遗传,生物学中的一个伟大的学科,至今都令我着迷,尤其是那短短几微米的DNA双螺旋结构,居然能编码出N百万种蛋白质,把一个生物体完美的表现出来,而遗传算法是是利用计算机模拟对生物体进行编码,让这些模拟的DNA进行配对杂交,变异,最后模拟自然选择从中挑选优秀个个体再进行配对,杂交,变异,最终这样一代又一代的选择下去,优秀基因个体可以很好的遗传给后代,那些拙略的个体最终被淘汰,最后所有的个体几乎都趋向完美,用在算法里也就是说找到了问题的解。所以说,遗传算法(GA)一种神奇的算法,将人们最终摆脱了只有对人工智能进行硬编码的误区。
幸亏自己从小喜欢生物,以及进化论,所以对遗传算法也是情有独钟,看完游戏编成中的人工智能技术这本书,将里面用遗传算法的寻路写成了j2me的代码,可视的寻路会更有意思。
设计概要:
1.进行对问题的编码(DNA),用两个bit编码4个方向: 00:北 01:南 10:东 11:西 (单个基因)
2.初始化基因组群体(100个),每个基因组含有70个单基因(即70步,比玩家在地图上走到终点的最远距离还长一些)
3.进行世代循环
while(true){
1.检查这100个基因组,看看他们解决问题的性能怎么样(某个基因走不通,抛弃该基因,进行下一个基因)最终为这100
个基因组每个分别分配一个曼哈顿系数(适应性分数)如果为1,则证明找到出口,跳出循环。
2.用赌轮选择算法从100个基因组中挑出2个作为父母基因(基因组的适应性分数越高被选中的几率越大)进行杂交将其
优秀基因传给下一代
3.对新诞生的基因进行变异(变异率非常的小)变异操作就是0变1 1变0
4.用下一代基因组代替上一代组,即新诞生100个基因组来代替原来100个基因组
}
作为遗传算法去寻路有个问题,就是每次寻路的时间不同,有的经过不到10代就能找到,有的经过100代的子孙都还没有找到路。
改进措施:
1. 初始化基因组是完全随机,没有策略,所以有的时候初始群体会很糟糕。
2.修改适应性分数分配函数,使多次进入同一小格的基因得到惩罚,这样能更有效的找到出口
3. 对于繁殖出的新基因需要进行外部保存,这样下次就能从文明世代向前进化,不必每次都从野人世代开始
4. 遗传算法由于用途太广,太新颖,以至于对某种特定的问题进行求解反而不如针对特定问题而开发的算法效率高(比如A*)
但是遗传算法是人工智能的风水岭,以前的硬编码的算法被隔离开来,计算机能自主编码,向前进化。
J2ME 测试程序(需要用sony的模拟器 WTK2.3 会爆内存)
J2SE 测试程序(JDK 1.6)
|
|||||||
|
|