Day30 ( 游戏设计 ) 贪吃蛇

贪吃蛇

教学原文参考:贪吃蛇

这篇文章会介绍如何使用「阵列」、「函式」、「变数」、「点亮」、「[计次回圈」、「逻辑判断」等积木,在 micro:bit 实作一个贪吃蛇小游戏。

相关文章参考:阵列函式变数计次回圈点亮逻辑判断

游戏方式

贪吃蛇是一款复古的像素小游戏,游戏开始时,画面中会有「一点」的蛇和「一点」的蛋,蛇会不断的移动,使用者需要控制蛇左转或右转的方向去吃到蛋,每吃到一颗蛋蛇就会变长「一点」,蛋也会更换位置,如果蛇撞到墙壁则游戏结束。

如果使用 micro:bit 实作,游戏操作步骤如下:

  • 同时按下 AB 按钮,开始游戏 ( 或重新游戏 )。
  • 按下 A 按钮,控制蛇左转。
  • 按下 B 按钮,控制蛇右转。
  • 蛇吃到蛋之後会变长一点。
  • 蛇撞到墙壁後,游戏结束,显示得分

micro:bit - 贪吃蛇

积木程序原理

一开始,先把游戏启动的所有变数定义好:

  • 当启动时,新增 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 毫秒移动一格 )。

micro:bit - 贪吃蛇

控制蛇左右转的方式,取决於 turn 的数值,所以可以透过按下 A 或 B 按钮,改变 turn 的数值,例如* turn 等於 1 的时候,蛇往下移动,按下 A 按钮 tune 等於 0,蛇就往右边移动 ( 左转 )*。

micro:bit - 贪吃蛇

接着设计「蛇移动」的程序,蛇移动包含一个 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 - 贪吃蛇

完成後,启动 micro:bit,就能用 A 和 B 按钮控制蛇移动的方向。

micro:bit - 贪吃蛇

能够控制蛇的移动方向之後,接着修改重复无限次积木,加入蛇吃到蛋的逻辑判断:

  • 新增逻辑判断,判断 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 ( 放在後面是为了避免蛋被蛇的身体遮住 )

micro:bit - 贪吃蛇

最後新增一个重复无限次积木,设计「蛇撞到墙壁,游戏结束」的程序:

  • 判断如果 x<0 ( 撞到左边 ) 或 x>4 ( 撞到右边 ) 时,run=0 游戏结束并显示分数。
  • 判断如果 y<0 ( 撞到上面 ) 或 y>4 ( 撞到下面 ) 时,run=0 游戏结束并显示分数。

micro:bit - 贪吃蛇

完成後,启动 micro:bit,就可以开始进行贪吃蛇的游戏。

micro:bit - 贪吃蛇

范例解答

范例解答:贪吃蛇

实作「贪吃蛇」的小技巧

  • 为什麽要使用「阵列」呢?

    因为贪吃蛇的身体由很多个 LED 组成,每个 LED 都有各自的座标,透过操作阵列来插入或删除座标,是相当方便的。

  • 为什麽不使用「游戏积木」呢?

    因为游戏积木的「角色」,会影响整个画面的显示,反而容易让程序变得不容易理解。

关於我

大家好,我是 OXXO,是个即将迈入中年的斜杠青年,如果对我有点兴趣(笑,可以与我联系,一起来做点有玩又有创意的东西吧!


<<:  CSS微动画 - 弹窗也要很动感,动画不能只做一半

>>:  [Day22] swift & kotlin 游戏篇!(4) 小鸡BB-游戏制作-游戏画面排版

DigitalOcean VPS – Premium Droplets 主机测试和跑分,廉价和高效的网站主机

Cloudways 最近推出 DigitalOcean Premium Droplets 的新选择...

30天打造品牌特色电商网站 Day.19 文字的排版

字距、行距、与其他物件的距离,调整适当能让使用者有舒服的体验,而良好的排版能引导使用者优先接收整个画...

day30 : 写不完所有东西的最後一天

30天的最後一天,写到最後几天才发现有一些想分享的没有篇幅能写入了,所以今天我认为分享的内容偏实用的...

撒尿牛丸 - 整合 flask, LineBot

经过了 28 天的介绍後,今天来到了大集合的时候,昨天已经可以排程每天收盘後,去检查股票是否有符合我...

# 冷知识: 0x000000E2 是什麽? 记忆体错误??

电脑硬体与进位制: -上回我们提到python进位制学习,然而16进位制却是令大家相当头大,为什麽不...