`
电子发烧友论坛每周一练第一期撑杆跳过河活动已经结束了,鄙人侥幸得了一个第一,说实话就是粘了界面分和注释分的光,如果其他选手在界面和注释上多花个几分钟,就没我啥事儿了。看了大伙的程序结构设计,还有功能实现的思路,确实从中学到了很多东西,也看到了自己很多的不足。自学的非正规军是应该找点正儿八经的教材规范一下自己的编程思维和编程习惯。如果有时间的话,建议大家去下载一下每位选手的程序还有评分详情,从中可以看到自己的不足也可以学到很多的东西哟。莫要害羞,出来大家互相学习一下。预先取之,必先予之。投之以半头砖,报之以和田玉。感谢论坛,把天南地北的小伙伴联系起来,一起进步。OK,废话少说,还是总结一下我的撑杆跳程序吧。因为有微信版本的参照,所以基本照抄微信撑杆过河的功能。
先把文件给大家吧,一边看帖子一边看程序。就不往帖子里放截图了。虽然有图有真相,太麻烦了。叨叨了将近3000字,够意思了,哈哈。
一、 程序结构分析
一共定义了6个状态,名字起的不好,还请大家见谅。
1. "初始化"
对只需进行一次初始化就OK的变量赋初值。比如延时时间,布尔量的状态,控件的visible。本步骤完成之后转到"地面横竖竿小人复位"。
2. "地面横竖竿小人复位"
对第一次和每次通过之后进行各控件复位。基准地面是锁定了的。每一步都参照基准地面的位置,对地面1、地面2、竖杆、横杆1、小人进行复位。沟壑宽度和地面2的宽度赋值也是在这一步完成的。本步骤完成之后转到"等待鼠标点击并松开"。
3. "等待鼠标点击并松开"
本步骤是对鼠标左键进行判断,然后杆子到达极限之后仍然没有放开鼠标的话,杆子会缩短。到松开鼠标之后,进入下一步 "生成横杆并判断"。主要是鼠标按下和鼠标放开两个状态点的判断。
4. "生成横杆并判断"
由竖杆高度转换到横杆宽度。算出小人要跑的步数,一边右移,一边循环切换小人图片,以此达到实现奔跑效果。计算沟壑的宽度,进行判断是否可以通过。可以通过的话,转换到"可以通过且移动转到等待",不可以通过的话转换到"不能通过失败"。
5. "可以通过且移动转到等待"
小人、地面1、地面2左移。左移到地面2和基准的左边left重合,然后将地面2的属性赋值给地面1。然后转到 "地面横竖竿小人复位"。
6. "不能通过失败"
这个部分小人会继续往右跑,跑到杆子头,然后掉进沟里。小人往右跑的功能做重复了。其实应该在第4步的时候不管判断结果是什么,都往右跑。最后会弹出提示框是否继续,还是退出游戏。
二、 几个控件的制作
1. 地面和杆子
可能大家第一个想到的都是用布尔量来做地面和杆子,说实话,选用布尔之后还是有很多问题的,但是程序写来写去,换个控件吧,更麻烦,所以就一直将就了。用布尔控件,可以实现基本的地面和杆子的功能,配合属性节点的位置position左端left顶端top等来实现地面位置,宽度,杆子位置高度的变化。使用布尔的优点,方便简单。缺点,你的杆子会瞬间倒下的,不会有过度效果。采用X-Y图的方法倒是很不错的。 2. 小人
最初也很纠结小人,用一个布尔灯代替了好久好久,又要是小人,又不能不动,傻傻的不动,岂不是凌波微步。站立用一个图片,然后动态用一个GIF图片的思路也是可以的。我用的是图片下拉列表,这样就一个控件,不过跑动效果就要自己去循环实现了。用图片下拉列表有一个问题,就是你直接搞的话,怎么也会有一块灰色点不成透明。没事,去自定义控件吧,把它找出来,全都点成透明,然后再各种对齐,OK。麻麻再也不用担心小人背着一块灰底色了。GIF是从网上下载的,用PS把每一帧的动画保存为PNG格式,站立的姿态还有掉落的姿态是自己画的,缩小了可以接受,放大之后,好丑啊。
三、 几个动作的实现
1. 鼠标动作的捕捉
用什么去做触发这是个问题,有用键盘的有用鼠标移动到特定区域的,有用鼠标左键的。我用的左键。不过这样有个问题,就是无论你从什么地方点击鼠标左键,都会触发,很讨厌的。如果加上在前面板范围内点击左键触发这样才最好,省的误操作。鼠标这里有一个异或的逻辑关系。不但要判断嘛时候按下,还要判断嘛时候松开。我用了一个中间量辅助了一下。仁者见仁智者见智,实现了就OK。
2. 竖杆长高缩短和横杆变长
做竖杆长高的时候问题就来了,高度height的值变大的时候,竟然是往下走,定点top是不动的,所以,height增加10的话,top就要减小10。这样才能保证底端不动,有个bug就是做不好赋值顺序的话,杆子长高的时候,底端会来回窜动。
杆子能变长还能变短,不知道大家有没有无聊的按住微信上的这个不放手啊,你会看到杆子到了一定长度就会缩小的,好神奇啊。哈哈,这一点吧,其他童鞋都是金箍棒捅破天,有一个选手做了限制高度,嘿嘿,我做了可以来回伸缩,还是很好玩的。道理一样,不但要管height还要管top。
横杆的长度其实就是宽度width,直接把竖杆的高度height赋值给横杆宽度width就OK了。
3. 小人跑动
把9帧图片循环播放,这个小人就动了起来,不过现在是原地踏步,再把小人的左端left不停的加加,然后就动起来了。
4. 整体左移
这个是在小人成功渡过沟壑之后,需要整体左移,回归到最初的起点。我一共用了三个地面,一个作为基准,锁定的不动的。其他控件的位置都以这个为基准。然后就是地面1和地面2。左移就是left的减减了。一直到地面2的left和基准的left重合,OK。现在把地面2的位置大小属性赋值给地面1。地面2再以基准为参照,随机一个位置和大小。OK左移就结束了。用三个布尔实现的。
5. 地面宽度和位置随机
两个随机还是分开吧,不然地面2的宽度和沟壑宽度就同步了。建议加上一个最小沟壑宽度和最小地面2宽度。在最小值的基础上再加一个随机值。不然沟壑有时候非常小,地面2宽度有时候非常小,可玩儿性就降低了。
四、 程序的不足
1. 铺垫盖地的属性节点
刚开始没啥赶脚,到最后铺天盖地的属性节点,凌乱的实在难以接受,不说了,一样望去便知道水平高低,太low了。还需要多下功夫多学习啊。
2. 没有文件结构,没有子VI
做子VI就和写单片机程序一样。一个主VI搞定一切,就和一个main()写完一个程序一样。对自己不负责任,对程序阅读者不负责任。根本找不到主线。以后吸取教训,对自己负责对大家负责。将算法或重复利用的功能打包成子VI。 五、 自由发挥的几个地方
1. 竖杆增长速度和沟壑宽度可设置
竖杆增长速度有1/2/3/4/5五个级别,沟壑宽度有100/200/300三个增量级别。
2. 落竿可设置
可设置自动落竿,到了合适长度自动落下。可以设置自动触发竖杆生长,这样就完全自己跑起来了。小人自己不停跑的画面简直太美了,根本停不下来啊。
六、 优秀程序推荐
多谢@zcsky同学总而言之,言而总之,一言以蔽之的评语。 1. @houyqg同学的超级马丽风格
程序结构是最受到每周一练评委会推崇的,希望houyqg同学能写一写注释,给大家分享一下编程的经验。推荐houyqg同学的事件结构。
zcsky评语:从文件结构可以看出作者的变成经验很丰富,值得大家学习,程序的功能也让人眼前一亮,当时程序框图注释略少,让人又爱又恨。。。。。。 2. @fusongxinyi同学的萌萌小兔子
程序结构简洁明了,加点注释,让大伙儿学习一下吧。推荐fusongxinyi同学的消息队列。
zcsky评语:程序很萌,这是我的第一感觉!程序结构也很合理,但是说明较少,有个bug:当出现两个桥墩时,我直接走到第二个桥墩,却挂了。 3. @ymj120572092同学的凌波微步
编程思路还是很清晰的,如果采用zcsky的建议,程序会很漂亮。我倒是感觉ymj120572092子VI用的不错,不像我,也没打包,都在一个main里了。
zcsky评语:程序框图的注释还不错,但是移位寄存器太多了,可以将这些变量放到一个簇中,这样只需一个移位寄存器就够了,程序看起来就更干净。 感谢各位参加活动的同学,希望大伙儿多多支持论坛活动。
七、 展望第二期24点
相比于撑杆跳过河,24点更偏重于算法,界面的要求就相对少了一点。版主小鹰同学也把扑克牌的图片包都传上来了。这次大家把更多心思放在算法上。第一期的帖子,查看量三千多,参加第一期的同学也就七个,参加的同学还是很少的。真心希望更多的同学们可以加入进来,工作了的可能平时比较忙,看个人时间吧。更希望高校的同学可以参加进来,利用好课余时间。一边玩儿一边学习,还有奖品,你还等什么?
多学习、常总结、乐分享,我是刀侠。
2015-10-09
幻影刀侠
正在进行:
【每周一练】LabVIEW益智游戏 - 24点
https://bbs.elecfans.com/jishu_517445_1_1.html
往期回顾:
【每周一练】LabVIEW益智游戏 - 撑竹竿过河【已结束】
https://bbs.elecfans.com/jishu_514770_1_1.html
`
13