在20世纪70年代,一位名叫Rich Pattis的斯坦福大学研究生决定,如果学生能够在一个简单的环境中学习基本思想,而不受大多数编程语言特有的复杂性的影响,那么教授编程的基础将会更容易。 Rich设计了一个入门编程环境,学生可以在其中教授机器人来解决简单的问题。这位机器人在捷克剧作家之后被命名为卡雷尔 卡雷尔Čapek ,他的1923年戏剧RUR( 罗森的通用机器人 )将机器人这个词用于英语。
机器人卡雷尔非常成功。 Karel已被用于世界各地的计算机科学入门课程,并已向数百万学生讲授。斯坦福大学的许多学生都学习了编程如何与Karel一起工作,而且它仍然是斯坦福大学使用的编码的温和介绍。
卡雷尔是一个生活在一个非常简单的世界中的非常简单的机器人。通过为Karel提供一组命令,您可以指示它在其世界中执行某些任务。调用指定这些命令的过程 程序设计 。最初,Karel只了解极少数预定义命令,但编程过程的一个重要部分是教授Karel扩展其功能的新命令。
卡雷尔计划具有大致相同的结构,涉及相同的基本要素 蟒蛇 , 一个主要的 编程语言 。关键的区别在于Karel的编程语言非常小,因此细节很容易掌握。即便如此,您会发现解决问题可能具有挑战性。
从卡雷尔开始,您可以从一开始就集中精力解决问题。解决问题是编程的本质。而且因为卡雷尔鼓励想象力和创造力,所以你可以在此过程中获得很多乐趣。
卡雷尔的世界由水平run行(东西向)和run垂直行(东西向)定义。行与列的交点称为角。卡雷尔(Karel)只能定位在拐角处,并且必须面向四个标准罗盘方向(北,南,东,西)之一。示例卡雷尔世界如下所示。卡雷尔(Karel)在这里,位于第一列和第一列的转角处,朝东。
在此示例中可以看到卡雷尔世界的其他几个组成部分。 Karel前面的对象是锥体 。如Rich Pattis的书中所述, 锥体 s是“发出安静蜂鸣声的塑料锥体”。如果Karel位于同一角,则只能检测到锥体 。图中的实线是墙。墙壁是卡雷尔世界的屏障。卡雷尔(Karel)不能穿过墙壁,而必须绕过墙壁。卡雷尔的世界总是被边缘的墙壁所包围,但是根据卡雷尔需要解决的具体问题,这个世界可能具有不同的维度。
卡雷尔从工厂发货时,它会响应很少的命令。让我们尝试一下命令。使用下面的按钮获取与“目标”匹配的“世界”:
这是每个命令的作用:
| 命令 | 描述 |
|---|---|
move() | 要求卡雷尔(Karel) move前进一格。卡雷尔无法回应 move() 命令是否有阻挡它的方式的墙。 |
turn_left() | 要求卡雷尔向左旋转90度(逆时针)。 |
选择锥体() | 要求Karel从角落捡起一个锥体 ,并将锥体存储在其锥体袋中,该袋可容纳无限数量的锥体 s。卡雷尔无法回应 选择锥体() 命令,除非当前拐角处有锥体 。 |
放锥体() | 问卡雷尔采取锥体从其锥体包,把它倒在当前的弯道。卡雷尔无法回应 放锥体() 命令,除非有锥体 S IN的锥体袋。 |
每个命令中出现的一对空括号是Karel和Python共享的通用语法的一部分,用于指定命令的调用。最终,您编写的程序将在括号之间的空格中包含其他信息,但是这些信息不是Karel原始世界的一部分。因此,这些括号在标准Karel程序中将为空,但您仍必须记住将其包括在内。
如果Karel试图做一些非法的事情,例如穿过墙壁或捡起不存在的锥体 ,则会发生错误情况。
卡雷尔的命令不是自己执行的。相反,您需要将它们合并到Karel程序中。您将有机会在第2章中看到一些简单的Karel程序!