`
点击学习>>《龙哥手把手教你学LabVIEW视觉设计》视频教程
【每周一练】labview益智游戏 - 黑白棋挑战赛前篇&后篇【进行中……】https://bbs.elecfans.com/jishu_527566_1_1.html
【每周一练】LabVIEW益智游戏 - 2048【已结束】https://bbs.elecfans.com/jishu_522517_1_1.html
【每周一练】LabVIEW益智游戏 - 24点【已结束】https://bbs.elecfans.com/jishu_517445_1_1.html
每周一练第三期为益智游戏-2048,活动已经结束了,源程序和评分都已在原网页上发布
https://bbs.elecfans.com/jishu_522517_1_1.html,欢迎大家下载学习。
这次拿到了一个很高的分数,这么高的分数也是出乎我的意料的,能拿到高分可能有以下原因吧!
1、仔细读题,清楚出题者的考查点
说出来有点像学生考试哈,不过这个程序设计确实就是这样,基础功能分都是按题目的设计要求来的,上期的24点我觉得我能拿到更好的分数,但实际的得分并不高,看了评分表发现有些地方是按自己设计的做的,与出题者的考查点存在出入,所以得分并不高。这期的其他两位的作品大概也犯了这样的错误,如fusongxinyi的作品中基础功能都实现的挺好,但历史最高分及实时显示时间却都没有做,比较可惜,相信如果他多注意题目要求的话,做出这些功能应该没有问题。最新期的黑白棋同样有使用菜单等各种要求,大家多注意要求,有不明白的就回复提问,版主肯定会给大家解答,这样大家都能取得理想的成绩。
2、在
论坛看到了其他的相关作品
论坛中有关2048的作品主要有:
ZHZJK:
https://bbs.elecfans.com/jishu_453603_1_1.html
小鹰figh
ting:
https://bbs.elecfans.com/jishu_521133_1_1.html
只要多留意下论坛,大家应该都能看到这两个作品,主要想说明以下几点:
①参考别人的作品最好在参考资料中说明,转载他人的作品需注明出处及原作者;
②也正是因为有了其他人的作品,如果我们的作品仅仅是仿制(甚至功能比不上他们的作品),我们的工作也就是没有意义的,我们必须对自己的作品有更高的要求,一定要有自己的东西:修正他们的bug、补充他们的不足,或者扩展更多的功能……
③参考ZHZJK的作品,可完成2048的基础功能,但失败判断存在bug,需修正;参考小鹰fighting的作品,可以对移动特效的实现有一定的启发,(其作品还具有较高的AI功能,但我并没有参考其AI的实现)。
这一期的黑白棋论坛也有相关作品:
https://bbs.elecfans.com/jishu_209415_1_1.html,大家可以拿来参考,同时希望更多的是加上自己的东西。
高分主要原因大概就是这些吧,下面分享一下设计思路,主要还是《开发者文档》中的内容:
1、基本功能:
1.1、在4*4的方格内随机生成2和4:
扩展为任意大小方格,为界面显示,方格大小限定在3*3至6*6之间;
随机生成2和4,设计为可加权的生成2和4以及其他值:
如设置为“1,1”表示2和4出现概率各占50%,即题目要求设置,
如设置为“2,1,1”表示2出现概率(2/(2+1+1))=50%,4出现概率25%,8出现概率25%;
随机生成数的位置为当前所有空余位置随机取一个。
1.2、能够使用键盘方向键控制移动:
采用事件结构检测键盘输入。
1.3、显示当前得分,得分规则请参考
http://2048game.com/:
原网页无效,根据其他游戏参考所得分数即为合成的新值。
1.4、显示历史最高分,通过读写配置文件记录该数据;
写明为配置文件,采用ini配置文件,同时利用配置文件队列特性,保存程序运行中的数据;该数据只有退出时才保存到文件中。
1.5、实时显示当前已运行时间;
多开一个循环实时显示,采用对齐的延迟等待,0.1s刷新一次。
1.6、至少两个按键“新游戏”和“停止”,点击“新游戏”运行时间重新开始计时;
至少的功能。
2、基础功能:
2.1、方向移动:按指定的方向,利用数组的旋转特性统一成一种形式,去除0,合并相同的值,补充0;
2.2、随机加点:在空位置中随机选取一个位置,按设定的权值生成新值;
2.3、主体控件:可选取图片下拉列表组成的数组,考虑移动特效,可通过多个控件组成引用数组实现;
又扩展为任意大小方格,多个控件的引用数组比较困难,选取二维图片控件更为方便有效,同时为在子VI中实现图像输出,使用控件的引用。
3、扩展功能
3.1、数字移动时,能够看到移动的特效:(难度较高)
对移动进行分析,确定每个点移动的原值、新值、移动的距离(及该点起始坐标);
根据分析结果将所有的点分两类:不动点、移动点;
将不动点组成新的数组(其中的移动点的位置用背景0代替)画图输出为背景;
将移动点的坐标循环微量变动实现图像的变动,以一个方格为单位,每移动一个方格距离-1,将距离为0的点从移动点中删除作为不动点;
循环以上过程至移动点为空,完成移动特效。
程序中分析偷懒了,而是直接画全0背景,之后直接进行循环,效果一样,理论上效率降低了,实际未测试。
3.2、AI功能,用LabVIEW写个自动运行的程序,不建议使用动态链接库;能自动运行到512就满足要求了:(难度中高)
基于512的设计需要,采用贪心策略(就是找目前看最好的移动策略,不去搜索多少多少步……)。
关键是要有一个好的评估函数,之前对该游戏不熟,评估函数也不太会写,随便写了个,仅考虑了局势的杂乱度(即每个点与其上下左右四个点的差值的绝对值的和),杂乱度越低,局势越有利;
模拟局势按各个方向移动一步或两步,计算新局势的评估函数值,选择当前最有利的移动方向作为移动策略。
该策略仅能80%概率保证达到512,测试概率大致为:512以下20%,512占60%;1024占15%;2048在5%以内;4096及以上不可能,最高得分33000左右。
该思想应该没有问题,主要是评估函数还不太完善,如果评估函数写好了,应该能有95%以上保证512,20%以上到2048。
本AI限制了左上角为最大值点,对于设定开局、人间游戏提示效果不理想,可通过改善评估函数解决;
本AI可适用于任何加点设置、任何大小方格;
4、其他扩展:
4.1、扩展图片样式,实现加强版、朝代版扩展等不同的图片版本;
4.2、实现存档读档;
5、未做扩展:
5.1、增加存档读档的选择功能,实现更多的存档;
5.2、利用修改ini文件读档,实现设定模式、开局模式等;
5.3、利用计时器实现限时功能;
6、优化总结
6.1、界面优化;
6.2、程序模块化,建立子VI;
6.3、程序注释;
6.4、图标设计:直接复制的别的图标,有的形象,有的不形象,最好不要是LabVIEW的默认图标;
6.5、文档完善。
`
6