吉游网提供最新游戏下载和手游攻略!

LabVIEW图形化编程:学生课设大作业——飞机大战实例分享(含源码)

发布时间:2024-09-22浏览:18

很多朋友对于LabVIEW图形化编程:学生课设大作业——飞机大战实例分享(含源码)和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

目录

1.项目概述2

1.1.战机设置2

1.2.UFO设置3

1.3.游戏设置3

2.结构流图4

3.系统模块划分4

4.功能实现5

4.1.初始准备5

4.2.战机模块7

4.3.UFO模块9

4.4.攻击判定模块11

4.5.结束条件模块12

4.6.其他细节修饰15

5.问题及解决方案18

5.1.UFO下落过程中横值不断变换18

5.2.战机击落UFO判定异常19

5.3.击落UFO后战机异常扣血21

6.心得体会22

7.项目前面板图与程序框图23

项目概述名称:飞机大战主要设置有以下三点:

战机设置战机初始有三条生命,所获得的积分以及其生命值、血量在游戏界面的顶部显示。按下空格键战机会两个向上的导弹,每发射一次导弹会减少10点能量值,战机初始能量值为100,于游戏界面的右下角显示,当能量值小于10点时会提示玩家能量值不足,此时玩家可通过按下R键补充能量,每按下一次R键能为战机补充30点能量。当战机与UFO相撞时,战机血量减少1点,减少为0时战机爆炸消失并游戏结束。

UFO设置游戏开始时UFO于游戏界面顶部随机出现并自由下落至底部刷新进入下一次循环,同时UFO剩余数量减一;当UFO被导弹击中时,UFO爆炸并消失,UFO剩余数量减一并刷新一个新的UFO下落,此过程循环直到UFO剩余数量为零时为止。

游戏设置当玩家开始游戏时,战机可由玩家自由操控(键盘上的↑↓←→控制战机移动、空格键发射导弹及R键补充能量),UFO除下落速度外不受玩家操控。游戏默认剩余UFO数量为25,战机生命值为3,战机速度为25(0-50),UFO速度为2.5(2.5-10),导弹发射速度为80(80-100),玩家可在游戏开始后随个人喜好调节各项参数,调节按键于游戏界面顶部及右侧参数栏显示。战机每击落一架UFO可增加1点积分,当获得的总积分超过18点、UFO剩余数量为零且战机生命值不为零时即判定游戏胜利,否则判定游戏结束。

结构流图

系统模块划分本项目的整体框架与逻辑结构包含:战机、UFO、攻击判定、结束条件共四大模块,其中:战机模块包含:战机对象、战机爆炸判定、导弹对象;UFO模块包含:UFO对象、UFO爆炸判定;攻击判定模块包含:击中判定、撞击判定;结束条件模块包含:胜利条件、失败条件。

(所有子模块类别)

功能实现

初始准备

在构建基本逻辑及整体框架前,首先需要准备好后续工作所需要的控件、背景图片及界面边框等。

其中最重要的控件制作具体步骤如下(以战机控件为例):

打开NI LabVIEW软件并新建一个VI程序;

于前面板中打开控件选择面板,如下图步骤所示来得到一个二维图片控件制作白板;

修改控件制作白板的标签,后如图操作打开控件自定义模式;

鼠标单击工具栏中扳手状选项进入控件自定义模式,随后选中控件制作白板并鼠标右击选择“以相同大小文件导入”,选择下载好的“png”格式的战机图片,调整边框至合适大小,此时战机控件制作完成,鼠标再次单击工具栏中扳手状选项处退出自定义模式,另存为到准备好的控件库备用。

其余控件以上述步骤制作即可。

(本项目所需的8个控件)

战机模块

战机对象

实现按键控制在事件结构中选择添加按键按下及按键重复两种事件分支,创建一个数值显示控件并与事件结构中的按键扫描函数相连,分别按下键盘上的↑↓←→、空格键及R键来获得各按键键值,并分别添加条件结构来实现控制战机的移动、导弹发射及能量补充。

(各按键扫描键值)

实现战机移动拖入事先准备好的战机控件,在程序框图中选中战机控件创建位置属性节点函数,并给定战机一个初始的横、纵值;分别在事件结构中的按键按下和按键重复两个事件分支下创建条件结构并设置按下各按键时战机的位置变化算法并添加循环。

(左图为键重复分支;右图为键按下分支)

限定战机移动范围

为了避免战机移动范围过大,选择给战机的按键操控移动添加一个范围条件结构,并给定具体范围的值,具体如下所示。

以此类推,其余按键操控条件结构外都可以添加一个限定范围。

战机爆炸判定当战机与UFO相撞判定为真超过三次且UFO未被击中(即未消失)同时为真时,战机初始血量由3点扣至0,战机爆炸效果控件可见(初始给定不可见),位置与战机位置相挂钩,同时战机不可见,并游戏结束。

导弹对象

给战机配置导弹来实现后期击落UFO。拖入两个事先准备好的导弹控件,并给定两枚导弹一个合适的位置(与战机横、纵值挂钩),同时在事件结构的按键下分支内的条件结构中空格键值(即57)分支下写入导弹位置变化算法。

UFO模块

UFO对象为战机创建一个强劲对手。首先拖入事先准备好的UFO控件,并给定UFO的初始纵值为-100(赋给移位寄存器的初值),接着写入UFO下落范围算法(For循环300次)和下一个循环开始前的随机横值算法,使得UFO可以从纵值为-100的位置上随机横值下落,总而增加游戏随机性和趣味性。同时为了不让UFO在下落过程中就开始随机横值,我们使用比较函数中的“判定范围及强制转换函数”(后文有详细介绍)来迫使UFO落到底部或顶部(即给定的纵值650或-100处)才开始随机横值,并且限定一个合适的横值随机变化范围(为了规范化游戏,这里的范围选择和战机左右移动范围相同即横值在100~500范围内)。

UFO爆炸判定

当战机击中UFO算法判定为真时,UFO视为被击中,此时可以将UFO设定为不可见(即击落消失),同时为了增强玩家的游戏反馈选择添加一个UFO爆炸效果并设置为可见(初始不可见),UFO爆炸效果位置与UFO的横、纵值相挂钩。

攻击判定模块

击中判定当按下空格(键值57)时UFO横值在给定范围内(战机横值的左右50内,战机纵值小于UFO纵值)为真时, 即视为战机击中UFO(按下空格键即发射导弹,导弹速度极快,可视为击中UFO),此时UFO不可见,UFO爆炸效果可见(初始不可见)且限定位置在合适的位置。同时UFO不可见时仍可继续下落至纵值650处进入下一次循环。

撞击判定

当UFO的位置在战机的横、纵值的一定范围内,且UFO未被击中(即可见)同时为真时,撞击判定算法判定战机与UFO相撞,此时战机血量减一(初值设定为3),同时游戏界面顶部的红心减少一,UFO可继续下落,当战机血量减至0时(即游戏界面顶部的红心全部消失)战机不可见(初始可见),战机爆炸效果可见(初始不可见)且位置与战机消失前的位置挂钩。

结束条件模块

胜利条件游戏默认初始UFO数量为20(玩家可自由调节),当战机击落UFO的数量超过18(即得分超过18,每击落一架UFO可得一分),且剩余UFO数量小于等于0和战机依旧可见(即血量大于0)三样条件同时为真时,即判定游戏胜利,此时游戏界面显示胜利图样(即游戏胜利可见,初始不可见),同时游戏结束不可见。此时玩家可手动添加UFO数量继续游戏或结束游戏。

失败条件

当UFO剩余数量为0,且战机未击落足够的UFO(即得分不超过18)时,则判定游戏失败,此时不管战机是否存活游戏界面都显示游戏结束。

当UFO剩余数量不为0,且战机与UFO相撞满三次(即血量减少至0)时,不管战机得分是否超过18(即击落超过18架UFO),战机立即不可见,战机爆炸效果显现,且游戏界面显示游戏结束,UFO不继续下落且数量清零。

其他细节修饰

发射导弹消耗能量值为了增加游戏的趣味性和挑战性,选择给战机添加一个初始的能量值(初值100点),战机每次发射一次导弹(即每按下空格一次)则消耗10点能量值,当能量值小于10点时系统会提示玩家“能量不足,请按R键补充能量”,每按一次R键可为战机补充30点能量,直到补充到100点为止。

战机剩余血量可视化为了让玩家能更直观的获知自己的剩余血量值,选择在游戏界面顶部添加血量控件,同时编写算法实现血量控件的显示与战机剩余血量相挂钩。

游戏难度自定义为了方便玩家适应游戏操作,选择给战机、UFO、导弹及UFO数量设置一个初始默认值,在玩家在熟悉了整体的操作后也可以根据个人喜好随意修改各项参数值来获得更多样性的游戏体验,调节按键于游戏界面顶部及右侧参数栏显示。

剧情设置

为了丰富游戏的趣味性,选择给游戏添加背景介绍,玩家可通过开启循环的故事了解,然后选择是否抵御敌人,若不抵御,则“家园”会被摧毁,若抵御敌人,游戏开始,同时会随着战机死亡、击落敌机数量等条件来触发不同的剧情。

(部分剧情提示框)

问题及解决方案

UFO下落过程中横值不断变换由于编写UFO下落的初始算法时,只考虑了一种UFO下落速度(即UFO下落速度为2.5)的情况而采用的For循环固定循环300次才运行横值随机变化算法,导致UFO下落算法达到固定值即开始改变横值,后续添加UFO速度选择器时出现大于2.5的速度时就会出现UFO未下落到期望的底部位置就开始改变横值并摇摆下落直到For循环满300次,既不美观也不规范。为了解决上述问题,首先需要设定一个固定的期望纵值,使得不管UFO下落速度如何,到达指定的期望纵值时才开始改变横值,为了实现上述设想,选择采用比较函数中的“判定范围并强制转换函数”。下图为上述函数的介绍:

由此,选择设置其下线为我们给定的UFO初始纵值-100,上限采用最低UFO速度(即UFO速度为2.5)时满足For循环满300次,同时还要飞出游戏界面以为外最小的纵值,我们可计算得到一个合适的值:-100+2.5*300=650,所以上限值采用650,并添加“=”比较函数来迫使只有UFO的纵值到650处就开始运行横值的随机变化(即在游戏界面底部外随即变换直到For循环满300次),之后For循环重新循环下一个UFO下落,问题解决。

战机击落UFO判定异常我们通常认为导弹与UFO接触时算击中目标,那么在我编写初始击中算法时也是照着这样的思路去构建逻辑结构的,但是由于导弹的运动轨迹可视为固定的(即人为按下空格键后导弹纵值开始持续改变,横值不变),可正因为导弹的纵值是不断变化的,而UFO的纵值也在不断变化,它们实际的大小(即控件的边框大小)不一致,运行速度也不一致,导致想去寻找一个合适的判定范围极为困难(他们运行时For循环一次所跨过的距离不同会出现不相交的空挡),而我又设置了导弹和UFO的速度可以人为改变,那么他的判定范围也会不断变化,那么就违背了逻辑框架简便实用的原则,也会导致有时候能判定击中有时却不能判定击中(即使我们肉眼看到他们“碰到了”,可系统的算法没有判定为真),就会导致玩家的游戏体验极差。为了解决上述的问题,我选择放弃传统的击中判定逻辑,我发现导弹的初始速度很快,即按下空格后发射导弹到导弹消失在游戏界面顶部的时间极短(不超过0.5秒),那么是否可以放弃判定UFO的纵值与导弹的纵值相交,转而限定住UFO在战机的横值左右一定范围(大致为两枚导弹在战机的左右横值的范围),同时只要在按下空格时,战机的纵值大于UFO的纵值(即战机在UFO下面)就判定导弹击中了UFO。理论可行,实践开始,我们首先根据两枚导弹的位置来得出UFO横值的一个大致范围,接着通过设置战机每移动一次的值,观察战机移动一次跨过的格数可计算处前面板中的一格是多少值(这里观察得到1格≈6.7),准备工作做好后开始构建逻辑结构,并不断运行试错和微调,最终问题圆满解决。

(UFO的横值范围在两条红线以内)

击落UFO后战机异常扣血为了提高游戏的竞技性,给战机设置了一个初始的血量(3点),并在游戏界面的顶部显示(3个红心),同时与战机与UFO相撞的判定算法挂钩,战机每与UFO相撞一次就会减少一点血量,但是在编写完算法时却发现了问题,在战机击落UFO时,战机也会扣血,但是并未显示战机与UFO相撞,经过排查发现是由于在编写击落算法时设定了战机发射的导弹击中UFO时UFO即不可见,但是并不是真的消失了,而是保持不可见的状态继续下落直到完成一次下落的循环,但同时编写的相撞算法没有将不可见的UFO情况排除,所以会出现战机即使击落了UFO还是会扣血(因为不可见状态的UFO与战机相撞,而我们肉眼不可见)。找出了问题所在之后,为了解决问题选择给战机与UFO相撞的算法外添加一个条件结构,并与UFO的可见属性节点相连,当UFO可见时才会运行相撞算法,UFO不可见时不运行,问题解决。

心得体会虽然这学期的虚拟仪器技术课已经学了不少东西,但是利用LabVIEW来做游戏还是第一次,一开始简直一头雾水,毫无头绪,不知道该从哪儿下手。好在从最基本的控件制作入手,再到写的第一个控件控制算法开始,头脑思路慢慢清晰了起来,明白了哪些是我需要的,哪些是需要下功夫去克服的,然后我利用空闲时间仔细研究了LabVIEW中常见函数的用法和功能,初步构建了项目的总体框架和逻辑结构。准备工作差不多后开始尝试加入更多逻辑关系来使项目功能多样化,中途虽然出现了许多错误,有时候--个BUG都花了我很长时间来找出问题所在并解决,虽然过程很痛苦,但是找到并解决问题后的成就感还是令自己感到兴奋和满足。经过这次项目后收获满满,不仅学会了如何使用LabVIEW,积攒了实操经验,还锻炼了逻辑思维能力。

项目前面板图与程序框图

前面板图:

用户评论

鹿叹

这可是个宝藏啊!我一直在找 LabVIEW 学习资源,正好要写飞机大战项目。这个代码很简洁易懂,思路也很清晰,太感谢了老哥/姐!

    有5位网友表示赞同!

醉枫染墨

哇,学生课设大作业竟然做的这么高水平! 作为程序小白的我虽然看不大明白代码,但飞机大战的设计和动画效果都非常不错啊,真希望我也有这样的编程能力。

    有8位网友表示赞同!

仅有的余温

LabVIEW 的图形化编程还是挺有趣儿的,尤其用来做游戏感觉更intuitive了。这个代码做得很赞,特别是子弹的移动轨迹设计,让人看上癮!

    有8位网友表示赞同!

见朕骑妓的时刻

这飞机大战做得真酷炫,代码注释很详细,很容易理解。作为初学者来说,可以从这里学习很多 LabVIEW 的用法。 而且附源码真是太棒了,感谢分享!

    有14位网友表示赞同!

古巷青灯

说实话,学生课设大作业居然能做到这个水平,有点夸张了吧?游戏体验感觉还蛮不错的,代码注释也很详细,就是有些地方逻辑比较复杂,我需要慢慢研究学习。

    有10位网友表示赞同!

最怕挣扎

这飞机大战做的太简单了,机枪射速过快,敌机的AI傻到令人发慌。如果想吸引更多人玩,建议提升游戏难度和可玩性。

    有5位网友表示赞同!

瑾澜

这个飞机大战界面设计很老旧,画面效果一般。希望以后能改进成更精致的游戏界面,例如使用更高品质的图像资源和更逼真的3D 渲染效果。

    有11位网友表示赞同!

话少情在

虽然游戏本身比较简单,但 LabVIEW 的图形化编程还是让我对它产生了兴趣。想后续尝试用 LabVIEW 做一些其他的项目!感谢分享这个代码!

    有18位网友表示赞同!

灼痛

飞机大战这个主题有点儿太常见了,希望能看到更多创意的新颖游戏设计。 不过代码注释很不错,适合用来学习 LabVIEW 的基础逻辑。

    有14位网友表示赞同!

又落空

LabVIEW 的课程真是难不轻啊,好不容易写完这玩意,还好有这个分享的版本可以参考啦!不过个人建议还是多加一些新的功能和挑战关卡,这样游戏的游戏性就能更强了

    有14位网友表示赞同!

棃海

飞机大战这个项目挺适合用 labview 进行开发。这个代码写的很清楚,注释也很完善,对于学习 LabVIEW 的新手来说是一个很好的入门资源。

    有20位网友表示赞同!

野兽之美

哇,这个飞机大战做的真不错!特别喜欢这款游戏的音乐和音效,给人的游戏体验感很棒! 佩服作者的制作水平。

    有19位网友表示赞同!

坠入深海i

我觉得游戏本身有点儿容易通关,难度设置可以再稍微挑战一些。 不过代码写的很精致,特别是对图形的处理非常优秀。

    有16位网友表示赞同!

景忧丶枫涩帘淞幕雨

LabVIEW 的图形化编程真的很有意思,这个飞机大战项目完美地展现了它的魅力!希望以后能看到更多使用 LabVIEW 开发的游戏作品。

    有18位网友表示赞同!

若他只爱我。

我还在想着怎么才能做个简单的飞机大战游戏,没想到这篇文章就分享了一个!感谢作者分享代码和讲解;真希望能学习到更多的LabVIEW编程技巧!

    有12位网友表示赞同!

桃洛憬

这个飞机大战的游戏画面有点儿不够精致。建议可以用一些更高质量的图像资源来提高游戏的视觉效果。

    有6位网友表示赞同!

毒舌妖后

我觉得这款游戏玩起来很有趣,操作也比较简单易上手! 学习 LabVIEW 的同学可以参考一下这份代码,非常不错的设计思路和逻辑结构!

    有11位网友表示赞同!

我的黑色迷你裙

这款飞机大战的游戏虽然比较简单,但是对于学习 LabVIEW 来说却是一个很好的实践项目! 期待作者后续能分享更多其他有趣项目。

    有16位网友表示赞同!

旧事酒浓

这个Labview图形化编程也太方便了吧! 竟然可以用图示的方式来编写代码,真是让人眼前一亮! 这飞机大战案例也给了我很多启发,希望能继续学习 LabVIEW,开发出更有趣的项目!

    有20位网友表示赞同!

热点资讯