作业3:声光控小灯
声光控小灯……因正负极接反声音传感器烧毁!2025年7月19日
世界说明如下:
Karel初始状态:第一行第一列的角落,面向东方;
逐步求精法
逐步求精法是一种将复杂问题分解为简单子问题、逐步细化解决方案的编程思想。
步骤1.先写出高层次的伪代码或主流程;
步骤2.把每一步拆解成更小的、易于实现的函数;
步骤3.每次只关注一个小目标,逐步完善细节;
步骤4.不断测试和调整,逐步让程序变得完整且健壮;
分析
1.类型0:奇数行从开始放置beeper;
2.类型1:偶数行开始不放置beeper,同行下一个角落放置;
3.铺奇数行的函数,可以在铺偶数行时直接复用;
应用
步骤1.先写主流程:比如“铺满一行 → 换行 → 重复”;
步骤2.再分别实现“铺满奇数行”“铺满偶数行”等子函数;
步骤3.每实现一个小目标就测试,确保每一步都正确;
建议:不要“之”字形(No Zig-Zag)
1.你可能会觉得像现实中走路那样,先从左到右铺一行,再从右到左铺下一行(之字形/Zig-Zag)很自然。但在代码实现中,这种之字形方案其实是个大坑!;
2.如果用之字形,每种行(类型0和类型1)的前置/后置条件都不一样,方向也相反,导致代码很难统一和复用;
3.更好的做法是:每一行都用同一个方向(比如都从左到右),就像课堂讲解的例子那样;
🚀这样,铺两种行的函数的前置/后置条件就能保持一致,代码结构会非常清晰、易于维护。
⏳开始你的编程之旅吧!
🔥逐步求精法🔥
🔥边开发边迭代测试🔥
你的代码要保证其通用性,点击Change World ▼
选择40×40地图,确认你的代码也适用。
下面讨论一些情况的示例。奇数大小的棋盘很棘手,您应该确保您的程序在 5x3 世界中生成以下模式:
考虑单行或单列的世界1×8和8×1,这个问题很难:尝试使用分解来简化你的解决方案。
1.你能检查单行或单列吗?
2.你能让行/列适用于不同的宽度/高度?
3.一旦你完成了一行/列,你能让 Karel 填充两行吗?
4.你能让 Karel 填充三行吗?
5.你能让 Karel 填充所有行吗?
🚀分阶段逐步开发程序有助于将其分解为更简单的部分,并且是解决困难编程问题的明智策略
📝再次开始你的编程之旅吧!🎯确保您的程序在Change World ▼以下所有世界中成功运行。
🔥逐步求精法🔥
🔥边开发边迭代测试🔥
函数 |
描述 |
函数 |
描述 |
move() |
向前移动一步 |
turn_left() |
向左转90度 |
pick_beeper() |
拾取当前位置的蜂鸣器 |
put_beeper() |
在当前位置放置蜂鸣器 |
front_is_clear() |
检查前方是否有墙 |
front_is_blocked() |
检查前方是否被墙挡住 |
left_is_clear() |
检查左侧是否有墙 |
left_is_blocked() |
检查左侧是否被墙挡住 |
right_is_clear() |
检查右侧是否有墙 |
right_is_blocked() |
检查右侧是否被墙挡住 |
beepers_present() |
检查当前位置是否有蜂鸣器 |
no_beepers_present() |
检查当前位置是否没有蜂鸣器 |
beepers_in_bag() |
检查背包中是否有蜂鸣器 |
no_beepers_in_bag() |
检查背包中是否没有蜂鸣器 |
facing_north() |
检查是否面向北方 |
not_facing_north() |
检查是否没有面向北方 |
facing_south() |
检查是否面向南方 |
not_facing_south() |
检查是否没有面向南方 |
facing_east() |
检查是否面向东方 |
not_facing_east() |
检查是否没有面向东方 |
facing_west() |
检查是否面向西方 |
not_facing_west() |
检查是否没有面向西方 |