贪吃蛇
这篇文章会介绍如何使用“数组”、“函数”、“变数”、“点亮”、“[计次循环”、“逻辑判断”等积木,在 micro:bit 实作一个贪吃蛇小游戏。
游戏方式
贪吃蛇是一款复古的像素小游戏,游戏开始时,画面中会有“一点”的蛇和“一点”的蛋,蛇会不断的移动,用户需要控制蛇左转或右转的方向去吃到蛋,每吃到一颗蛋蛇就会变长“一点”,蛋也会更换位置,如果蛇撞到墙壁则游戏结束。
如果使用 micro:bit 实作,游戏操作步骤如下:
- 同时按下 AB 按钮,开始游戏 ( 或重新游戏 )。
- 按下 A 按钮,控制蛇左转。
- 按下 B 按钮,控制蛇右转。
- 蛇吃到蛋之后会变长一点。
- 蛇撞到墙壁后,游戏结束,显示得分
积木程序原理
一开始,先把游戏启动的所有变数定义好:
- 当启动时,新增 run 变数为 0,表示游戏尚未开始。
- 当按钮 A+B 按下时:
- 变数 run 设定为 1,表示游戏开始。
- 变数 turn 设定为 0,表示蛇移动的方向 ( 0 右、1 下、2 左、3 上 )。
- 变数 dx 设定为 1,表示蛇每次移动 x 改变的数值。
- 变数 dy 设定为 0,表示蛇每次移动 y 改变的数值。
- 变数 x 设定为 0,表示蛇头的 x 座标。
- 变数 y 设定为 0,表示蛇头的 y 座标。
- 变数 egg_x 设定为 0,表示蛋的 x 座标。
- 变数 egg_y 设定为 0,表示蛋的 y 座标。
- 变数 list_x 设定为数组,默认 1 个项目,项目为变数 x,表示蛇身体 x 座标数组。
- 变数 list_y 设定为数组,默认 1 个项目,项目为变数 y,表示蛇身体 y 座标数组。
- 变数 score 设定为 0,表示得分。
- 变数 time 设定为 1000,表示蛇移动的速度 ( 每 1000 毫秒移动一格 )。
控制蛇左右转的方式,取决于 turn 的数值,所以可以透过按下 A 或 B 按钮,改变 turn 的数值,例如 turn 等于 1 的时候,蛇往下移动,按下 A 按钮 tune 等于 0,蛇就往右边移动 ( 左转 )。
接着设计“蛇移动”的程序,蛇移动包含一个 move 函数和一个重复无限次循环。
- move 函数内容:
- 判断 turn 如果等于 0,表示向右移动,dx 设定 1,dy 设定 0。
- 判断 turn 如果等于 1,表示向下移动,dx 设定 0,dy 设定 1。
- 判断 turn 如果等于 2,表示向左移动,dx 设定 -1,dy 设定 0。
- 判断 turn 如果等于 3,表示向上移动,dx 设定 0,dy 设定 -1。
- 根据 dx 和 dy 的数值,得到最后 x 和 y 的数值结果。
- 重复无限次积木:
- 清空画面,关闭所有 LED 灯。
- 呼叫 move 函数。
- 根据执行 move 函数之后所得到的 x 和 y,点亮对应 xy 座标的 LED。
- 暂停 time 毫秒再次重复执行。
完成后,启动 micro:bit,就能用 A 和 B 按钮控制蛇移动的方向。
能够控制蛇的移动方向之后,接着修改重复无限次积木,加入蛇吃到蛋的逻辑判断:
- 新增逻辑判断,判断 run 的 1 的时候开始游戏。
- 加入另一个逻辑判断,判断蛇的 x 和 y 等于蛋的 egg_x 和 egg_y 数值,表示蛇吃到蛋。
- 吃到蛋的时候:
- 将 x 和 y 的数值,分别添加为 list_x 和 list_y 数组的第一个项目。
- 重新设定蛋的 egg_x 和 egg_y 数值。
- 分数 score 增加 1。
- 暂停时间减少 ( 蛇的移动速度增加 )。
- 没吃到蛋的时候:
- 将 x 和 y 的数值,分别添加为 list_x 和 list_y 数组的第一个项目。
- 移除 list_x 和 list_y 数组的最后一个项目 ( 因为没有吃到蛋,数组长度就不会改变 )。
- 使用“计次循环”,读取 list_x 和 list_y 数组的所有数值,根据这些数值点亮对应的 LED。
- 点亮蛋的 LED ( 放在后面是为了避免蛋被蛇的身体遮住 )
最后新增一个重复无限次积木,设计“蛇撞到墙壁,游戏结束”的程序:
- 判断如果 x<0 ( 撞到左边 ) 或 x>4 ( 撞到右边 ) 时,run=0 游戏结束并显示分数。
- 判断如果 y<0 ( 撞到上面 ) 或 y>4 ( 撞到下面 ) 时,run=0 游戏结束并显示分数。
完成后,启动 micro:bit,就可以开始进行贪吃蛇的游戏。
范例解答
范例解答:贪吃蛇
实作“贪吃蛇”的小技巧
为什么要使用“数组”呢?
因为贪吃蛇的身体由很多个 LED 组成,每个 LED 都有各自的座标,透过操作数组来插入或删除座标,是相当方便的。
为什么不使用“游戏积木”呢?
因为游戏积木的“角色”,会影响整个画面的显示,反而容易让程序变得不容易理解。
微信扫码关注
抖音扫码关注