LabVIEW图形化编程 - 学生课设大作业分享 - 飞机大战(附源码)

基于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

  1. 项目概述
    名称:飞机大战
    主要设置有以下三点:
    1. 战机设置
      战机初始有三条生命,所获得的积分以及其生命值、血量在游戏界面的顶部显示。按下空格键战机会两个向上的导弹,每发射一次导弹会减少10点能量值,战机初始能量值为100,于游戏界面的右下角显示,当能量值小于10点时会提示玩家能量值不足,此时玩家可通过按下R键补充能量,每按下一次R键能为战机补充30点能量。当战机与UFO相撞时,战机血量减少1点,减少为0时战机爆炸消失并游戏结束。
    2. UFO设置
      游戏开始时UFO于游戏界面顶部随机出现并自由下落至底部刷新进入下一次循环,同时UFO剩余数量减一;当UFO被导弹击中时,UFO爆炸并消失,UFO剩余数量减一并刷新一个新的UFO下落,此过程循环直到UFO剩余数量为零时为止。
    3. 游戏设置
      当玩家开始游戏时,战机可由玩家自由操控(键盘上的↑↓←→控制战机移动、空格键发射导弹及R键补充能量),UFO除下落速度外不受玩家操控。游戏默认剩余UFO数量为25,战机生命值为3,战机速度为25(0-50),UFO速度为2.5(2.5-10),导弹发射速度为80(80-100),玩家可在游戏开始后随个人喜好调节各项参数,调节按键于游戏界面顶部及右侧参数栏显示。战机每击落一架UFO可增加1点积分,当获得的总积分超过18点、UFO剩余数量为零且战机生命值不为零时即判定游戏胜利,否则判定游戏结束。

 

  1. 结构流图

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


(所有子模块类别)

  1. 功能实现
    1. 初始准备

 

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

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

  1. 打开NI LabVIEW软件并新建一个VI程序;
  2. 于前面板中打开控件选择面板,如下图步骤所示来得到一个二维图片控件制作白板

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

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

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

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

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


(各按键扫描键值)

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


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

  1. 限定战机移动范围

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

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

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

  1. 导弹对象

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

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

  1. UFO爆炸判定

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

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

  1. 撞击判定

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

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

 

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

 

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

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

 

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

 

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

  1. 剧情设置

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

(部分剧情提示框)

  1. 问题及解决方案
    1. 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下落,问题解决。

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


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

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

 

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

  1. 项目前面板图与程序框图

前面板图:

程序框图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值