在第十八届蓝桥杯全国青少年智能科技创新实践活动(程序设计组图形化方向)的省赛窗口期,很多同学都在找「既像真题、又能练全考点」的图形化小项目。其实推箱子(仓库整理)就是一道非常经典且高频的题型:它把地图建模、角色移动、碰撞判定、状态同步、胜利检测全部浓缩在一个小游戏里,几乎覆盖了电子学会图形化考级一二三级和全国青少年信息素养大赛算法应用主题赛图形化方向的核心要求。
下面这道《校园推箱子大挑战》是我按比赛常见出题方式原创设计的,可以直接当作练手项目,也可以作为备赛样例拆解。
一、项目目标(原创题)
校园仓库整理 :舞台是一张 10×8 的方格地图。地图上有若干箱子 (用方块角色表示)和若干目标点 (用圆圈标记)。玩家用方向键控制「搬运小能手」在地图里移动,推动箱子,目标是把所有箱子都推到目标点上,全部归位即过关。
规则约束:
-
搬运工一次只能推动一个 箱子,且箱子后面必须是空地(不能推两个、不能推墙)。
-
墙(障碍物)不可穿过,箱子也不能被推进墙里。
-
箱子一旦停在目标点上,若被推走,该目标点重新变空,需再次归位。
-
全部箱子到达目标点 → 广播「过关」;无路可走(箱子卡死在角落)可点「重置」重来。
二、核心考点拆解
| 考点 | 在本题中的体现 |
|---|---|
| 列表 | 用两个一维列表分别保存「地图静态层」(墙/空地/目标)和「动态层」(箱子坐标集合),也可用列表保存每关配置,方便切关。 |
| 变量 | 搬运工x / 搬运工y 记录角色坐标;箱子数量、已归位数量、关卡号、步数、游戏状态(进行中/结束闸门)都是用变量维护。 |
| 条件 | 移动前先判「前方是墙吗?是箱子吗?箱子后面是空地吗?」;推完后判「是否全部归位」;撞边界拦截。 |
| 循环 | 主循环「等待 0.1 秒 → 读方向 → 移动 → 碰撞判定 → 重绘」;遍历箱子列表做归位检测;遍历地图画格子。 |
| 自制积木 | 封装 画地图、移动一步(方向)、尝试推动(方向)、判定过关、重置关卡,让主逻辑清爽、易调。 |
| 广播 | 按钮只广播 开始、上/下/左/右、重置;搬运工只听广播做事、播报员只听广播说话,实现「逻辑与表现分离」。 |
三、解法与积木拆解
1. 地图怎么存
最直观的办法是「两层列表」:
地图层:长度 80 的一维列表(10×8),元素取值 0=空地、1=墙、2=目标点。箱子层:一个列表,里面每项是一个[x, y],保存当前每个箱子的坐标。- 搬运工坐标用
搬运工x / 搬运工y两个变量单独记。
这样「某格是不是墙」「某格有没有箱子」都能 O(1) 查到,碰撞判定非常快。
2. 一次移动的三步判定(最关键)
每当按下方向键,搬运工要执行「尝试移动」,逻辑如下(用中文描述积木流程):
当收到广播 [方向=上]:
计算 新x = 搬运工x, 新y = 搬运工y - 1
如果 地图层[新x,新y] == 墙:
什么也不做(撞墙拦截)
否则 如果 箱子层里存在 [新x,新y]:
计算 箱后x = 新x, 箱后y = 新y - 1
如果 地图层[箱后x,箱后y] 是墙 或 箱子层里也存在[箱后x,箱后y]:
什么也不做(推不动,背后是墙或另一个箱子)
否则:
把那个箱子坐标改成 [箱后x,箱后y] // 箱子被推动
搬运工坐标改成 [新x,新y]
步数 + 1
否则:
搬运工坐标改成 [新x,新y]
步数 + 1
广播 [重绘]
核心思想只有一句话:先判墙,再判箱,箱后还不能是墙或箱。把这三个条件写对,推箱子就成功了一大半。
3. 过关检测
每次重绘后,遍历箱子层,数一数有多少个箱子的坐标落在「地图层标记为 2(目标点)」的格子上。如果 已归位数量 == 箱子数量,广播「过关」,并把步数记到成绩榜。
4. 重置与多关卡
把每关的「地图层 + 箱子初始坐标 + 目标点」作为一个配置项放进列表,切关时把配置还原到变量和列表里,再广播「重绘」。这样加关卡只是往列表里多写几行,主逻辑完全不用改------这正是列表驱动的威力。
5. Python 版核心推逻辑(对照参考)
图形化和代码本质是同一套逻辑,下面用 Python 写一遍「尝试推」的核心,方便你对照理解:
python
def try_push(px, py, dx, dy, walls, boxes):
# px,py: 搬运工坐标;dx,dy: 方向增量
nx, ny = px + dx, py + dy
if (nx, ny) in walls:
return False # 前方是墙
if (nx, ny) in boxes:
bx, by = nx + dx, ny + dy
if (bx, by) in walls or (bx, by) in boxes:
return False # 箱后是墙或另一个箱子,推不动
boxes.remove((nx, ny))
boxes.add((bx, by)) # 箱子被推动
return True # 搬运工可以走到 (nx, ny)
这段和上面中文积木一一对应:walls 就是地图层的墙集合,boxes 就是箱子层。理解了它,你就能把推箱子从「图形化」迁移到「代码」,对蓝桥杯软件赛和信息素养算法赛都很有帮助。
四、进阶玩法
- 最短步数挑战 :给定一关,能否用最少步数把所有箱子推到位?这其实是一个状态空间搜索问题,状态 =(搬运工坐标 + 所有箱子坐标),用 BFS(广度优先搜索) 求最短路即可。下面是一个求最短解的 Python 骨架:
python
from collections import deque
def bfs_solve(start_worker, start_boxes, targets, walls):
start = (start_worker, frozenset(start_boxes))
q = deque([(start, 0)])
seen = {start}
dirs = [(0,-1),(0,1),(-1,0),(1,0)]
while q:
(wk, bs), step = q.popleft()
if bs <= targets: # 所有箱子都在目标上
return step
for dx, dy in dirs:
nx, ny = wk[0]+dx, wk[1]+dy
if (nx, ny) in walls:
continue
new_bs = bs
if (nx, ny) in bs:
bx, by = nx+dx, ny+dy
if (bx, by) in walls or (bx, by) in bs:
continue
new_bs = (bs - {(nx, ny)}) | {(bx, by)}
nxt = ((nx, ny), new_bs)
if nxt not in seen:
seen.add(nxt)
q.append((nxt, step+1))
return -1
- 撤销一步(Undo):把每一步前的状态压入一个「历史栈」列表,点撤销就弹栈还原,体验立刻专业。
- 计时与步数排行:用变量记时间,过关后把「步数+用时」追加进成绩列表,做个校内排行榜。
- 关卡编辑器:用鼠标点击格子切换「墙/目标/空地」并生成配置,进阶同学可以自己造关分享给同学。
五、小结与互动
推箱子这个项目,列表 管地图与箱子、变量 记坐标与状态、条件 做碰撞三连判、循环 驱动主流程、自制积木 封装细节、广播解耦逻辑与表现------六大图形化考点一个不落,非常适合作蓝桥杯青少组图形化、电子学会图形化考级(一级到三级)和全国青少年信息素养大赛图形化方向的备赛练手题。
建议大家先照着上面的中文流程把「单次移动三连判」跑通,再慢慢加过关检测、重置、多关卡,最后挑战 BFS 最短步数。
互动时间:你最想看哪类图形化真题拆解?是迷宫寻路、接水果动作类,还是答题闯关?评论区告诉我,下一篇就写它~也欢迎晒出你的推箱子最短步数成绩!
📚 免费少儿编程资料(夸克网盘领取)
以下资料来自夸克网盘分享,点击链接可直接保存;若需在 App 内打开,也可复制下方明文链接:
- 全国青少年信息素养大赛复赛集训题目Python&C++.docx
https://pan.quark.cn/s/93995d3cb150 - 2024信息素养-智能算法应用挑战赛-复赛初中组题目7月7日.pdf
https://pan.quark.cn/s/da97b5dbf75d - Python背记手册.pdf
https://pan.quark.cn/s/7568ae9ca92b - Python课程
https://pan.quark.cn/s/a94bf02d00c6 - 2024信息素养大赛图形化复赛集训题答案3-9
https://pan.quark.cn/s/6ccab7ec3cbc - 2025年03月份电子学会考级真题
https://pan.quark.cn/s/4403c4228912 - 2025全国青少年信息素养大赛赛项说明
https://pan.quark.cn/s/d9d0df4a9f29 - 青少儿信息素养大赛编程资料
https://pan.quark.cn/s/4ab6bd83be8a
资料持续更新,关注获取最新分享。