Day45 ( 游戏设计 ) 贪吃蛇

贪吃蛇

教学原文参考:贪吃蛇

这篇文章会介绍,如何在 Scratch 3 里使用变数、清单、分身、重复、逻辑判断、广播讯息、碰到角色...等积木,实作一个可以用键盘控制的贪吃蛇小游戏。

相关文章参考:变数清单重复广播讯息分身逻辑判断

角色设定

在角色编辑区,删除猫咪角色,使用绘画,绘制「蛇」和「蛋」两个新角色 ( 参考:造型与绘图 )。

Scratch 3 教学 - 贪吃蛇

切换到「造型」页签,将红色正方形的「蛇」,对齐中心点,并将尺寸调整为 24x24

在造型页签左侧清单的预览图,可以看见造型的真实尺寸。

Scratch 3 教学 - 贪吃蛇

使用同样的做法,将「蛋」的造型对齐中心点,尺寸调整为 24x24

Scratch 3 教学 - 贪吃蛇

贪吃蛇游戏原理

贪吃蛇的游戏基本上属於「清单」( 阵列 ) 的操作,只要明白清单的控制原理,就能轻松实现贪吃蛇的游戏

  • 开始时,蛇的清单长度为 1,清单内容是蛇的位置
  • 蛇在移动时,将新的位置加入在第一个项目,并删除最後一个项目
  • 如果吃到蛋,清单长度增加 1 ( 蛇的长度增加 1 ),将蛋的位置加入在第一个项目
  • 接着就按照上方的逻辑,控制移动和吃蛋的清单内容。

Scratch 3 教学 - 贪吃蛇

积木程序原理 ( 蛇 )

点击「蛇」角色,建立「长度、得分、x、y」三个变数以及「listX 和 listY」两个清单。

  • 得分:总共吃到几颗蛋 ( 勾选显示在舞台上 )。
  • 长度:蛇的长度。
  • x:水平移动的方向和距离。
  • y:垂直移动的方向和距离。
  • listX:记录蛇身体 x 座标的清单。
  • listY:记录蛇身体 y 座标的清单。

Scratch 3 教学 - 贪吃蛇

设计点击绿旗的程序:

  • 设定 x 和 y 变数为 0。
  • 将蛇根据 x 和 y 变数定位到舞台中心点 (0, 0)。
  • 使用重复无限次积木,每隔 0.1 秒执行 x 和 y 的座标改变 ( 如果 x、y 变数有变化,座标就会改变 )。

Scratch 3 教学 - 贪吃蛇

放入「当向上、向下、向右、向左键被按下」的积木,在按下对应键盘时,改变 x 和 y 的变数数值,因为角色的尺寸是 24x24,所以 x 和 y 的数值以 25 为一个单位,让排列或移动时,会有 0.5 的间隔 ( 避免误触以及画面较为好看 )。

键盘 x y
向上 0 25
向下 0 -25
向左 -25 0
向右 25 0

Scratch 3 教学 - 贪吃蛇

完成後点击绿旗,就能用键盘控制红色正方形移动。

Scratch 3 教学 - 贪吃蛇

修改点击绿旗程序:

  • 将得分设定为 0。
  • 将 listX 和 listY 的内容清空。
  • 将一开始的 xy 座标,添加到 listX 和 listY 清单里

Scratch 3 教学 - 贪吃蛇

根据贪吃蛇游戏原理,将「插入清单的第一项」和「删除清单的最後一项」积木加入重复无限次积木里,在移动前把 xy 座标插入清单的第一项,并删除清单的最後一项

Scratch 3 教学 - 贪吃蛇

接着设计吃到蛋的程序:

  • 放入「长度」设定为 listX 或 listY 的长度。
  • 放入「如果...那麽」,判断如果碰到「蛋」的角色时要做的动作:
    • 得分增加 1。
    • 插入目前的 xy 座标到 listX 和 listY 的第一项
    • 建立自己的分身
    • 广播「吃到蛋」的讯息

Scratch 3 教学 - 贪吃蛇

设计分身产生 ( 建立蛇的身体 ) 的程序:

  • 改变分身的颜色和亮度,使其和蛇的头有所区隔。
  • 使用重复无限次积木,每次重复执行:
    • 判断如果长度大於 1,每次重复让长度减少 1
    • 依序取出 listX 和 listY 的项目,作为分身的 xy 座标使用

Scratch 3 教学 - 贪吃蛇

积木程序原理 ( 蛋 )

点击「蛋」角色,编辑对应的程序:

  • 点击绿旗时,将蛋定位到 (100, 0),并将图层移到最上层 ( 避免被蛇盖住 )
  • 当收到「吃到蛋」讯息时,将 xy 座标设定为 25 倍数的随机数 ( 刚好定位在蛇移动的路径上 )

Scratch 3 教学 - 贪吃蛇

完成效果

完成後,点击绿旗,就可以开始进行贪吃蛇的游戏。

Scratch 3 教学 - 贪吃蛇

范例解答

范例解答:贪吃蛇

延伸练习

如果已经熟悉了贪吃蛇的原理,还可以尝试更多好玩的作法:

  • 沿用范例程序,加入「撞到墙」和「撞到自己身体」时游戏结束的逻辑判断。( 解答 )

  • 沿用范例程序,加入「最高得分」的云端变数。( 解答 )

关於我

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


<<:  IT铁人DAY 30-学习物件导向与Design Pattern之心路历程

>>:  Day45 ( 电子元件 ) 水果钢琴 ( 类比讯号 )

(31) 试着学 Hexo - 番外篇之常见问题

前言 这一篇是完赛後的总结篇,虽然说是总结篇,但其实还是要讲一些 Hexo 常见的问题。 小心关键字...

Day18 用python写UI-聊聊Listbox与事件绑定

今天延续昨天的Listbox做一些更进阶的操作,加入删除、项目的排序和拖曳项目,这些都是平常常会用到...

学习Python纪录Day28 - 在多文字档中搜寻关键字

在多文字档中搜寻关键字 第一层for回圈使用了os.walk()递回取得路径下的所有档案 第二层fo...

(Day14) 闭包 (Closure) 介绍

闭包算是在 JS 中常听到,却不容易使用的一个方法,更多状况是不小心用出来,~~因此出 bug ~~...

Day28 - 部属到正式环境 (3)

今天的实作内容主要根据教学网站进行。 将应用程序安装到Heroku (接续Day27) 使用GIT将...