课程 1:Karel机器人


  1. Karel设计的目的: 在一个简单直观的环境里学习编程思想,而不被各类语言的复杂细节干扰,这样教授编程基础就更容易些了。
  2. 可视化编程:一种通过图形化界面和视觉元素来编写程序的编程方式,它让编程过程更加直观和易于理解。

    核心特征:
    • 图形化界面:使用图标、按钮、拖拽等视觉元素代替传统的文本代码
    • 即时可视化:程序执行过程通过动画、图形变化等方式实时展示
    • 直观操作:通过点击、拖拽等简单操作来完成编程任务
    在Karel课程中的体现:
    • 视觉化学习环境:通过图像展示Karel、World、Beeper、Wall等基本元素
    • 动画演示编程:观看Karel执行指令的动画过程,通过点击按钮执行指令
    • 可视化识别指令:通过观察Karel的行为理解指令功能
    可视化编程的优势:
    • 降低学习门槛:不需要先学习复杂的编程语法,通过图形界面直观理解编程概念
    • 即时反馈:立即看到代码执行的结果,可以直观发现和修正错误
    • 提高理解度:抽象概念变得具体可见,程序逻辑通过动画清晰展示
    常见的可视化编程工具:
    • Scratch:麻省理工学院开发的图形化编程语言
    • Blockly:谷歌开发的图形化编程库
    • Karel:斯坦福大学开发的机器人编程环境

    在Karel课程中,可视化编程让学生能够通过动画理解指令作用、通过点击按钮体验编程过程、通过观察Karel的行为学习编程逻辑,为后续学习更复杂的编程语言打下基础。

  3. Karel编程: 通过网站在线课程动画演示编程。先分析说明实现的功能,运行观察跟所描述的功能与实际是否一致。
  4. 点击导航栏的 Karel学习 按钮开始学习。共10个单元,每个单元有若干课时。内容简介如下:

    Unit1:认识 Karel
    • 课时1 认识四个基本元素 KarelWorldBeeperWall
    • 课时2 检测识别四个基本元素 KarelWorldBeeperWall
    Unit2:认识指令
    • 课时1 根据提示,可视化识别指令 move()(点击按钮无需输入)
    • 课时2 根据提示,可视化识别指令 move()(点击按钮无需输入)
    • 课时3 根据提示,可视化识别指令 turn_left()(点击按钮无需输入)
    • 课时4 根据提示,使用 move()turn_left() 两个指令让Karel执行一项简单的任务(简单迷宫)。
    • 课时6 根据提示,可视化识别指令 put_beeper()(点击按钮无需输入)
    • 课时7 根据提示,使用 move()put_beeper() 两个指令让Karel执行一项简单的任务(在第一行的中间放置一个beeper)
    • 课时8 根据提示,使用 move()pick_beeper() 两个指令让Karel执行一项简单的任务(捡起在第一行的中间放置的beeper)
    • 课时9 使用四个基本指令 move()put_beeper()turn_left()pick_beeper() 让Karel执行一项简单的任务(捡起台阶下的beeper,把它放置在台阶上).
    Unit3:编写程序
    • 课时1 观察代码并预测结果,点击“运行代码”验证(顺序执行)
    • 课时2 观察代码,该程序让Karel放置了一个方形的蜂鸣器
    • 课时3 修改程序使Karel移动三步(与 Goal 世界一致)
    • 课时4 修改程序使Karel移动到台阶顶部(与 Goal 世界一致)
    • 课时5 修改程序使Karel在第一行每个角落放蜂鸣器(与 Goal 世界一致)
    • 课时6 修改程序使Karel捡起第一行中间三个蜂鸣器(与 Goal 世界一致)
    Unit4:定义函数
    • 课时1 让Karel走简单迷宫,定义新函数 turn_right() 并在 main() 中调用
    • 课时2 完成 turn_around() 使 Karel 能后转
    Unit5:拾取报纸
    • 编写程序完成让Karel拾取报纸任务(与 Goal 世界一致)
    Unit6:For 循环
    • 课时1 认识 For 循环:通过For循环让Karel在每个角落放一个蜂鸣器。思考前置/后置条件
    • 课时2 修改代码让Karel放置 50 个 beeper(与 Goal 世界一致)
    Unit7:认识条件
    • 课时1 识别条件指令:facing_east()facing_west()facing_south()facing_north()
    • 课时2 识别条件指令:front_is_clear()not_facing_east()left_is_clear()beepers_present()
    • 课时3 识别条件指令:not_facing_south()front_is_blocked()no_beepers_present()right_is_blocked()
    Unit8:While 循环
    • 课时1 认识While循环。理解 beepers_present():拿起一堆蜂鸣器(数量未知)
    • 课时2 理解While循环。理解 front_is_clear():一直前进直到遇墙(世界多大都可)
    • 课时3 理解“栅栏柱错误”:放一排蜂鸣器但错过第一个
    • 课时4 嵌套循环:拾取一行所有蜂鸣器(角落数量未知)
    • 课时5 使用循环填满整个世界(与 Goal 世界一致)
    Unit9:If 语句
    • 课时1 使用 if/else 反转一行蜂鸣器
    • 课时2 理解If语句。编写代码让Karel帮助重建破碎的柱子。在第一行的每个蜂鸣器上方制作一列蜂鸣器;你的代码需要有通用性,能在不同的地图也能完成。
    Unit10:颜色指令
    • 课时1 认识颜色指令 paint_corner("blue")(接受 HTML 颜色名)
    • 课时2 理解颜色指令 paint_corner()
  5. Karel世界: 通过网站在线课程动画演示认识
    Karel
    Karel机器人
    world
    世界
    beeper
    蜂鸣器
    wall
    墙
  6. Karel基本指令: 通过网站在线课程动画演示以及动手操作(点击按钮无需输入代码)认识四个基本指令
    • move():让Karel向前移动一格
    • turn_left():让Karel向左转90度
    • pick_beeper():让Karel捡起当前位置的蜂鸣器
    • put_beeper():让Karel在当前位置放下一个蜂鸣器
  7. Karel条件指令: 通过网站在线课程动画演示认识条件判断指令,这些指令返回TrueFalse
    • 方向检测:
      • facing_east():检查Karel是否面向东方
      • facing_west():检查Karel是否面向西方
      • facing_south():检查Karel是否面向南方
      • facing_north():检查Karel是否面向北方
    • 路径检测:
      • front_is_clear():检查前方是否有路
      • front_is_blocked():检查前方是否被阻挡
      • left_is_clear():检查左侧是否有路
      • right_is_clear():检查右侧是否有路
      • right_is_blocked():检查右侧是否被阻挡
    • 蜂鸣器检测:
      • beepers_present():检查当前位置是否有蜂鸣器
      • no_beepers_present():检查当前位置是否没有蜂鸣器
    • 否定条件:
      • not_facing_east():检查是否不面向东方
      • not_facing_west():检查是否不面向西方
      • not_facing_south():检查是否不面向南方
      • not_facing_north():检查是否不面向北方
  8. 定义新函数: 在Karel编程中,可以通过组合已有的基本指令,定义新的函数,让程序更简洁、易读。
    • 使用 def 关键字定义新函数。
    • 例如:用 turn_left() 组合出 turn_right()turn_around()
    # 让Karel向右转,相当于左转三次
    def turn_right():
        turn_left()
        turn_left()
        turn_left()
    
    # 让Karel向后转,相当于左转两次
    def turn_around():
        turn_left()
        turn_left()

    例如:用 move()、front_is_clear() 组合出 move_to_wall()

    # 让Karel一直前进直到遇到墙
    def move_to_wall():
        while front_is_clear():
            move()
    注释:
    • 注释是对代码的解释说明,不会被程序执行。
    • 可以帮助自己和他人理解代码的作用和思路。
    • 在Python中,使用 # 开头表示单行注释。
    # 这是一个注释,解释下面代码的作用
    move()  # 让Karel前进一步

    良好的注释习惯可以让程序更易读、易维护。

  9. 文档字符串:
    def greet(name):
        """
        打招呼函数
        参数:name - 要打招呼的对象
        返回:无
        """
        print("Hello,", name)

    可以通过 help(greet)greet.__doc__ 查看文档字符串内容。

  10. 任务分解: 任务分解是将一个复杂问题拆解为若干个简单、易于实现的小步骤,有助于理清思路、降低编程难度。
    • 例如“填补坑洼”问题,可以分解为:

      1.移动到坑洞处

      2.通过放下一个蜂鸣器来填补坑洞

      3.前往下一个角落

    • 每个小步骤可以用一个函数或一段代码实现,逐步组合成完整解决方案。
    # 代码示例
    def main():
        move()
        fill_pothole()
        move()
    
    # 让Karel在坑洞处填补一个蜂鸣器
    def fill_pothole():
        turn_right()
        move()
        put_beeper()
        turn_around()
        move()
        turn_right()

    通过任务分解,可以让程序结构更清晰,便于调试和维护。

    任务分解的原则:

    • 自顶向下: 先整体分析任务,再逐步细化为小步骤或子任务。
    • 每步简单明确: 每个子任务应尽量简单、易于实现,避免一步包含过多操作。
    • 可复用性: 优先将重复出现的操作封装为函数,便于复用和维护。
    • 顺序与逻辑清晰: 分解后的步骤要有明确的执行顺序,逻辑关系清楚。
    • 迭代测试: 每完成一个小步骤或函数,及时测试,确保正确后再继续分解和实现。

    迭代测试有助于及时发现和修正问题,避免错误积累,提升编程效率和代码质量。