人人都能学编程
English 开始学习
课程 1 · 零基础入门第 2 课 / 共 10 课免费阅读

转弯 · 机器人闯关

怎么改变方向?程序里又该怎么描述方向?

课程目录

为什么需要它

真实的路很少是直的。要拐弯,小码得会转身。转身还会教你一个重要的习惯:时刻记住事物的状态 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()
逐步执行
  1. L1面朝东,走到中间那格。(1,2) →
  2. L2再走一格,到了拐角。(1,3) →
  3. L3向右转。小码还在拐角,但现在面朝南。(1,3) ↓
  4. L4现在「前」是下方,所以向下走一格。(2,3) ↓
  5. L5再向下一格:旗子。(3,3) ↓

左转两次 = 掉头

在互动课里运行

左转两次,小码就朝向反方向了。试试改成两次右转,结果有变化吗?

move()
turn_left()
turn_left()
move()
move()
move()
逐步执行
  1. L1小码一开始面朝西(<),先向旗子走一格。
  2. L2第一次左转:面朝南。
  3. L3第二次左转:面朝东,和一开始相反。
  4. L4小码向东走,离旗子更远了。机器人照你写的做,而不是照你想的做。
  5. L6第 6 行撞墙:这个例子是故意写错的。改一改,让小码走到旗子。

常见错误

屏幕的左 vs 机器人的左

如果小码面朝下,turn_left() 之后它在屏幕上是面朝右的。把自己想象成站在小码的位置上。

转身不等于移动

turn_right() 之后小码还在原地,要走还得 move()。

小测验

1. 小码面朝东(右)。turn_left() 之后它朝哪边?

  1. A北(上)
  2. B南(下)
  3. C西(左)
查看答案

答案:A

面朝东时,你的左手指向北。

2. 小码最后停在哪里?

move()
move()
turn_left()
move()
  1. A旗子上
  2. B第 4 行撞墙
  3. C在拐角,面朝下
查看答案

答案:B

在拐角向左转,小码面朝上(北),上面是墙。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出现在朝哪?

    预测小码最后停在哪里。

  2. 改需求镜子里的路

    下面的程序能走「向下拐」的路。新地图改成了「向上拐」,只要改一行。

  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.