`
点击学习>>《龙哥手把手教你学LabVIEW视觉设计》视频教程
【每周一练】labview益智游戏 - 2048【已结束】https://bbs.elecfans.com/jishu_522517_1_1.html
【每周一练】LabVIEW益智游戏 - 24点【已结束】https://bbs.elecfans.com/jishu_517445_1_1.html
【每周一练】LabVIEW益智游戏 - 撑竹竿过河【已结束】https://bbs.elecfans.com/jishu_514770_1_1.html
电子发烧友
论坛每周一练第二期益智游戏24点活动已经结束了,源程序和评分都已在原网页上发布,喜欢的下载下来看看,一定能从中学到很多东西。
我侥幸的得到了第一名,现在跟大家分享一下程序设计经验,其中定会存在不足,还望高手多多指点。
我的程度的整体设计思路已在《开发者文档》中写的比较清楚了,但文档是在最初开发程序时写的,现在看来,也有不正确的地方,接下来跟大家分享该文档,结合文档中的问题与大家在程序设计中存在的问题,再次详细的分析该程序的设计要点。
以下摘自《开发者文档》并适当修改:
1、采用生产者消费者结构
程序可以仅使用事件结构,但生产者消费者结构维护方便,更便于程序的实现。
2、程序比较简单,为了程序结构的简洁,不使用自定义控件
队列元素使用字符串;
扑克的显示使用图片下拉列表组成的数组。
3、程序功能
包括24点游戏、批量24点计算、概率计算(包括理论与随机概率计算)全部的要求。
4、随机生成4个数
给的建议为随机生成4个1-13的数,样本为13^4,不符合实际的52取4的样本。
考虑实际的游戏情况,应该是52随机取4,程序实现中可以先将52张牌随机洗牌,之后抽取最前边4张组成四张牌,下一轮抽取剩下48张牌的最前边4张,依次往后…剩余牌数为0时,自动随机洗牌,同时可增加手动洗牌的功能。
洗牌可采用LabVIEW自带的【重排数组元素】。
可以每次都重新洗牌,对统计概率没有影响,但每次都洗牌不符合实际,同时影响程序性能。
5、计算器
程序中用到了将字符串当公式计算结果,采用LabVIEW自带的【公示节点求值】(该VI功能强大,也比较难懂,本题目的要求比较简单,还可以自己编写简单易懂的程序,也可以使用动态链接库来完成)。
同时计算器需要验证输入的字符串是否符合要求,比如直接输入24,计算结果就是24,需增加验证程序;
计算结果的与(24-精度)跟(24+精度)比较即可判断是否正确(精度建议取1e-6~1/13),直接判断或转为整数(四舍五入等)后判断是否等于24不正确。
6、自动计算公式
即常见的枚举法填运算符,考虑程序运行效率,使用调用动态链接库的方法,由C语音完成算法的实现。
点击“我不会”之后,结果公式自动填入公式输入框,而不是提示栏,便于游戏。
7、自动计算算法
整体运算格式分两种情况:
第1种表达式:(data1□data2)□(data3□data4)=24;
该表达式只用4个数循环代入、穷举4*4*4种运算符即可。
第2种表达式:((data1□data2)□data3)□data4=24;
使用4个数循环代入,该表达式可包括以下表达式:
data1□(data2□(data3□data4))=24;data1□((data2□data3)□data4)=24;(data1□(data2□data3))□data4=24;
但由于减法、除法的两个操作数是不可交换的,增加反减(交换操作数后做减法)、反除(交换操作数后做除法)两个运算,
该种表达式需穷举4*6*6种运算符。
鉴于本程序需求只用提示一个解,以上程序只要找到一个解即可退出返回。
具体算法见源代码,如完全用LabVIEW实现,也可按该代码实现,但LabVIEW的程序效率会较低。
8、批量24点计算
未说明批量的量有多大,但给的样本仅1.27kb,按文件最大20M计算,可一次性读取文件、操作显示,未进行分批次及内存管理;
输出结果用二维数组字符串表示,数组拼接效率地下,尽量采用批量操作;
用时都在1ms内(显示的1ms其实是正好赶上毫秒数更换,并没有1ms),无意思。
9、理论概率计算
应该按52取4的方法计算,样本270725,有解217817,有解率80.4569%,用时18~22秒。
顺便计算13选1选4次的概率,样本为13^4=28561,有解22615,有解率79.1814%,用时1.8~2.3秒。
1820种不同的组合,有解1362,有解率74.8352%,用时0.2~0.4秒,使用该方法可以判断算法是否正确;
以上测试计时用CPU为i5-3470。
10、随机概率计算
自动进行发牌操作,统计有解概率,仅统计与实际游戏相符的52取4的有解概率,理论值为80.4569%。
增加保留历史发牌总数与有解数量的功能,清除数据时数弹窗提示。
测试的几千万的历史数据得到的概率为80.44%~80.46%,与理论值80.4569%接近。
11、界面设计、程序注释、图标优化
时间有限(24日才在论坛看到),界面只做简单的设计,在一个界面中显示了所有功能,没有弹窗等,界面一般;
程序使用生产者消费者结构,比较容易理解,简单制作图标。
12、键盘操作优化
增加各按钮的键盘操作快捷键,Esc、F1~F12,方便操作。
13、软件使用说明
完善开发者文档、编写软件Readme文档。
14、扩展:增加任意输入4个数返回公式结果功能。
15、扩展(未做)
1-10的24点扩展
只需修改洗牌(40的全排)与显示处(换下拉列表框,或按13的列表框修改值)的程序即可,概率统计也只用修改52、13等值即可。
三种概率依次为:79936/91390=87.4669%、8558/10000=85.8500%、566/715=79.1608%。
程序设计补完·201511
https://bbs.elecfans.com/jishu_528940_1_1.html
`