转弯 · 机器人闯关
怎么改变方向?程序里又该怎么描述方向?
课程目录为什么需要它
真实的路很少是直的。要拐弯,小码得会转身。转身还会教你一个重要的习惯:时刻记住事物的状态 State(这里是小码面朝哪边),因为同一条指令在不同状态下的效果不一样。
直觉理解
站起来,面朝窗户。「向左转」是指你自己的左边,而不是房间的左边。转完以后,「前面」就指向了新的方向。
小码也是这样:
turn_left():原地向小码自己的左边转 90°。turn_right():原地向右转 90°。- 转完再
move(),就朝新的方向走。
看图里小码的眼睛:眼睛朝哪边,哪边就是「前」。
定义
状态 State
The state of a program is the information it remembers at a given moment, such as the robot's position and direction.程序的状态是它在某一时刻记住的信息,比如机器人的位置和朝向。
turn_left() 不会让小码移动,只改变状态里的「朝向」。
示例
拐个弯
在互动课里运行小码走到拐角,向右转面朝下,再走到旗子。
move()
move()
turn_right()
move()
move()逐步执行
- L1面朝东,走到中间那格。
(1,2) → - L2再走一格,到了拐角。
(1,3) → - L3向右转。小码还在拐角,但现在面朝南。
(1,3) ↓ - L4现在「前」是下方,所以向下走一格。
(2,3) ↓ - L5再向下一格:旗子。
(3,3) ↓
左转两次 = 掉头
在互动课里运行左转两次,小码就朝向反方向了。试试改成两次右转,结果有变化吗?
move()
turn_left()
turn_left()
move()
move()
move()逐步执行
- L1小码一开始面朝西(<),先向旗子走一格。
- L2第一次左转:面朝南。
- L3第二次左转:面朝东,和一开始相反。
- L4小码向东走,离旗子更远了。机器人照你写的做,而不是照你想的做。
- L6第 6 行撞墙:这个例子是故意写错的。改一改,让小码走到旗子。
常见错误
屏幕的左 vs 机器人的左
如果小码面朝下,turn_left() 之后它在屏幕上是面朝右的。把自己想象成站在小码的位置上。
转身不等于移动
turn_right() 之后小码还在原地,要走还得 move()。
小测验
1. 小码面朝东(右)。turn_left() 之后它朝哪边?
查看答案
答案:A
面朝东时,你的左手指向北。
2. 小码最后停在哪里?
move()
move()
turn_left()
move()查看答案
答案:B
在拐角向左转,小码面朝上(北),上面是墙。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出现在朝哪?
预测小码最后停在哪里。
- 改需求镜子里的路
下面的程序能走「向下拐」的路。新地图改成了「向上拐」,只要改一行。
- 从零写之字形
带小码沿着之字形的路走到旗子。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| State | 状态 | The information a program remembers at a moment, such as position and direction. |
| Sequence | 顺序执行 | Running instructions one after another, in the order they are written. |
| Bug | 程序错误 | A mistake in a program that makes it behave differently from what you intended. |