同学们,在“大鱼吃小鱼”这个经典游戏中,最核心的难点在于“两个角色如何进行互动与判断”。为了让游戏顺利运行,我们需要让主角(小丑鱼)和电脑鱼(克隆体)打好配合。

下面我们将从这两个角色的视角,分别拆解它们的代码逻辑。

🐟 第一部分:主角(小丑鱼 / 玩家控制)

小丑鱼是玩家操作的角色,它的核心任务是“听从玩家指挥”并“等待命运的宣判(吃或被吃)” 。

1. 移动与数据同步(基础生存)

平滑移动(防抖动): 游戏开始时,小丑鱼会回到屏幕下方(x:0 y:-180),初始大小设为 30 。为了防止小丑鱼碰到鼠标后疯狂抽搐,我们加了一个关键条件:如果 到 [鼠标指针] 的距离 > 5 才移动 。这就是经典的“防抖动”技巧。

广播自身大小: 其他鱼怎么知道小丑鱼有多大呢?我们使用了一个全局变量 [小丑鱼大小] 。小丑鱼会永远重复地将自己的实际大小赋值给这个变量,相当于在全场大喊:“我现在有这么大啦!” 。

2. 生与死(事件响应)

小丑鱼自己不主动判断有没有碰到别人,而是等待别的鱼发来“广播通知” 。

胜利吃鱼: 当接收到 [被小丑鱼吃掉] 的广播时,说明别的鱼判定自己太小被吃掉了 。小丑鱼会播放咬合声音(chomp),大小增加 2,并快速切换造型,做出“咀嚼”的动画 。

游戏失败: 当接收到 [吃掉小丑鱼] 的广播时,说明碰到了大鱼 。小丑鱼会立刻隐藏(死亡惩罚),等待 1 秒后重置回初始坐标和大小(30),再次显示(重生机制) 。

🐡 第二部分:电脑鱼(猎物与天敌 / 自动生成)

这部分是全新补充的逻辑。为了让海洋里源源不断地有鱼游过来,我们使用了 Scratch 中非常强大的“克隆”功能。这段代码分为两个独立的代码块:“克隆工厂”和“克隆体行为”。

1. 幕后黑手:克隆工厂

  • 隐藏 为什么点击绿旗要先隐藏?因为这个角色本身只是一个“模具”或“工厂”,它不参与游戏,真正游动的是它制造出来的分身。

  • 重复执行:克隆自己 -> 等待 1 秒 -> 下一个造型 这就是一个全自动流水线。每隔 1 秒制造一条新的鱼,并且每次换一个造型(这样游出来的鱼就会有不同的种类和颜色)。

2. 分身大军:克隆体行为

当克隆体诞生(当作为克隆体启动时)后,它有一套完整的“生老病死”流程:

  • 随机出生: * 大小随机: 将大小设为 在 20 和 40 之间取随机数。因为小丑鱼初始是 30,所以游出来的鱼有的比主角小(猎物),有的比主角大(天敌),保证了游戏的挑战性。

    • 位置随机: 移到 x:-200 y:在 -150 和 150 之间取随机数。X 为 -200 意味着所有鱼都从屏幕最左侧边缘统一出发,但高度(Y轴)是随机的。设置好后,执行 显示 让玩家看到它。

  • 移动与碰撞检测(核心难点):

    • 使用 重复执行直到 碰到 [舞台边缘] 包裹移动指令,意味着这条鱼会一直向右游(移动 5 步),直到游出屏幕。

    • 终极对决判断: 如果在游动的过程中 碰到 [小丑鱼] 怎么办?这时它会调取第一部分中提到的全局变量 [小丑鱼大小] 进行比对:

      • 如果 自己的大小 > [小丑鱼大小] 电脑鱼赢了!它会向主角发送死亡宣告 广播 [吃掉小丑鱼],并且自己因为吃饱了,将大小增加 3

      • 否则(即自己小于等于主角): 电脑鱼输了!它主动认怂,发送捷报 广播 [被小丑鱼吃掉] 通知主角变大,然后立刻执行 删除此克隆体,从屏幕上消失。

  • 垃圾回收(优化性能):

    • 最下方的 删除此克隆体 是什么意思?当那段 重复执行直到 结束时(也就是鱼平安游到了屏幕最右侧边缘,没有碰到小丑鱼),如果不管它,屏幕外会堆积无数条鱼,导致游戏卡死。所以游出屏幕的鱼必须被无情删除,这在编程中叫作“垃圾回收(内存释放)”。

💡 核心逻辑梳理(大总结)

通过两份代码的结合,我们可以看出一个成熟的 Scratch 互动系统的精妙之处:

  1. 明确分工: 小丑鱼负责“记录自身数据”“播放吃/被吃的动画”;电脑鱼(克隆体)负责“移动”“碰撞大小判断”。

  2. 变量与广播的桥梁作用: 电脑鱼通过读取变量 [小丑鱼大小],获得了判断胜负的依据 。

    • 电脑鱼通过发送广播 [吃掉小丑鱼][被小丑鱼吃掉],跨越角色去遥控小丑鱼的生死与成长 。

将复杂的逻辑拆分给不同的角色,并通过变量和广播把它们连接起来,这就是面向对象编程(OOP)最基础也最迷人的思维方式!