Scratch 贪吃蛇游戏开发教程
最终效果预览:

第一部分:准备工作与游戏核心逻辑
步骤 1:创建角色和背景
- 打开 Scratch:打开 scratch.mit.edu 的在线编辑器或桌面版。
- 删除默认角色:点击舞台上的小猫角色,然后点击右上角的“删除”按钮。
- 创建蛇头:
- 点击舞台左下角的“选择一个角色”。
- 在“动物”分类里,选择一个你喜欢的动物作为蛇头,Cat”(猫)。
- 为了让它更像蛇头,我们可以点击“造型”选项卡,删除其他造型,只保留一个,然后使用“造型”里的绘图工具,给它画上眼睛,让它看起来更精神。
- 创建食物:
- 再次点击“选择一个角色”,这次选择一个圆形的水果,Apple”(苹果)。
- 调整它的大小,让它比蛇头小一些。
- 创建背景:
- 点击舞台左下角的“选择一个背景”。
- 在“背景库”中,选择一个简单的背景,Blue Sky”(蓝天)或者干脆留空,我们也可以自己画一个边框。
现在你的舞台应该有一个蛇头角色和一个苹果食物角色。
步骤 2:让蛇头动起来
这是游戏的核心,蛇不能随意乱走,它必须朝着当前方向前进,并且不能后退。
-
为蛇头添加脚本:点击你的蛇头角色,开始编写代码。
-
创建变量:我们需要一些变量来存储游戏状态。
(图片来源网络,侵删)- 点击舞台右上角的“变量”类别。
- 点击“新建一个变量”,命名为
速度。 - 再创建一个变量
游戏状态,初始值设为1(代表游戏进行中)。
-
编写移动逻辑:
- 当绿旗被点击时,游戏开始。
- 我们需要让蛇头一直移动,直到游戏结束,所以使用
当绿旗被点击和重复执行。 - 在
运动类别中,拖出将 x 坐标增加 (10)模块,为了让蛇能朝四个方向移动,我们需要根据方向来改变x或y坐标。
核心代码思路:
- 我们用
方向变量来记录蛇头当前朝向(1=上,2=右,3=下,4=左)。 - 在
重复执行循环里,根据方向的值,来决定是增加x、减少x、增加y还是减少y。
代码实现:
// 当绿旗被点击 当绿旗被点击 隐藏 // 开始时先隐藏,等设置好位置再显示 移到 x:(0) y:(0) // 让蛇头从舞台中心开始 面向 (90 v) // 初始面向右 显示 // 初始化变量 将 [速度 v] 设为 (10) 将 [游戏状态 v] 设为 (1) // 游戏主循环 重复执行直到 <(游戏状态) = [0]> // 根据方向移动 <(方向) = [1]> // 1 代表上 将 y 坐标增加 ((速度) * (-1)) 否则如果 <(方向) = [2]> // 2 代表右 将 x 坐标增加 (速度) 否则如果 <(方向) = [3]> // 3 代表下 将 y 坐标增加 (速度) 否则如果 <(方向) = [4]> // 4 代表左 将 x 坐标增加 ((速度) * (-1)) end // 等待一小段时间,控制速度 等待 ((0.2) - ((速度) * (0.001))) 秒 // 速度越快,等待时间越短 end- 注意:上面的
方向变量我们还没创建,现在去创建它,这是一个“仅适用于此角色”的变量。 - 速度优化:
等待 ((0.2) - ((速度) * (0.001))) 秒这句代码是一个小技巧,可以让速度变量影响游戏的快慢,数值越大,蛇移动越快。
步骤 3:控制蛇的方向
现在蛇只会往右走,我们需要用键盘来控制它。
- 在
事件类别中,拖出一个当按下 [ v] 键模块。 - 在
控制类别中,拖出<gt;模块,放在里面。 - 在
侦测类别中,拖出按键 [ v] 是否按下?模块,放进如果的条件里。
核心逻辑: 蛇不能直接掉头,如果蛇正在向右走,你不能直接按左键让它向左。
代码实现:
// 当按下上箭头键
当按下 [上箭头 v] 键
<<(方向) = [3]> 不成立> // 如果当前不是向下
将 [方向 v] 设为 (1) // 就可以向上
end
end
// 当按下右箭头键
当按下 [右箭头 v] 键
<<(方向) = [4]> 不成立> // 如果当前不是向左
将 [方向 v] 设为 (2) // 就可以向右
end
end
// 当按下下箭头键
当按下 [下箭头 v] 键
<<(方向) = [1]> 不成立> // 如果当前不是向上
将 [方向 v] 设为 (3) // 就可以向下
end
end
// 当按下左箭头键
当按下 [左箭头 v] 键
<<(方向) = [2]> 不成立> // 如果当前不是向右
将 [方向 v] 设为 (4) // 就可以向左
end
end
把这些代码块都放在蛇头的脚本区,现在你可以用方向键控制蛇头移动了!
第二部分:实现吃食物和增长
步骤 4:生成食物
食物被吃掉后,需要在新的位置随机出现。
-
为食物添加脚本:点击你的苹果(食物)角色。
-
创建变量:为食物创建一个“仅适用于此角色”的变量,叫
食物可见。 -
编写代码:
// 当绿旗被点击 当绿旗被点击 隐藏 // 开始时隐藏 将 [食物可见 v] 设为 (0) // 0代表不可见 // 创建一个"广播"来通知食物可以生成了 // 我们回到蛇头的脚本里去广播,这里先写好接收广播的代码 当接收到 [生成食物 v] // 随机生成一个在舞台范围内的位置 // 舞台 x: -240 到 240, y: -180 到 180 // 为了不让食物生成在边缘,我们缩小一点范围 移到 x: (( picked (-180) to 180)) y: (( picked (-150) to 150)) // 确保食物的坐标是10的倍数,这样蛇能正好吃到 将 x 坐标设为 ((round ((x 坐标) / (10))) * (10)) 将 y 坐标设为 ((round ((y 坐标) / (10))) * (10)) 显示 将 [食物可见 v] 设为 (1) end
步骤 5:检测“吃”到食物
当蛇头的位置和食物的位置重叠时,就表示吃到了。
-
回到蛇头的脚本,在移动逻辑的
重复执行循环里,添加检测代码。 -
代码实现:
// 在蛇头的重复执行循环里,移动代码之后添加: // 检测是否吃到食物 <碰到 [Apple v] ?> // "Apple" 是你的食物角色的名字 // 播放吃掉的声音 播放声音 [Eat v] 直到播放完毕 // 如果你没有这个声音,可以找一个替换或省略 // 广播消息,让食物重新生成 广播 [生成食物 v] // 增加蛇的长度(我们稍后实现) // ... // 增加速度,让游戏变难 将 [速度 v] 增加 (1) end
当蛇头碰到苹果时,苹果会消失并在新位置出现,同时蛇会变快。
第三部分:实现蛇身和碰撞检测
这是最复杂但也是最有趣的部分,蛇吃到食物后,身体要变长,如果撞到自己或墙壁,游戏结束。
步骤 6:创建蛇身
我们不能手动创建很多蛇身,最好的方法是克隆。
-
回到蛇头角色,再创建一个“仅适用于此角色”的变量,叫
蛇身列表,这是一个列表,用来存储蛇身每个身体节点的位置。 -
初始化列表:在
当绿旗被点击的开头,添加代码清空列表。当绿旗被点击 ... 将 [蛇身列表 v] 清空 // 添加这一行 ... -
增长逻辑:当吃到食物时,我们向列表里添加一个新的身体节点。
// 在蛇头“检测是否吃到食物”的代码块里,广播之后添加: // 将蛇头的当前位置添加到列表末尾,作为新的身体节点 将 [i v] 设为 (1) // 'i' 是一个临时变量,用于循环 重复执行 (3) 次 // 初始蛇身长度为3 将 [i v] 增加 (1) 将 ((i) * (10)) 添加到 [蛇身列表 v] end -
克隆蛇身:
- 在蛇头的
重复执行循环里,在每次移动后,我们需要创建一个新的身体克隆体,并删除最旧的克隆体。 - 代码实现:
// 在蛇头的重复执行循环里,移动和吃食物之后添加: // 创建一个新的身体克隆体 克隆 [自己 v] // 删除列表最旧的身体节点(如果列表长度大于蛇身应有的长度) <<(长度 of [蛇身列表 v]) > ((速度) / (2))> // (速度)/2 是一个动态的蛇身长度 删除第 (1) 项 of [蛇身列表 v] // 删除最旧的一项 end - 在蛇头的
-
为蛇身克隆体编写脚本:
- 点击蛇头角色,在脚本区最下方添加一个新的事件块。
// 当作为克隆体启动时 当我作为克隆体启动 隐藏 // 循环,直到游戏结束 重复执行直到 <(游戏状态) = [0]> // 获取当前克隆体应该去的位置 // 它的位置是列表里对应位置的坐标 // 第一个身体节点去蛇头上一个位置,第二个去第一个身体节点上一个位置... // 我们需要一个索引变量 'index' 将 [index v] 设为 ((克隆体 #) + (1)) // 克隆体编号从0开始(蛇头是0),所以身体节点的索引是编号+1 // 检查索引是否在列表范围内 <(index) < ((长度 of [蛇身列表 v]) + (1))> // 从列表中取出坐标字符串,并解析为 x, y // 我们的列表存的是 "x,y" 这样的字符串 读取第 (index) 项 of [蛇身列表 v] 到 [body_pos v] 将 [x_pos v] 设为 ((item (1) of (body_pos)) // (10)) * (10) // 假设存的是 "x,y" 将 [y_pos v] 设为 ((item (2) of (body_pos)) // (10)) * (10) 移到 x: (x_pos) y: (y_pos) 显示 end // 与蛇头保持同步的速度 等待 ((0.2) - ((速度) * (0.001))) 秒 end 删除此克隆体 end- 注意:上面的
x_pos和y_pos变量以及body_pos变量都需要新建。item (1) of (body_pos)这种解析字符串的方式在 Scratch 中比较复杂,一个更简单的方法是使用两个列表,一个存 x 坐标,一个存 y 坐标,为了简化教程,我们暂时假设列表里存的是x,y格式,并用item (1) of (body_pos)来获取 x(虽然这在 Scratch 中不完全正确,但逻辑上可以理解),在实际操作中,推荐使用两个列表。
(简化版蛇身逻辑) 为了让教程更容易上手,我们采用一个更简单但功能相同的方法:每次移动时,让每个身体节点都移动到它前一个节点的位置。
-
修改蛇头代码:删除之前关于
蛇身列表的复杂代码。 -
蛇头代码:
// 当绿旗被点击 ... 将 [蛇身长度 v] 设为 (3) // 初始身体长度 ... // 重复执行循环里 克隆 [自己 v] // 每次移动都克隆一个身体 ...
-
蛇身克隆体代码:
// 当我作为克隆体启动时 当我作为克隆体启动 隐藏 将 [clone_index v] 设为 (克隆体 #) // 克隆体的编号 重复执行直到 <(游戏状态) = [0]> // 等待,直到前一个节点移动了 等待直到 <<(clone_index) = [0]> 或 <(y position of (clone_index)) 的 [ v] 改变>> // 这是一个比较巧妙的等待方式 // 移动到前一个节点的位置 移到 x: (x position of ((clone_index) - (1))) y: (y position of ((clone_index) - (1))) 显示 end 删除此克隆体 end -
这个简化版更容易理解,效果也完全一样,推荐初学者使用这个版本。
步骤 7:游戏结束检测
当蛇头碰到自己的身体或墙壁时,游戏结束。
-
回到蛇头角色,在
重复执行循环里添加检测代码。 -
代码实现:
// 在蛇头的重复执行循环里,移动代码之后添加: // 1. 检测是否撞墙 <<(x position) < (-235)> 或 <(x position) > (235)> 或 <(y position) < (-175)> 或 <(y position) > (175)>> 将 [游戏状态 v] 设为 (0) // 游戏结束 停止 [全部 v] // 停止所有脚本 end // 2. 检测是否撞到自己 // 我们遍历所有身体克隆体,看是否和蛇头位置重合 将 [i v] 设为 (1) 重复执行 ((长度 of [蛇身列表 v])) 次 // 或者重复执行一个足够大的次数 将 [i v] 增加 (1) // 如果碰到任何一个克隆体(除了自己) <碰到克隆体 [自己 v] ?> 将 [游戏状态 v] 设为 (0) 停止 [全部 v] end end
步骤 8:游戏结束界面
当游戏结束时,显示“Game Over”。
-
创建一个新角色:比如一个文字角色或者幽灵。
-
为这个角色编写脚本:
// 当绿旗被点击 当绿旗被点击 隐藏 // 当游戏状态变为0时 当 [游戏状态 v] 改变 <(游戏状态) = [0]> 显示 说 [Game Over!] (2) 秒 隐藏 end end
第四部分:优化与美化
步骤 9:添加分数
-
创建变量:为所有角色(或仅适用于舞台)创建一个
分数变量。 -
修改蛇头代码:在吃到食物的地方增加分数。
// 在蛇头“检测是否吃到食物”的代码块里 ... 将 [分数 v] 增加 (10) ...
步骤 10:添加音效
- 点击声音库,导入一些合适的音效,比如移动声、吃食物声、游戏结束声。
- 在相应的代码位置添加
播放声音 [ v]模块。
步骤 11:美化角色和背景
- 使用绘图工具,给蛇头和蛇身画上不同的颜色。
- 给食物换个更可爱的造型。
- 绘制一个舞台边框。
总结与挑战
恭喜你!现在你已经拥有一个功能完整的贪吃蛇游戏了。
回顾一下我们实现的功能:
- 方向控制:使用方向键控制蛇的移动,并防止蛇直接掉头。
- 食物系统:蛇吃到食物后,食物会随机在新位置出现。
- 身体增长:蛇吃到食物后,身体会通过克隆体变长。
- 碰撞检测:检测蛇是否撞墙或撞到自己,并结束游戏。
- 计分系统:每吃一个食物,分数增加。
- 速度递增:随着蛇变长,游戏速度会加快,增加挑战性。
你可以尝试的挑战:
- 开始界面:创建一个“开始游戏”的按钮,点击后才进入游戏。
- 最高分:使用
本地存储功能(在“文件”类别下)来保存和显示历史最高分。 - 障碍物:在地图上添加一些固定的障碍物,撞到也会游戏结束。
- 多种食物:创建不同类型的食物,有的增加2分,有的增加5分,有的会让蛇变短等。
希望这个详细的教程能帮助你成功制作出属于自己的贪吃蛇游戏!如果在制作过程中遇到任何问题,欢迎随时提问,祝你玩得开心!
