斯坦福JSKarel编程机器人使用介绍

斯坦福JSKarel编程机器人使用介绍

为了避免被编程语言固有的复杂性所困扰,有一个被称为卡雷尔(Karel)机器人的微型世界(microworld)的简化环境,可以让编程初学者从中学习理解编程的基本概念,而不必掌握大量无关的细节,让编程初学者更容易理解编程的要点和思维方式。

斯坦福Karel是一门面向初学者的教学编程语言。先看一个在 Karel世界里的走迷宫效果:

一、 Karel 简介

Karel 是一个非常简单的编程机器人,最早由是斯坦福大学的研究生理查德·帕蒂(Richard Pattis)研制推出,帕蒂以捷克剧作家卡雷尔·恰佩克(KarelČapek)的名字命名他的机器人为 Karel。可以通过一组指令指挥 Karel 在它的世界里执行某些任务。Karel 的编程语言的规则与其他更复杂的语言类似。不同之处在于 Karel 的编程语言非常小,复杂度较低,你可以通过它学习编程解决问题的本质。

本文介绍在Windows PC上如何下载和运行JSKarel版本。

JSKarel 的安装要点

JSKarel依赖Java,因此需要在计算机上安装JDK。

进入cs106j网站http://cs106j.stanford.edu 点击Software(软件)链接。

您将看到JDK的两个链接(针对32位版本或64位版本)。您应该单击适合您的Windows版本的版本。

因为我的PC安装的是64位的Windows10操作系统,因此选用64-bit版本JDK,执行典型安装,并按照给出的其余说明完成安装。

再下载JSKarel for Windows。这个不需要安装双击打开。

JSKarel 解释器窗口

双击JSKarel(JSKarel.jar)就启动了JSKarel解释器(interpreter)窗口分为四个部分,参见下图:

标题栏下,是菜单栏。

左上角,你可以看到卡雷尔的世界查看器,它可以让你看到Karel(卡雷尔)运行情况。进入编辑世界(Edit World)"状态时,你也可以在此区域用来创建一个Karel世界或编辑已存在的Karel世界。保存的文件扩展名为.w。

左下侧 是Console window(控制台窗口),允许您输入函数调用并观察它们如何影响Karel(卡雷尔)的世界。这是一个交互式窗口,在>提示符后,输入指令回车JSKarel解释器立即执行。

右侧是编辑器窗口,在这里您可以输入新程序并编辑现有程序。保存的程序文件扩展名为.k。世界文件的名称(以.w为扩展名)与程序文件(以.k为扩展名)的名称相匹配

底部包含控制条,其中包含一组图标------可称为控制按钮,允许您控制解释器的操作。

菜单栏中的一些命令项和控制条上的一些控制按钮功能重复。

二、JSKarel的使用

Karel 的世界

Karel 的世界由从西向东的大街(street)和从南向北的大道(avenue )所定义。大街和大道的交叉点叫作街角(corner )。Karel 只能被放置在一个街角,必须面对四个标准的罗盘方向之一(北、东、南、西)。在下面的示例世界中,Karel 在第1 大街和第1 大道的街角处,并且面向东方。

例子中可以看到Karel 的世界的其他几个组成部分。Karel 前面那个灰色的 菱形物体是一个蜂鸣器(beeper )。当Karel 和蜂鸣器在同一个街角时,才能听到这些声音。例如,图中此时,Karel 并未意识到蜂鸣器的存在,只有当Karel 移动到下一个街角时才会发现它。图中的实线是墙壁(wall )。Karel 的世界总是由边缘的墙壁包裹着,并且也可能包含内墙。

创建和编辑世界

你需要知道的另一件事------特别是如果你计划参加卡雷尔竞赛的话------是如何创建新的世界和编辑现有的世界。

使用"编辑世界"(Edit World)按钮会弹出编辑调色板(palette),其中包含一堆图标,允许您编辑当前世界。

•调色板右侧的大方块包含一对数字,允许您指定世界的大小。如果你点击这个图标,你可以输入一个新的尺寸,它由两个用x隔开的整数组成。第一个整数是道(列数)的数量;第二个整数是街(行数)的数目。改变世界的大小会删除所有方块和内墙,所以你需要在编辑之前设置世界的大小。最大的世界大小为50x50。

按钮允许您创建和删除墙壁。要创建墙壁,请选择绘制墙壁工具。如果你去地图上,点击街角之间的空间,墙壁将在这些空间创建。如果你以后需要拆除这些墙,你可以点击擦除墙工具,然后回到地图,以消除不需要的墙。

•五个蜂鸣器形状的工具允许您更改正方形上的蜂鸣器数量。空的蜂鸣器工具会在您选择的任何街角放置一个蜂鸣器。标有+和--符号的工具会添加一个蜂鸣器或从街角中删除一个。标有0和∞的工具将拐角处的蜂鸣器计数分别设置为0或无穷大。如果您选择其中一个工具,然后单击工具区域中的蜂鸣器袋图标,您可以调整Karel袋子中的蜂鸣器数量。

•四个卡Karel(卡雷尔)形状的工具允许您改变卡雷尔面对的方向。如果您需要将Karel移动到新的起始位置,请单击世界视图中的Karel并将其拖动到某个新位置。如果你需要把蜂鸣器放在Karel所在的街角,你必须先把Karel移到另一个街角,调整蜂鸣器的数量,然后把Karel移回来。

•各种颜色的方块可以让你画出卡雷尔世界的各个街角。

•当你完成后,你可以选择Save World工具将新世界保存到文件中。用 "不要保存世界"工具将更新后的世界返回给卡雷尔解释器,但不会将其保存在文件中。保存的文件名扩展名为.w。

上面介绍了控制条上"编辑世界"(Edit World)按钮的功能,下面介绍其他按钮的功能。

Reset按钮,完成Karel Console(Karel控制台)的重置。

控制条左侧的按钮是Load 按钮,它会弹出一个对话框,允许您选择要编辑的程序。装载.k扩展名的程序文件,也会自动加载.w扩展名的世界文件。世界文件的名称(以.w为扩展名)与程序文件(以.k为扩展名)的名称相匹配。

控制条右端的Compile按钮 触发编译过程。编译过程发现存在问题时,将突出显示这一行,并弹出错误对话框,例如:

这种类型的错误被称为语法错误,因为您所做的事情违反了语法规则。语法错误通常很容易发现,因为JSKarel解释器会帮您找到它们。

保存程序,可用Save按钮

在尝试运行程序之前,保存文件以便将更改记录在文件系统中。

运行程序

有两种方法可以在程序编译成功后运行它。

第一种方法是使用控制台窗口输入主函数的名称,后面跟着指示函数调用的空括号。

第二种方法通过单击Run按钮获得相同的结果。

在运行时,可能发生错误,称为逻辑错误。例如:

与语法错误不同,编译器对逻辑错误提供的帮助相对较少。你写的程序是完全合法的------遵循了语言的语法规则,只是没有做正确的事情------不能正确解决问题。

调试(Debugging

由于程序员的某些逻辑错误而不能给出正确结果的程序被称为有bug。消除这些错误的过程称为调试。调试是一种只有通过实践才能掌握的技能。在试图找到程序错误时,了解程序正在做什么比了解程序没有做什么重要得多。

通过观察程序的运行,就可以获得关于程序正在做什么的大量信息。"速度"按钮包括一个类似速度表的指针,您可以在按钮中拖动它来更改速度。如果你把拨盘向左转,卡瑞尔就会跑得更慢。如果你把它向右转,它会跑得更快。放慢卡雷尔的速度可能会有所帮助,这样你就可以更仔细地观察程序的运行情况。

一个更有用的调试策略是让Karel解释器一步一步地运行程序,这样你就可以看到它在做什么。单击编辑器窗口左侧的灰色区域,可以在某一特定行停止程序。如果该行对应于程序语句,Karel编辑器将在该行上放置一个断点(您可以通过再次单击来清除现有断点),这将迫使解释器在程序中遇到该行时停止。这时,您可以使用两种工具中的任何一种来逐步完成您的程序。

Step按钮使卡雷尔解释器前进一步,如果当前行是Karel的原始命令(primitive commands)之一,那么Karel只是执行它并等待下一个命令。如果当前行是您定义的函数,Karel会启动调用该函数的过程,然后在执行第一行之前再次停止。

Step Over按钮使卡雷尔解释器执行突出显示的行,如果当前行是Karel的原始命令(primitive commands)之一,则此按钮的行为与Step按钮完全相同。如果当前行是您定义的函数,那么Karel会在停止之前执行整个函数调用。其特性(feature)允许您一次执行整个函数。

console window (控制台窗口)的使用

Console window(控制台窗口),允许您输入函数调用并观察它们如何影响Karel(卡雷尔)的世界。这是一个交互式窗口,在>提示符后,输入指令回车JSKarel解释器立即执行。

在此窗口中可以运行Karel 的内置函数(每个内置函数也称为一条指令)和用户自定义函数。

JSKarel 程序设计

注释(comment)

注释是一些向读者解释程序操作的文本。在 Karel 中,注释以字符 /* 开头,并以字符 */ 结尾。如:

/* Comment text */

目前版注释文字不支持中文。

Karel 的内置函数

Karel 运行程序时执行的操作称为函数(function)。Karel 的内置函数有4个:

Karel 的活动有特定的限制。如果 Karel 试图做一些非法的事情,如穿过墙壁或拾起一个不存在的蜂鸣器,则会出现错误状态(error condition)。每当出现错误时,Karel 都会显示一条消息,说明哪里出错了,并停止执行程序。

使用库函数

对于最常见的操作,以一种方便其他程序重用的方式存储它们是有意义的。在计算机科学中,有用的函数和其他程序组件的集合称为程序库或库(library)。例如,turnRight函数------向右转和同样有用的 turnAround函数------旋转 180 度,都包含在一个名为 turns 的特殊 Karel 程序库,你可以在程序开始处简单地引入一行代码:

"use turns";

学习 Karel 编程就是要弄清楚如何使用 Karel 有限的操作集来解决特定问题。

解决一个编程问题,通常第一个任务就是弄清楚如何把整个问题分解成更小的部分。更小的部分称为子问题(subproblem),每个子问题都可以作为一个单独的函数来实现。这个过程叫作分解策略(decomposition)。分解策略是程序员用来管理复杂性的最强大的策略之一。

Karel 编程语言具有定义新函数的能力。当你有一个用于执行某些有用的任务(比如向右转)的操作序列时,可以给这个序列起个名称。用一个新名称封装指令序列的操作称为定义函数(defining a function),也称为用户自定义函数。定义函数的格式如下:

function name() {

函数体

}

函数定义以function开始,name是函数名称,可由你命名,{ }内是函数体,每行是一个Karel 的内置函数或库函数或另外的定义函数,行尾是分号(;)。用户一旦定义了函数,就可以像使用内置函数一样使用了。

Karel 编程语言的控制语句(control statement)

有以下两类:

  1. 条件语句(conditional statement)。条件语句指定程序中的某些语句仅在特定条件成立时才执行。在 Karel 中,使用 if 语句指定条件执行。

if (条件测试) {

当条件为真时执行的一些一句

}

或者

if (条件测试) {

当条件为真时执行的一些一句

} else {

当条件为假时执行的一些一句

}

可以被 Karel 测试的条件如下:

  1. 循环语句或迭代语句(iterative statement)。循环语句指定程序中的某些语句应该重复执行,形成程序员所谓的循环(loop)。Karel 支持两种循环语句,一种是 repeat语句,它允许你按固定次数重复执行一组指令;另一种是 while 语句,它允许你只要某些条件保持不变,可以重复执行一组指令。

repeat 语句如下所示:

repeat ( 重复的次数 ) {

需要重复执行的语句

}

while 语句的通用形式如下所示:

while ( 条件测试 ) {

需要重复执行的语句

}

至此,JSKarel语言的语法讲完了。现在你可以用来解决卡雷尔(Karel)机器人的微型世界(microworld)的问题了。当你面临一个复杂的编程问题时,找出如何将问题分解为多个部分通常是你最重要的任务之一。最有成效的策略之一被称为逐步求精法(stepwise refinement),它从问题的整体角度出发来解决问题。把整个问题分解成几个部分,然后解决每个部分,如果有必要的话,部分仍可以再进一步分解。

在解决问题过程中,不可避免的会遇到程序缺陷,也被称为程序有bug,消除这些错误的过程称为调试(Debugging)。

当你使用循环语句时,避免篱笆桩错误是很重要的,篱笆桩错误是由于没有认识到需要的 move 指令数比街角数少 1。

在计算机科学中,算法是一种解决方案策略。算法是该领域最重要的研究课题之一。解决特定问题通常需要相当大的创造力,设计解决方案策略的过程传统上称为算法设计(algorithmic design)。

现在,以开头演示的 Karel世界里的走迷宫效果为例介绍,其迷宫世界如下所示:

Karel 的工作是在迷宫的走廊里穿行,直到找到标示出口的蜂鸣器。然而,该程序必须足够通用,以解决任何无环路迷宫情况。

对于没有环路的任何迷宫(实际上迷宫只需要满足在 Karel 初始位置上没有环路环绕),你可以使用一个简单的策略,叫作右手法则(right-hand rule)。你可以把右手放在墙壁上,然后穿过迷宫,始终保持你的手不从墙壁上拿开。另一种表达这种策略的方法是一步一步地走迷宫,总是选择最右边的路径。在 Karel 中,右手法则的程序可以很容易地用一个函数实现:

cpp 复制代码
function SolveMaze() {
  while (noBeepersPresent()) {
    turnRight();
    while (frontIsBlocked()) {
      turnLeft();
    }
    move();
  }
}

在外层 while 循环的开始,Karel 向右转以检查该路径是否可用。然后内层 while循环向左转,直到前面没有阻挡。当这种情况发生时,Karel 就继续前进,整个过程一直持续到 Karel 到达标示迷宫终点的蜂鸣器处。

OK!

相关推荐
编程火箭车2 天前
【Java SE 基础学习打卡】24 循环结构 - while
java·编程基础·循环结构·while循环·java se·do-while循环·避免死循环
编程火箭车4 天前
【Java SE 基础学习打卡】22 分支结构 - if
java·流程控制·编程基础·if语句·分支结构·条件判断·新手避坑
编程火箭车12 天前
【Java SE 基础学习打卡】19 运算符(中)
java·java入门·运算符·编程基础·赋值运算符·复合赋值·自增自减
编程火箭车12 天前
【Java SE 基础学习打卡】20 运算符(下)
java·运算符·编程基础·逻辑运算符·条件判断·三元运算符·关系运算符
编程火箭车24 天前
【Java SE 基础学习打卡】15 分隔符、标识符与关键字
java·java入门·标识符·关键字·编程基础·分隔符·语法规则
Miqiuha2 个月前
计算机中浮点数的存储
ai编程·编程基础
FreakStudio3 个月前
10倍效率读代码!AI神器助你秒懂任何陌生项目(保姆级教程)
开发工具·编程基础·阅读代码
之之为知知7 个月前
数学笔记一:标量、向量和矩阵基本概念辨析
人工智能·笔记·线性代数·数学·职场和发展·矩阵·编程基础
Thanks_ks7 个月前
18 C 语言算术、关系、逻辑运算符及 VS Code 警告配置详解
编程基础·逻辑运算符·算术运算符·c 语言运算符·关系运算符·vs code 警告配置·代码质量提升
森哥的歌7 个月前
Python继承
python·继承·面向对象·编程基础·oop