杰瑞科技汇

Scratch贪吃蛇教程,如何一步步实现?

Scratch 贪吃蛇游戏开发教程

最终效果预览:

Scratch贪吃蛇教程,如何一步步实现?-图1
(图片来源网络,侵删)

第一部分:准备工作与游戏核心逻辑

步骤 1:创建角色和背景

  1. 打开 Scratch:打开 scratch.mit.edu 的在线编辑器或桌面版。
  2. 删除默认角色:点击舞台上的小猫角色,然后点击右上角的“删除”按钮。
  3. 创建蛇头
    • 点击舞台左下角的“选择一个角色”。
    • 在“动物”分类里,选择一个你喜欢的动物作为蛇头,Cat”(猫)。
    • 为了让它更像蛇头,我们可以点击“造型”选项卡,删除其他造型,只保留一个,然后使用“造型”里的绘图工具,给它画上眼睛,让它看起来更精神。
  4. 创建食物
    • 再次点击“选择一个角色”,这次选择一个圆形的水果,Apple”(苹果)。
    • 调整它的大小,让它比蛇头小一些。
  5. 创建背景
    • 点击舞台左下角的“选择一个背景”。
    • 在“背景库”中,选择一个简单的背景,Blue Sky”(蓝天)或者干脆留空,我们也可以自己画一个边框。

现在你的舞台应该有一个蛇头角色和一个苹果食物角色。

步骤 2:让蛇头动起来

这是游戏的核心,蛇不能随意乱走,它必须朝着当前方向前进,并且不能后退。

  1. 为蛇头添加脚本:点击你的蛇头角色,开始编写代码。

  2. 创建变量:我们需要一些变量来存储游戏状态。

    Scratch贪吃蛇教程,如何一步步实现?-图2
    (图片来源网络,侵删)
    • 点击舞台右上角的“变量”类别。
    • 点击“新建一个变量”,命名为 速度
    • 再创建一个变量 游戏状态,初始值设为 1(代表游戏进行中)。
  3. 编写移动逻辑

    • 当绿旗被点击时,游戏开始。
    • 我们需要让蛇头一直移动,直到游戏结束,所以使用 当绿旗被点击重复执行
    • 运动 类别中,拖出 将 x 坐标增加 (10) 模块,为了让蛇能朝四个方向移动,我们需要根据方向来改变 xy 坐标。

    核心代码思路:

    • 我们用 方向 变量来记录蛇头当前朝向(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:控制蛇的方向

现在蛇只会往右走,我们需要用键盘来控制它。

  1. 事件 类别中,拖出一个 当按下 [ v] 键 模块。
  2. 控制 类别中,拖出 <gt; 模块,放在里面。
  3. 侦测 类别中,拖出 按键 [ 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:生成食物

食物被吃掉后,需要在新的位置随机出现。

  1. 为食物添加脚本:点击你的苹果(食物)角色。

  2. 创建变量:为食物创建一个“仅适用于此角色”的变量,叫 食物可见

  3. 编写代码

    // 当绿旗被点击
    当绿旗被点击
    隐藏 // 开始时隐藏
    将 [食物可见 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:检测“吃”到食物

当蛇头的位置和食物的位置重叠时,就表示吃到了。

  1. 回到蛇头的脚本,在移动逻辑的 重复执行 循环里,添加检测代码。

  2. 代码实现

    // 在蛇头的重复执行循环里,移动代码之后添加:
    // 检测是否吃到食物
    <碰到 [Apple v] ?> // "Apple" 是你的食物角色的名字
        // 播放吃掉的声音
        播放声音 [Eat v] 直到播放完毕 // 如果你没有这个声音,可以找一个替换或省略
        // 广播消息,让食物重新生成
        广播 [生成食物 v]
        // 增加蛇的长度(我们稍后实现)
        // ...
        // 增加速度,让游戏变难
        将 [速度 v] 增加 (1)
    end

当蛇头碰到苹果时,苹果会消失并在新位置出现,同时蛇会变快。


第三部分:实现蛇身和碰撞检测

这是最复杂但也是最有趣的部分,蛇吃到食物后,身体要变长,如果撞到自己或墙壁,游戏结束。

步骤 6:创建蛇身

我们不能手动创建很多蛇身,最好的方法是克隆。

  1. 回到蛇头角色,再创建一个“仅适用于此角色”的变量,叫 蛇身列表,这是一个列表,用来存储蛇身每个身体节点的位置。

  2. 初始化列表:在 当绿旗被点击 的开头,添加代码清空列表。

    当绿旗被点击
        ...
        将 [蛇身列表 v] 清空 // 添加这一行
        ...
  3. 增长逻辑:当吃到食物时,我们向列表里添加一个新的身体节点。

    // 在蛇头“检测是否吃到食物”的代码块里,广播之后添加:
    // 将蛇头的当前位置添加到列表末尾,作为新的身体节点
    将 [i v] 设为 (1) // 'i' 是一个临时变量,用于循环
    重复执行 (3) 次 // 初始蛇身长度为3
        将 [i v] 增加 (1)
        将 ((i) * (10)) 添加到 [蛇身列表 v]
    end
  4. 克隆蛇身

    • 在蛇头的 重复执行 循环里,在每次移动后,我们需要创建一个新的身体克隆体,并删除最旧的克隆体。
    • 代码实现
    // 在蛇头的重复执行循环里,移动和吃食物之后添加:
    // 创建一个新的身体克隆体
    克隆 [自己 v]
    // 删除列表最旧的身体节点(如果列表长度大于蛇身应有的长度)
    <<(长度 of [蛇身列表 v]) > ((速度) / (2))> // (速度)/2 是一个动态的蛇身长度
        删除第 (1) 项 of [蛇身列表 v] // 删除最旧的一项
    end
  5. 为蛇身克隆体编写脚本

    • 点击蛇头角色,在脚本区最下方添加一个新的事件块。
    // 当作为克隆体启动时
    当我作为克隆体启动
        隐藏
        // 循环,直到游戏结束
        重复执行直到 <(游戏状态) = [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_posy_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. 回到蛇头角色,在 重复执行 循环里添加检测代码。

  2. 代码实现

    // 在蛇头的重复执行循环里,移动代码之后添加:
    // 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”。

  1. 创建一个新角色:比如一个文字角色或者幽灵。

  2. 为这个角色编写脚本

    // 当绿旗被点击
    当绿旗被点击
    隐藏
    // 当游戏状态变为0时
    当 [游戏状态 v] 改变
        <(游戏状态) = [0]> 
            显示
            说 [Game Over!] (2) 秒
            隐藏
        end
    end

第四部分:优化与美化

步骤 9:添加分数

  1. 创建变量:为所有角色(或仅适用于舞台)创建一个 分数 变量。

  2. 修改蛇头代码:在吃到食物的地方增加分数。

    // 在蛇头“检测是否吃到食物”的代码块里
    ...
    将 [分数 v] 增加 (10)
    ...

步骤 10:添加音效

  1. 点击声音库,导入一些合适的音效,比如移动声、吃食物声、游戏结束声。
  2. 在相应的代码位置添加 播放声音 [ v] 模块。

步骤 11:美化角色和背景

  • 使用绘图工具,给蛇头和蛇身画上不同的颜色。
  • 给食物换个更可爱的造型。
  • 绘制一个舞台边框。

总结与挑战

恭喜你!现在你已经拥有一个功能完整的贪吃蛇游戏了。

回顾一下我们实现的功能:

  • 方向控制:使用方向键控制蛇的移动,并防止蛇直接掉头。
  • 食物系统:蛇吃到食物后,食物会随机在新位置出现。
  • 身体增长:蛇吃到食物后,身体会通过克隆体变长。
  • 碰撞检测:检测蛇是否撞墙或撞到自己,并结束游戏。
  • 计分系统:每吃一个食物,分数增加。
  • 速度递增:随着蛇变长,游戏速度会加快,增加挑战性。

你可以尝试的挑战:

  1. 开始界面:创建一个“开始游戏”的按钮,点击后才进入游戏。
  2. 最高分:使用 本地存储 功能(在“文件”类别下)来保存和显示历史最高分。
  3. 障碍物:在地图上添加一些固定的障碍物,撞到也会游戏结束。
  4. 多种食物:创建不同类型的食物,有的增加2分,有的增加5分,有的会让蛇变短等。

希望这个详细的教程能帮助你成功制作出属于自己的贪吃蛇游戏!如果在制作过程中遇到任何问题,欢迎随时提问,祝你玩得开心!

分享:
扫描分享到社交APP
上一篇
下一篇