1. 项目概述与核心价值看到“模拟新冠疫情传播”这个题目很多Scratch初学者可能会觉得这是一个复杂的、需要高深数学知识的项目。实际上这正是第11届蓝桥杯Scratch国赛真题第5题的魅力所在——它用一个贴近现实、引人深思的社会议题来考察选手对Scratch核心编程思想如克隆、广播、变量、列表的综合运用能力以及将复杂问题抽象、分解并逐步实现的逻辑思维。这个项目远不止是完成一道竞赛题它更像是一个微型的“社会模拟沙盘”通过编程让我们直观地理解病毒传播的几个关键要素人群密度、传播概率、隔离措施的有效性等。我在辅导学生准备这类赛事时发现很多孩子一开始会被“疫情传播模型”这个名头吓到觉得无从下手。但当我们把它拆解成“角色移动”、“健康状态切换”、“接触检测”和“数据统计”这几个模块后一切就变得清晰起来。这道题的核心是要求我们创建一个动态的可视化模型其中包含健康、潜伏、确诊、治愈等多种状态的角色并能通过交互如按键来模拟“隔离”等防控措施最终观察不同措施下感染曲线的变化。这不仅能锻炼编程技巧更能培养一种系统思维和数据分析的初步意识。无论你是为了备战蓝桥杯还是单纯想用Scratch做一个有深度的科学模拟项目这个案例都极具学习和参考价值。2. 项目整体设计与思路拆解2.1 核心需求与功能解析拿到题目我们首先要抛开对“疫情”这个背景的畏惧专注于分析题目要求程序实现的具体功能。根据国赛真题的典型要求我们可以将项目核心需求分解为以下几点角色与状态管理需要创建代表“人群”的角色。每个个体至少应包含以下几种状态健康未感染、潜伏期已感染但未发病具有传染性、确诊已发病可被隔离、治愈具有免疫力。部分高级模型可能还会考虑“死亡”状态但国赛题通常以治愈为终点。传播动力学模拟这是模型的核心。需要实现病毒在人群中的传播逻辑关键在于定义“传播条件”。通常包括两个角色之间的距离足够近模拟密切接触传播方处于可传染状态潜伏期或确诊期接收方处于易感状态健康每次接触有一定的“传播概率”。可视化与交互所有状态的变化需要通过角色外观如颜色、造型的实时改变来可视化。同时必须提供交互手段例如按下空格键模拟“实施全员居家隔离”大幅降低移动速度按下其他键“解除隔离”从而让操作者能动态干预模拟过程观察不同策略的效果。数据统计与展示需要实时统计并显示各类人群的数量如当前健康人数、潜伏人数、确诊人数、治愈人数。更重要的是能绘制或列出关键数据随时间步数的变化例如“每日新增确诊数”这是评估模拟效果的核心指标。2.2 技术方案选型与Scratch工具运用在Scratch中实现上述需求我们需要精心选择并组合积木块。方案选型的背后是对于Scratch运行机制和题目效率要求的考量。角色生成克隆技术的极致应用我们绝不会创建几百个独立角色。克隆是唯一可行的方案。一个“人”的母体角色通过循环克隆出数百个副本每个克隆体独立拥有自己的属性状态、位置、移动逻辑。这是模拟大规模群体的基石。状态管理变量与列表的结合每个克隆体都需要记忆自己的状态。最简单的方法是为每个状态如“是否感染”建立一个私有变量对于克隆体选择“仅适用于当前角色”。但更系统、便于统一管理的方法是使用列表。我们可以建立一个列表叫“角色状态列表”克隆体的编号对应列表的索引号列表的值记录该克隆体的状态编码如0健康1潜伏…。这样在检测传播或更新全局数据时遍历和操作会非常高效。接触检测距离计算与循环优化传播检测需要在每一帧游戏循环中让每个克隆体检查它与其他所有克隆体的距离。这是一个O(n²)复杂度的操作如果克隆体过多如200可能会造成卡顿。优化技巧并非所有状态都需要检测。例如健康角色只需要被潜伏/确诊者检测即可无需主动检测他人。此外可以利用Scratch的“侦测”积木进行初步筛选或者通过划分“网格”空间来减少不必要的两两计算这在高级优化中会用到但对于国赛级别的数量通常100-200两两检测在优化代码后是可接受的。可视化造型与颜色的即时反馈为“人”角色设计多个造型对应不同状态。在改变状态变量的同时立刻切换造型和颜色如健康为绿色潜伏为黄色确诊为红色治愈为蓝色。这能让模拟过程一目了然。交互控制广播与全局变量按下隔离键不应去逐个修改几百个克隆体的移动速度。正确做法是设置一个全局变量如“隔离中”按下键将其设为1。每个克隆体在移动前都检查这个全局变量如果为1则将移动步长减小到一个很低的值如0.2从而实现集体行为控制。广播消息则更适合触发一次性全局事件如重置模拟。注意在克隆体内部尽量避免使用“等待”积木因为它会阻塞整个克隆体的脚本执行。应使用“重复执行”循环配合条件判断来实现状态计时如潜伏期倒计时。3. 核心模块拆解与实现细节3.1 克隆体生成与初始化设置这是模拟的起点。我们需要创建一个稳定、可控的初始人群。创建母体角色在舞台上绘制或选择一个简单的人物造型作为“母体”。为其创建好所有状态对应的造型健康、潜伏、确诊、治愈。定义属性变量建立以下适用于所有角色的变量用于存储每个克隆体自身的属性我的编号用于唯一标识每个克隆体在克隆时由全局计数器分配。我的状态记录当前状态0健康1潜伏2确诊3治愈。潜伏期计时器如果状态为潜伏此变量用于倒计时归零后转为确诊。治愈期计时器如果状态为确诊此变量用于倒计时归零后转为治愈。初始化与克隆当绿旗被点击母体角色应执行以下操作隐藏自身母体不参与模拟。初始化全局统计变量健康人数、潜伏人数等和列表如果使用。使用“重复执行[100]次”循环进行克隆。在每次克隆前将母体移动到舞台的一个随机位置在-240到240间随机选x在-180到180间随机选y。克隆自己并紧接着发送一个广播消息例如“初始化克隆体”。这样每个新生的克隆体都能接收到消息完成自身的初始化设置。克隆体初始化脚本当克隆体启动并且收到“初始化克隆体”消息时显示自己。将我的状态设为0健康切换为健康造型。将全局的健康人数增加1。开始执行克隆体的主循环脚本负责移动和状态检测。3.2 病毒传播逻辑的核心实现这是整个项目最精巧的部分直接决定了模拟的真实性与合理性。传播条件判断在每个克隆体的主循环中每秒执行30次我们需要加入传播检测。优化策略是只有健康状态的克隆体才需要被检测是否被传染。因此可以这样写如果 (我的状态) [0] 那么 // 只有健康者才可能被感染 变量 [i v] 设为 [1] 重复执行 (克隆体总数) 次 // 遍历所有克隆体编号 如果 (i) ≠ (我的编号) 那么 // 不检查自己 如果 ([其他克隆体的状态 v] 的第 (i) 项) [1] 或 ([其他克隆体的状态 v] 的第 (i) 项) [2] 那么 // 如果对方是潜伏者或确诊者 如果 ([到 v] (角色 (i)) 的距离) [20] 那么 // 如果距离足够近例如20像素 如果 (在 (1) 到 (100) 间随机选一个数) [传播概率] 那么 // 例如传播概率设为30% 变量 [我的状态 v] 设为 [1] // 被感染进入潜伏期 切换造型为 [潜伏期 v] 变量 [潜伏期计时器 v] 设为 [潜伏期时间] // 例如设为1204秒假设1秒30帧 停止当前脚本的 [其他克隆体的循环 v] // 已被感染无需再检查其他人 结束 结束 结束 结束 变量 [i v] 加 [1] 结束 结束实操心得这里的“其他克隆体的状态”列表需要提前维护好。当任何一个克隆体状态改变时除了更新自己的我的状态变量还必须同步更新这个全局列表中对应自己编号的那一项。这是保持数据一致性的关键否则检测会出错。状态自动转换与计时在克隆体的主循环中还需要处理状态的自动推进。潜伏期转确诊如果我的状态为1则每一帧将潜伏期计时器减1。当计时器≤0时将状态改为2确诊切换造型并重置治愈期计时器。确诊期转治愈如果我的状态为2同样每一帧递减治愈期计时器归零后转为状态3治愈切换造型。治愈者应不再具有传染性也不再会被感染。3.3 防控措施隔离的交互实现隔离措施模拟的是限制人员流动从而减少接触。在Scratch中我们通过改变克隆体的移动行为来实现。设置全局隔离开关创建一个全局变量隔离模式0代表正常1代表隔离。修改克隆体移动逻辑克隆体的移动脚本通常是在主循环中“移动10步”并“碰到边缘就反弹”。我们需要将其改造如果 (隔离模式) [1] 那么 移动 (1) 步 // 隔离时移动非常缓慢 否则 移动 (5) 步 // 正常时移动速度 结束键盘交互控制在舞台背景或一个独立角色中编写按键检测脚本。当按下 [空格 v] 键 变量 [隔离模式 v] 设为 [1] 当按下 [a v] 键 // 或其他指定键 变量 [隔离模式 v] 设为 [0]这样在模拟过程中你可以随时按下空格键观察隔离效果再按A键恢复正常非常直观。3.4 数据统计与可视化展示数据是模型的输出也是分析的依据。我们需要实时更新并展示。全局计数器建立健康人数、潜伏人数、确诊人数、治愈人数四个全局变量。关键点当任何一个克隆体的状态发生改变时必须在改变自身状态的同时对全局计数器进行“一减一加”操作。例如一个健康者被感染// 在克隆体脚本中 变量 [健康人数 v] 增加 (-1) 变量 [潜伏人数 v] 增加 (1) 变量 [我的状态 v] 设为 [1]这保证了全局数据的实时准确性。历史数据记录与曲线绘制进阶为了看到传播曲线我们可以使用列表来记录“每日新增确诊”。建立一个列表新增确诊记录。在舞台背景脚本中每隔一定时间如1秒模拟“一天”将当前确诊人数与上一“天”的记录进行比较计算出新增数量并将其添加到列表末尾。Scratch虽然不能直接画坐标图但我们可以通过“画笔”扩展来动态绘制简单的曲线或者更简单地让一个角色根据列表中的数值在y轴上移动用线段连接起来形成直观的曲线图。对于竞赛能清晰列出列表数据并口头描述趋势通常也能满足要求。4. 完整项目搭建与参数调优实录4.1 分步搭建指南让我们从头开始搭建这个项目。请打开Scratch 3.0跟随以下步骤步骤一角色与造型准备删除默认小猫角色。新建一个角色命名为“Person”。为其绘制四个简单圆形或小人造型分别命名为“健康”、“潜伏”、“确诊”、“治愈”并用不同颜色填充如绿、黄、红、蓝。可以再添加一个角色作为“数据展示器”用于显示文字和绘制曲线。步骤二变量与列表创建在“变量”模块中创建以下适用于所有角色的变量总人数、健康人数、潜伏人数、确诊人数、治愈人数我的编号、我的状态、潜伏期计时器、治愈期计时器这些变量在创建时勾选“仅适用于当前角色”隔离模式、传播概率、潜伏期时间、治愈期时间创建两个列表适用于所有角色角色状态列表用于存储所有克隆体的当前状态备用方案如果不用列表可全靠私有变量和广播更新全局计数。每日新增记录用于记录时间序列数据。步骤三编写母体角色脚本母体角色有两个主要脚本块绿旗初始化脚本当绿旗被点击 隐藏 变量 [总人数 v] 设为 [100] // 可根据电脑性能调整 变量 [健康人数 v] 设为 [总人数] 其他人数变量设为0 变量 [隔离模式 v] 设为 [0] 变量 [传播概率 v] 设为 [30] // 百分比 变量 [潜伏期时间 v] 设为 [120] // 帧数 变量 [治愈期时间 v] 设为 [300] // 帧数 删除 [全部 v] 项目于 [角色状态列表 v] 删除 [全部 v] 项目于 [每日新增记录 v] 广播 [初始化克隆体 v] 并等待 // 先广播一次清空可能存在的旧克隆体 重复执行 (总人数) 次 移到 x: (在 (-240) 到 (240) 间随机选一个数) y: (在 (-180) 到 (180) 间随机选一个数) 克隆 [自己 v] 结束 广播 [开始模拟 v]生成初始感染者脚本可在初始化后立即执行当接收到 [开始模拟 v] 等待 (1) 秒 // 等待所有克隆体初始化完成 重复执行 (3) 次 // 假设初始有3个感染者 广播 [随机感染 v] 等待 (0.1) 秒 结束步骤四编写克隆体Person核心脚本这是最复杂的部分建议拆成几个事件处理器当作为克隆体启动时当作为克隆体启动 显示 变量 [我的编号 v] 设为 (总人数) // 需要一个全局计数器来分配编号母体在克隆前递增它 变量 [我的状态 v] 设为 [0] 将 [0] 加入 [角色状态列表 v] // 初始化列表 切换造型为 [健康 v]当接收到消息“初始化克隆体”这个脚本用于在绿旗点击后重置所有已存在的克隆体如果有的话。对于新克隆体它会在“当作为克隆体启动”后立刻执行。当接收到 [初始化克隆体 v] 变量 [我的状态 v] 设为 [0] 替换 [角色状态列表 v] 的第 (我的编号) 项为 [0] 切换造型为 [健康 v]当接收到消息“开始模拟”这是克隆体的主循环入口。当接收到 [开始模拟 v] 重复执行直到 (我的状态) [3] 或 (我的状态) [4] // 治愈或死亡状态为终点 // 模块1: 移动 如果 (隔离模式) [1] 那么 移动 (0.5) 步 否则 移动 (3) 步 结束 碰到边缘就反弹 // 模块2: 状态检测与转换 (此处调用自定义积木或详细脚本见3.2节) 状态检测与更新 :: custom // 模块3: 传播检测 (此处调用自定义积木见3.2节) 尝试被感染 :: custom 等待 (0.01) 秒 // 一个小延迟防止过快循环耗尽资源 结束 // 循环结束说明已治愈 说 [我好了] (2) 秒这里我将“状态检测与更新”和“尝试被感染”做成了自定义积木并勾选“运行时不刷新屏幕”这样可以使代码块更清晰且执行效率更高。步骤五编写数据展示器角色脚本这个角色负责显示和记录。实时显示当绿旗被点击 重复执行 说 (连接 (连接 (连接 (连接 (连接 (连接 [健康] (健康人数)) [ 潜伏]) (潜伏人数)) [ 确诊]) (确诊人数)) [ 治愈] (治愈人数)) 结束记录数据在背景中亦可当绿旗被点击 等待 (5) 秒 // 等待模拟稳定 重复执行 将 (确诊人数) 加入 [每日新增记录 v] 等待 (60) 秒 // 每60秒记录一次模拟“天” 结束4.2 关键参数调优与模拟效果分析参数设置直接决定了模拟的逼真度和演示效果。以下是一组经过测试的推荐初始参数以及调整它们会产生的影响参数推荐初始值含义调高/调低的影响总人数100-150模拟区域内的总人口数调高传播速度可能加快接触机会多但会显著增加计算量可能导致卡顿。调低传播可能很慢或中途停止不利于观察。初始感染者2-5模拟开始时已处于潜伏期的人数调高疫情起点高爆发更快。调低可能无法形成传播链疫情自然熄灭。传播概率20%-40%健康者与传染源一次有效接触后被感染的概率调高疫情呈爆炸性增长曲线陡峭。调低疫情发展缓慢甚至无法传开。这是模拟“病毒传染力”的关键。有效接触距离15-25像素判定为“密切接触”的两个角色间的最大距离调高相当于人群密度大或社交距离小传播加快。调低相当于保持社交距离传播减慢。潜伏期时间3-5秒90-150帧从感染到出现症状确诊的时间调高无症状传播期长防控难度大感染曲线更平缓但持续时间长。调低感染者很快被识别并隔离有利于控制。治愈期时间8-12秒240-360帧从确诊到康复的时间调高医疗资源紧张期长同时确诊者作为传染源的时间也长。调低快速康复减少传染源。隔离移动速度0.2-1步/帧实施隔离后角色的移动速度调低隔离效果非常显著能迅速压平曲线。调高隔离不彻底效果有限。模拟效果分析运行程序后你会看到彩色点人群在移动。按下绿旗几个黄点潜伏者出现并逐渐将周围的绿点健康者染黄黄点变红确诊最后红点变蓝治愈。如果不干预通常会呈现一条先指数上升、后逐渐平缓的感染曲线。在疫情上升期按下空格键启动隔离你会发现红点和黄点的增长速度明显变慢甚至停止增长直观展示了隔离对阻断传播链的作用。过早解除隔离按A键疫情往往会出现反弹。5. 常见问题、调试技巧与扩展思路5.1 常见问题速查与解决方案在制作和调试过程中你几乎一定会遇到以下问题问题现象可能原因解决方案克隆体全部消失或不动母体角色在克隆后没有隐藏或者克隆体初始化脚本有误导致克隆体一诞生就执行了母体的“隐藏”指令。确保母体在绿旗点击后立刻“隐藏”。确保克隆体的启动脚本是“当作为克隆体启动时”并且里面有“显示”积木。感染无法传播或传播极慢1. 传播概率设置过低。2. 接触检测距离太小。3. 克隆体移动速度太慢接触机会少。4. 状态检测脚本逻辑错误例如健康者没有执行检测循环。1. 调高传播概率至30-50%测试。2. 调大接触距离至20-30像素。3. 在非隔离模式下调高移动速度至5-8步。4. 仔细检查“尝试被感染”自定义积木的逻辑确保健康状态克隆体在执行检测。使用“说”积木在检测时输出调试信息。感染瞬间爆发所有人几乎同时变黄1. 传播概率设为100%。2. 接触检测距离过大覆盖了整个舞台。3. 状态更新逻辑有误导致一个克隆体感染后瞬间感染了所有人。1. 检查传播概率变量值。2. 将接触距离调整到合理的视觉范围两个人造型刚好要碰到。3. 检查在感染一个健康者后是否错误地让其立即进入了传播检测循环它应该先进入潜伏期。确保逻辑是“健康者被感染 - 状态改为潜伏 - 退出本次检测循环”。全局人数统计不准克隆体状态改变时只改变了自身的我的状态没有同步更新全局计数器健康人数、潜伏人数等。在克隆体改变状态的代码块里务必紧跟着对全局计数器进行“一减一加”操作。例如从健康变为潜伏健康人数增加-1和潜伏人数增加1。程序运行越来越卡1. 克隆体数量过多200。2. 在“重复执行”循环内使用了“等待”积木导致循环阻塞克隆体堆积。3. 传播检测是O(n²)复杂度未做任何优化。1. 减少总人数。2. 将循环内的“等待”换成“等待0.01秒”或更短或者使用自定义积木的“不刷新屏幕”特性来提升性能。3. 实施优化仅让“传染源”去检测周围的健康者而不是每个人检测所有人。或者引入“网格分区”算法只检测相邻网格内的角色。隔离措施无效克隆体的移动脚本没有检测隔离模式全局变量。或者隔离模式变量没有被正确设置为1。在克隆体的移动指令前添加“如果...那么...否则”判断隔离模式。在键盘控制脚本中使用“当按下空格键”事件并确保里面是将隔离模式设为1。5.2 调试技巧与心得使用“说”来调试这是Scratch最有效的调试手段。在关键的判断点让克隆体“说”出它的状态或变量值。例如在传播检测成功时让被感染的克隆体说“我被感染了”这样你就能在舞台上看到感染事件的发生确认逻辑在运行。降低速度放大观察在调试初期可以将总人数设为10-20移动速度调低传播概率调高。这样你能更清楚地观察每一个感染事件是如何发生的便于定位问题。分模块测试不要一次性写完所有代码。先实现克隆和移动确保100个小点能满屏跑。再加入状态和造型切换确保按键能改变颜色。最后才加入最复杂的传播检测逻辑。每完成一个模块就测试一次。善用“停止全部脚本”当程序出现异常如克隆体疯狂增长可以按红色停止按钮然后使用“编辑”菜单中的“加速模式”来快速清理舞台重新开始。5.3 项目扩展思路完成基础版本后你可以尝试增加复杂度让模型更精细加入“医院床位”限制创建一个全局变量可用床位。当确诊人数超过床位时后续的确诊者治愈时间延长甚至引入一个很低的“死亡率”。模拟“疫苗接种”增加一个“已接种”状态。接种者有一定概率不会被感染或者感染后直接变为轻症跳过潜伏期。可以设置一个按键来模拟开展疫苗接种运动。引入“病毒变异”让传播概率或潜伏期时间每隔一段时间随机变化一次模拟病毒变异带来的影响。可视化升级使用Scratch的“画笔”功能让数据展示器角色根据每日新增记录列表在舞台上动态绘制出漂亮的折线图X轴是时间Y轴是人数。多场景对比复制整个项目修改参数如不同的隔离强度、初始感染人数同时运行两个窗口对比疫情发展的差异这能非常直观地展示防控策略的重要性。这个“模拟新冠疫情传播”的项目其价值远超一道编程题。它是一次完整的计算思维训练建模将现实问题抽象为规则、分解拆分成克隆、移动、状态、检测等模块、算法实现传播与检测逻辑、评估通过参数调整观察结果。通过亲手构建和调试这个模型你不仅能深刻理解传染病传播的基本原理更能掌握用Scratch解决复杂模拟类问题的通用方法论。在调试那些不听话的克隆体和总是对不上的统计数字的过程中你所提升的调试耐心和逻辑严谨性将是未来学习任何编程语言都受用无穷的财富。