图形化编程实战:智能交通灯调度台,一个作品讲透循环、条件与广播

引言

最近多地创意编程活动正进入作品提交季,比如南京市秦淮区"第三届小学信息科技创意编程活动"(8月31日前提交,编程方向主题为"智慧生活"),图形化赛项鼓励低龄段同学用积木做出能解决真实问题的互动作品。这一类赛题最看重的,不是特效多炫,而是有没有把"数据组织 + 流程控制"想清楚

今天我们就用一个贴近生活的原创项目------智能交通灯调度台,把列表、循环、条件、变量、自制积木、广播这六大考点,串进一个能跑起来的作品里。无论你是备赛图形化赛项,还是刚学完基础积木想练手,都能照着做出自己的版本。

一、项目目标(题目)

模拟一个十字路口:东西向与南北向两条车流轮流通行;红绿灯按固定秒数自动切换;统计每个方向已经通过的车辆数;用克隆体表现排队等待的车流。

把题目拆成可验收的小目标:

  1. 红绿灯能自动在"东西通行 / 南北通行"之间来回切换,每次持续固定秒数;

  2. 车辆以克隆体形式不断"来车",在停止线前排队;

  3. 只有当前放行方向、且位于停止线前的车才能前进通过路口;

  4. 每个方向通过的车辆数实时累加并显示;

  5. 灯色变化、车辆通行、计数更新三者互不硬耦合(用广播解耦)。

二、核心考点

考点 在本项目里的落点
变量 当前灯色倒计时东西通行计数南北通行计数方向(私有)
列表 用两个列表分别存"东西方向等待车辆编号"和"南北方向等待车辆编号",实现排队队列
循环 控制器"倒计时"用「重复执行 + 等待1秒」做秒级流逝
条件 判断当前灯色决定下一步切到哪边;判断克隆体是否轮到自己方向、是否在停止线前
自制积木 封装「画灯(灯色)」「生成一辆车(方向)」,避免重复堆积木
广播 控制器广播"东西通行 / 南北通行",车辆与音效角色被动响应,互不直连

这六点几乎覆盖了图形化赛项 80% 的评分维度:能稳定用到变量和列表,基本就过了"会用数据"这一关;会用广播和自制积木,则是"代码结构清晰"的加分项。

三、角色与舞台规划

  • 红绿灯控制器:舞台中央或上方,只负责"计时 + 切灯 + 广播",不碰任何车辆逻辑;
  • 车辆(克隆体) :同一造型克隆出东西/南北两路车,靠私有变量 方向 区分归属;
  • 计数显示:用两个变量分别显示"东西已通行 N 辆 / 南北已通行 M 辆";
  • (可选)音效角色:收到广播后播放"嘀"声,纯装饰。

设计要点:控制器和车辆不直接说话,全部通过广播沟通。这样你后面想加行人按钮、加黄灯,都不会把代码改崩。

四、解法拆解

1. 红绿灯控制器(主控角色)

需要 4 个变量:当前灯色倒计时东西计数南北计数,初始:

  • 当前灯色 = "东西绿",倒计时 = 5(每次放行 5 秒);

核心积木逻辑(文字描述,对应图形化积木顺序):

复制代码
当 ⚑ 被点击:
    设置 [当前灯色] = "东西绿"
    设置 [倒计时] = 5
    重复执行:
        重复 [倒计时] 次:
            等待 1 秒
            将 [倒计时] 增加 (-1)
        如果 <(当前灯色) = "东西绿"> 那么:
            设置 [当前灯色] = "南北绿"
            设置 [倒计时] = 5
            广播 [南北通行]
        否则:
            设置 [当前灯色] = "东西绿"
            设置 [倒计时] = 5
            广播 [东西通行]

这里外层的"重复执行"是死循环(一直调度),内层的"重复 N 次 + 等待1秒"才是真正的倒计时------这是初学者最容易写错的地方:把等待直接放在死循环里,灯就再也不会切了。

2. 车辆(克隆体队列)

用一个列表当作"排队队列"。以东西方向为例:

复制代码
当 ⚑ 被点击:
    将 [东西队列] 的全部项目删除
    重复执行:
        等待 (1.5) 秒
        将 (队列长度+1) 加入 [东西队列]
        生成一辆车(方向="东西")

当作为克隆体启动时:
    设置 [方向] = "东西"            // 私有变量,区分东西/南北车
    移到 (东西排队点 x, y)
    重复执行:
        如果 <<收到广播 [东西通行]> 且 <碰到 [停止线]>> 那么:
            重复执行直到 <越过路口>:
                移动 (3) 步
            将 [东西计数] 增加 (1)
            删除这个克隆体

南北方向是同一套逻辑、换一个列表和广播名即可。注意:"方向"必须是克隆体的私有变量,否则所有克隆体会共享同一个值,排队就乱套了。

3. 自制积木:把重复活封装掉

把"画一盏灯"和"生成一辆车"分别做成带参数的自制积木,能少写大量重复积木:

  • 画灯(灯色):清空灯盘 → 按 灯色 点亮对应颜色(绿/黄/红);
  • 生成一辆车(方向):在对应排队点克隆一个车辆造型。

封装后,主逻辑只剩"调度 + 广播",可读性直线上升,评委一眼能看出你的结构意识。

4. 广播解耦(关键设计)

控制器只负责 广播 [东西通行] / 广播 [南北通行];车辆、音效、计数显示都"听到广播再行动"。好处是:

  • 想加"黄灯过渡",只需在控制器里多广播一个 [切换中],别处加响应即可;

  • 想改放行时长,只动控制器,车辆逻辑零改动。

这就是图形化项目里的"低耦合"思维,也是从"能跑"到"写得好"的分水岭。

五、运行效果

绿旗一点,路口开始工作:

  • 东西向绿灯亮起,东西方向排队的车一辆接一辆通过,左上角"东西已通行"数字跳动;

  • 5 秒后灯色切到南北绿,南北车流启动,东西车老实停在停止线前;

  • 如此往返,两条车流互不抢道,计数各自累加,画面干净、逻辑清晰。

把它录成 30 秒演示视频,配一句"本作品用广播解耦三要素、用列表维护双队列",就是一份能直接交到赛项评审手里的完整作品。

六、进阶挑战(赛项冲奖用)

  1. 行人请求按钮:按下"行人过街",当前绿灯走完后插入一次"全红 + 行人通行"状态;
  2. 黄灯过渡:绿灯结束先亮 2 秒黄灯再切,更接近真实路口;
  3. 车流统计条形图:用"图章"或"画笔"把东西/南北通行量画成对比柱状图;
  4. 多路口联动:把控制器做成可复制的角色,两条街的灯错峰放行,考验列表与广播的协同;
  5. 随机车流 + 传感器:用随机数模拟"哪边车多",车多的一侧自动延长放行时间------这就从"定时调度"升级成了"自适应调度"。

如果你想从图形化过渡到代码思维,这段调度循环本质就是一个状态机,用几行代码也能表达同样的逻辑:

python 复制代码
light, timer, ew, ns = "E", 5, 0, 0
while True:
    for _ in range(timer):
        pass  # 等待 1 秒
    if light == "E":
        light, timer, ns = "N", 5, ns + north_pass()
    else:
        light, timer, ew = "E", 5, ew + east_pass()

能看出来吗?图形化的"重复执行 + 等待",在代码里就是 for _ in range(timer);图形化的"广播",对应代码里的一次函数调用。两种语言说的是同一件事。

七、小结与互动

一个智能交通灯调度台,把**变量(灯色/计时/计数)、列表(双队列)、循环(倒计时)、条件(切灯/放行判断)、自制积木(画灯/生车)、广播(解耦三要素)**全串了一遍。它不难,但足够"真"------真实路口就是这么调度的。

今日小作业:给你的调度台加一个"车多延时"逻辑,让车多的方向多放 3 秒,把你的做法写在评论区,我们一起看谁的更稳。

如果这篇对你备赛图形化赛项有帮助,记得点个赞收藏,下一期我们用"垃圾分类机器人"再讲一遍列表与克隆体的高级用法。


📚 免费少儿编程资料(夸克网盘领取)

以下资料来自夸克网盘分享,点击链接可直接保存;若需在 App 内打开,也可复制下方明文链接:

  1. 全国青少年信息素养大赛复赛集训题目Python&C++.docx
    https://pan.quark.cn/s/93995d3cb150
  2. 2024信息素养-智能算法应用挑战赛-复赛初中组题目7月7日.pdf
    https://pan.quark.cn/s/da97b5dbf75d
  3. Python背记手册.pdf
    https://pan.quark.cn/s/7568ae9ca92b
  4. Python课程
    https://pan.quark.cn/s/a94bf02d00c6
  5. 2024信息素养大赛图形化复赛集训题答案3-9
    https://pan.quark.cn/s/6ccab7ec3cbc
  6. 2025年03月份电子学会考级真题
    https://pan.quark.cn/s/4403c4228912
  7. 2025全国青少年信息素养大赛赛项说明
    https://pan.quark.cn/s/d9d0df4a9f29
  8. 青少儿信息素养大赛编程资料
    https://pan.quark.cn/s/4ab6bd83be8a

资料持续更新,关注获取最新分享。

相关推荐
HAPPY酷13 分钟前
python的对象和方法
开发语言·python
evans在进步15 分钟前
LeetCode 438 找到字符串中所有字母异位词:滑动窗口与排序解法详解
算法·leetcode·职场和发展
赵民勇16 分钟前
C++无锁编程详解
c++
M78佐菲19 分钟前
Linux多线程:创建、回收与互斥同步
linux·笔记·学习·算法
醉颜凉20 分钟前
C++ 中野指针与悬挂指针的区别:从成因到防范,彻底讲清两种危险指针
c++
Demon--hx23 分钟前
设计不能被继承的类
开发语言·c++
小手cool24 分钟前
使用递归对数组进行反转操作
java·数据结构·算法
the局外人31 分钟前
别再背 Chain、Agent、Memory 了:用一条“智能流水线”学会 LangChain
python·langchain·llm
兔兔兔兔135 分钟前
记录C++ 13
开发语言·c++·算法