- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
RAPTOR可视化编程供参习
加入能量守恒的生命游戏
Raptor编程:能量守恒的生命游戏
作者:软件33任然
问题的由来
本作业的灵感是来自我在百度百科上阅读的一篇小论文,该文作者以能量的方式阐述了生命的由来,让我不禁眼前一亮,联系到老师给我们示范的生命游戏的Raptor程序,我便有了这个加入能量守恒定律规定生命游戏的想法,并付诸于实现。
规划方案
首先,该算法是基于生命游戏的一个衍生程序,所以我查找了有关生命游戏的Raptor程序,并进行了研究,改进(这里要感谢程亮同学给我提供的一个参考)。该算法最困难的地方在于能量守恒和检测每一单元能量值的部分。对此,我打算采用二维数组,以及循环嵌套的方法来完成。另外关于界面交互方面,我打算用简洁明了的方式展现,是同学们在第一次试运行时可以轻松上手。
在能量守恒方面,我决定使用数组的方法,给初始单元所在数组赋予一定能量值,并采用了平均分配的方法,即一个单元在每一次循环中拿出它一半的能量平均分配给其周围八个单元,这样就有了能量的传递。在显示方面,我设置了一个阈值,只有当单元所含能量值大于该阈值,该单元才会显示,这样就有了新单元的生成。能量不断的被传递,伴随而来的便是不断地有新的单元显示和旧的单元消失。而每个单元类似于一个生命,这也就有了生命的变化。
实施并解决问题
1,实践前期
在实践前期,用户交互部分完成较为顺利,在获取鼠标坐标显示单元部分,由于对循环程序运行不够明了,使得坐标获取后无法及时运行下一步算法,最终我采用了Wait_For_Mouse_Button(Left_Button)函数使问题解决。(如图-4,图-5,图-8)
2,实践中期
在实践中期,由于能量守恒定律的加入,使该程序需要两次循环检测,第一次是分配能量,第二次是判断该单元是否显示并完成显示和消失。因为检测有前后顺序,前面单元能量分配会影响到后面单元能量的分配,使整体图形向右偏移,所以我采用了双数组的形式,将单元初始值赋给第一个数组,将分配的能量值赋给第二个数组,等分配完毕后再将第二个数组的值加给第一个,然后将第二个数组归零,这样就巧妙的解决的图像右移的问题。(如
图-11,图-13)
在能量赋值上,因为用户界面一共有3600个单元,我预设的阈值为30,所以要使全部单元都显示则一共需要108000的能量值,所以我给每个初始单元赋给了5000的能量值,这个结果是通过实验试出来的,如果愿意,可以自己更改。
在将第二个数组归零中,我开始是等整个运算完成后,在用循环结构将其归零,但发现这样增加了许多无用的步骤,使运行速度大幅度变慢。最终,我将归零步骤放在第一次循环中,解决了这个问题。(如图-13)
另外,由于双循环的存在使程序运行速度变慢,并且调用函数会使速度大大降低,为了减少函数调用的次数,我引入了第三个数组,将前一次显示的单元对应的地址赋予1,不显示的单元赋予0,在第二次循环完成显示与消失时可以减少调用填色的函数,在实际运行时,这一设置发挥了明显的作用。(如图-8,图-13,图-14,图-15)
还有一个小细节,由于Raptor程序设定的因素,如果赋给数组的值小于其设定值,程序会显示错误,因此,我在分配能量中,对单元能量值得判断不是“是否大于一”,而是是否“大于十的负五次方”。在这种设置下,能量的分配或许会有一点小误差,但由于数量级很小,可以忽略不计。(如图-10)
3,实践后期
在制作后期,主要是界面优化,利用图片处理软件,得到预期想要的样式,由于Raptor不能输入汉字,所以采用这种图的形式效果最好。然后将图填入,并利用鼠标坐标获取函数,得到有关位置(如“开始”,“说明”,“退出”等)的坐标范围,利用这些坐标范围进行后续有关程序是否运行的判断。期间,为了加入“说明”中“返回”这个功能,我加入了循环,并给与了player三个值进行判断,使其可以无限次的返回。(如图-1,图-6,图-11)
回顾与思考
回看整个程序,会发现在分配能量和检测单元能量值是否超过阈值的部分占用了大部分的运行时间,由于随着能量的分配范围的扩大,无法确定哪些地方没有能量,所以我采用了蛮力法,但这样使运算时间大大加大,所以我想,有没有一种算法可以在这种情况下对数组进行迅速判断,节省运行步骤,缩短时间。
并且,因为能力的关系,在用户界面方面,仍旧感觉有些呆板,不够生动,灵活。在运行过程中单元的形式很简单。但我觉得这是Raptor平台的一个不足之处,没有很好地界面图形编辑功能。另外,由于Raptor的基础设定,许多功能无法实现,例如,对一个数组整体归零,在Raptor中需要一步一步来,并没有类似于C语言中的static函数调用。
另外,由于Raptor不支持汉字的输入与输出,所以想要表现出汉字还需要用图来解决,这使得很多问题复杂化。但这种方法也有一个好处,那就是你可以使用你想用的任何一种
文档评论(0)