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

毕业关:任意迷宫 · 机器人闯关

能不能写一段程序,解开它从没见过的迷宫?

课程目录

为什么需要它

这是毕业关,要用上学过的全部内容:函数、while、if 和传感器。更重要的是,它引出算法 Algorithm 的概念:一个通用的方法,能解决一整类问题,而不只是某一道题。

直觉理解

在迷宫里迷路了?把右手贴在墙上,一直不要拿开,最后总能走出去(墙都连在一起的迷宫都行)。这就是右手法则 Right-hand rule。

对小码来说,「右手贴着墙」就是这样一步:

  1. 先右转(试着贴着墙走)。
  2. 前面挡住了,就左转,直到前面空。
  3. 向前走一步。

一直重复这一步,直到旗子。路上看到宝石就捡。

定义

算法 Algorithm

An algorithm is a finite, step-by-step method for solving a whole class of problems.
算法是一套有限的、一步一步的方法,用来解决一整类问题。

示例

法则的一步

在互动课里运行

运行一下,看小码怎样贴着右边的墙拐过弯。

def step():
    turn_right()
    while not front_clear():
        turn_left()
    move()

while not at_goal():
    step()
逐步执行
  1. L7还没到旗子:走一步。
  2. L2先试着右转。
  3. L3挡住了?左转,直到前面空。
  4. L5向前走一格。
  5. L7一直重复,拐过两个弯,直到旗子。

完整的迷宫

在互动课里运行

同一个算法,再加上捡宝石。它也能解开练习里的迷宫。

def step():
    turn_right()
    while not front_clear():
        turn_left()
    move()

while not at_goal():
    step()
    if on_gem():
        pick()
逐步执行
  1. L8一直循环到旗子。
  2. L9按右手法则走一步。
  3. L10每走一步都检查有没有宝石。

常见错误

原地打转

如果小码四面都是墙,while not front_clear(): turn_left() 就停不下来。这里的地图都保证有出口。

检查旗子太晚

把 at_goal() 放在 while 的条件里,小码一到就会停下。

小测验

1. 小码最后停在哪里?

def step():
    turn_right()
    while not front_clear():
        turn_left()
    move()

step()
step()
  1. A左下角:旗子上
  2. B右上角
  3. C最上面一行中间
查看答案

答案:A

2. 为什么说右手法则是一个算法?

  1. A它一步一步地解决一整类迷宫
  2. B因为它很短
  3. C因为它用了 while 循环
查看答案

答案:A

算法是通用的方法,而不是只针对一张地图的解法。

动手练习

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

  1. 预测输出跟着法则走

    预测走三步之后小码停在哪里。

  2. 改需求别忘了宝石

    这段程序能走到旗子,但把宝石落下了。改一改,让它在两张迷宫里都捡完宝石。

  3. 从零写毕业迷宫

    从零写出完整的迷宫程序:一个按右手法则走一步的 step() 函数,一个直到旗子的 while 循环,再加上捡宝石。3 个迷宫都要通关。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Algorithm算法A finite, step-by-step method that solves a whole class of problems.
Right-hand rule右手法则A maze algorithm: keep the wall on your right and follow it.