最简单的Karel程序使用文本来指定应该在程序执行时执行的一系列内置命令 run 。考虑下面的简单卡雷尔计划。左边的文字是程序。卡雷尔的世界状态如右图所示:
按“运行”按钮执行程序。程序通常写在一个名为的特殊应用程序中 综合发展环境 (IDE)和大多数Karel程序都是在称为PyCharm的IDE中编写的。像IDE一样,该阅读器也具有执行程序的能力,以帮助您看到你学习的东西是如何工作的。
该计划由几个部分组成。第一部分包括以下几行:
#文件:FirstKarel.py #----------------------------- #FirstKarel程序定义了“ main ” #函数带有三个命令。这些命令导致 #卡雷尔(Karel)以move前进一个方块,拿起锥体 #,然后在下一个拐角处move 。
这些行是一个例子 评论 ,它是简单的文本,旨在向读者解释程序的操作。 Karel和Python中的注释均以字符开头 # 并包括该行的其余部分。在一个简单的程序中,由于程序的效果显而易见,因此广泛的注释似乎很愚蠢,但作为记录更大,更复杂程序的设计的一种手段,它们极为重要。该程序的第二部分是该行:
from 卡雷尔.stanfordimport *
该行要求包含来自的所有定义 卡雷尔.stanford 图书馆。该库包含编写Karel程序所需的基本定义,例如标准操作的定义 move() 和 选择锥体() 。因为您总是需要访问这些操作,所以您编写的每个Karel程序都会在您编写实际程序之前包含此导入命令。
Karel程序的最后部分包含以下函数定义:
def main():
move()
选择锥体()
move()
这些行代表新的定义 功能 ,它指定了响应命令所必需的步骤顺序。就像在 第一个卡雷尔 在程序本身中,函数定义包括两个部分,可以分别考虑:第一行构成函数头,紧随其后的缩进代码是函数体。如果您现在忽略主体,则函数定义如下所示:
def main():
函数定义的主体
函数标题中的第一个单词, def ,是Python语法结构的一部分。它表示您正在创建一个新功能。标题行上的下一个单词指定新函数的名称,在这种情况下为 main 。定义函数意味着Karel现在可以使用该名称响应新命令。的 main() 命令在Karel程序中起特殊作用。当您启动一个Karel程序时,它将创建一个新的Karel实例,将该Karel添加到您指定的世界中,然后发布 main() 命令。程序的主体定义了run的效果。 main() 功能,这是机器人将按顺序执行的一系列命令。例如, main() 的功能 第一个卡雷尔 程序是:
move()
选择锥体()
move()
因此,如果世界的初始状态与第1章中给出的示例匹配,则Karel首先将move向前移入包含锥体的角,拾取该锥体 ,最后将move向前移至墙之前的角,如图所示。以下的前后图:
的 第一个卡雷尔 上面定义的程序到目前为止还没有做很多事情。让我们尝试使其更加有趣。假设目标不是简单地让卡雷尔拿起锥体而是move的锥体从其在第2列和第1行的初始位置到窗台的中心。因此,您的下一个任务是定义一个新的Karel程序,该程序可以完成下图中所示的任务:
新程序中的前三个命令(即move转发,拾取锥体 ,然后move到达窗台的命令)与以前相同:
move()
选择锥体()
move()
从这里开始,下一步是到turn left开始爬壁架。该操作很容易,因为Karel有一个 turn_left() 在其标准曲目中命令。执行一个 turn_left() 在上述命令序列的末尾,该命令使Karel在第1行和第3列的角处朝北。如果Karel然后执行 move() 命令,它将向北move到达以下位置:
从这里开始,接下来要做的是将Karel turn right ,使其再次朝东。从概念上讲,此操作就像将Karel升级到turn left一样容易,但存在一个小问题:Karel的语言包括 turn_left() 命令,但没有 turn_right() 命令。这就像你买了经济模型,现在发现它缺少一些重要的功能。
此时,您将有第一个机会像程序员一样开始思考。您只有一组命令,但并不完全是您需要的一组命令。你能做什么?你能达到一个效果吗 turn_right() 命令仅使用您拥有的功能?答案是肯定的。您可以通过向左转3次来实现向右转的效果。左转三圈后,Karel将朝着所需方向。从这里开始,您需要做的就是将Karel编程到move到窗台中央,放下锥体 ,然后move到最终位置。这是完成整个任务的程序的完整实现: