射击幽浮
这篇文章会介绍如何使用“建立游戏角色”、“游戏角色座标”、“游戏角色碰撞”、“变数”、“[重复循环”、“逻辑判断”等积木,在 micro:bit 实作一个射击幽浮的射击小游戏。
游戏方式
射击幽浮是一款简单的射击小游戏,游戏开始后,画面上方会出现一个逐渐往下移动的 UFO,用户需要操控下方炮塔发射炮弹阻止幽浮往下移动,当炮弹击中幽浮,幽浮会消失并重新从上方出现,再次向下移动,若幽浮碰到地面,游戏结束,显示得分。
如果使用 micro:bit 实作,游戏操作步骤如下:
- 同时按下 AB 按钮,开始游戏 ( 或重新游戏 )。
- 按下 A 按钮,控制炮塔向左移动。
- 按下 B 按钮,控制炮塔向右移动。
- 游戏开始后按下 AB 按钮,可以发射炮弹。
- 炮弹击中幽浮,得分加 1,幽浮再度从最上方随机位置出现。
- 幽浮抵达地面,游戏结束,显示得分。
积木程序原理
当启动时,先定义游戏启动与游戏角色的变数:
- 变数 run:数值 0,判断游戏是否开始 ( 0 表示游戏尚未开始,1 表示开始 )。
- 变数 player:炮塔游戏角色,创建于 (2,4) 座标。
- 变数 bullet:炮弹游戏角色,创建于 (0,4) 座标,亮度 0 ( 不显示 )。
- 变数 ufo:幽浮游戏角色,创建于 (2,0) 座标,亮度 0 ( 不显示 )。
因为按下 AB 按钮有两种动作,一种是启动游戏,另一种是发射炮弹,所以程序要加入逻辑判断:
- 判断 run 等于 0 ( 游戏尚未开始或游戏结束 ) 时:
- 设定 run 为 1 ( 游戏开始 )。
- 设定 score 分数为 0。
- 设定 fire 开火状态为 0。
- 游戏继续 ( 搭配游戏结束时的游戏暂停 )。
- 设定 ufo 角色的位置、亮度。
- 判断 run 不等于 0 时 ( 表示游戏开始或游戏正在进行 ):
- 设定 fire 开火状态为 1 ( 开火 )。
接着设计按下 A 按钮和 B 按钮时,移动炮塔的程序:
- 按下 A 按钮时,fire 开火状态设定 0 ( 不开火 ),炮塔角色往左移动。
- 按下 B 按钮时,fire 开火状态设定 0 ( 不开火 ),炮塔角色往右移动。
新增一个重复无限次积木,制作炮弹移动的程序:
- 判断如果 run 等于 1 表示游戏正在进行。
- fire 变更为 0,避免重复开火 ( 不然程序会变得较复杂 )。
- 将炮弹移动到炮塔的位置,改变亮度为 30。
- 使用重复 4 次积木,让炮弹从下移动到顶端。
- 移动到顶端后,炮弹亮度改为 0 隐藏炮弹,并将炮弹移动到最下方。
新增第二个重复无限次积木,制作炮弹打到幽浮的程序:
- 判断如果 run 等于 1 表示游戏正在进行。
- 判断如果炮弹 bullet 碰到幽浮 ufo。
- 得分 score 增加 1。
- 幽浮角色再度移动到顶端 ( x 为 0~4 随机数,y 为 0 )。
最后新增第三个重复无限次积木,制作幽浮往下移动的程序:
- 判断如果 run 等于 1 表示游戏正在进行。
- 每次重复让 ufo 的 y 座标改变 1 ( 往下移动 )。
- 如果 ufo 的 y 等于 4,表示撞到地面,run 改为 0 ( 游戏结束 )。
- 使用游戏暂停积木,避免游戏角色影响画面显示。
- 游戏结束后,使用重复循环显示得分 score ( 使用循环是为了不断显示两位数得分 )。
- 使用暂停积木,设定 ufo 移动速度。
完成后,启动 micro:bit,就可以开始进行设计幽浮的游戏。
范例解答
范例解答:射击幽浮
实作“射击幽浮”的小技巧
为什么要使用“游戏角色”呢?
因为游戏角色积木很适合处理“互相碰撞”的状况,也可以很简单的让游戏角色彼此不会互相干扰,对于同一个画面里,具有许多不同方向、不同移动速度的角色说,是相当方便的功能。
为什么要使用“游戏暂停”和“游戏继续”呢?
因为使用了“游戏角色”,如果不将游戏暂停,角色的 LED 灯会影响画面显示,进而造成得分无法顺利显示的状况 ( 只会显示一次就消失 )。
为什么不使用内建的“游戏得分”呢?
如果使用了内建的“游戏得分”,显示得分后会造成“游戏结束”,然而内建的“游戏结束”必须重新启动 micro:bit 才能再次游戏,所以在这个范例就不使用“游戏得分”。
微信扫码关注
抖音扫码关注