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

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

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

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

一、Karel简介

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

JSKarel的安装要点

本文介绍的时Windows PC上如何下载和运行JSKarel。JSKarel依赖Java,因此需要在计算机上安装JDK。

若想省事可以到 https://download.csdn.net/download/cnds123/88440832 下载使用。

进入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 测试的条件如下:

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

repeat 语句如下所示:

repeat ( 重复的次数 ) {

  需要重复执行的语句

}

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

while ( 条件测试 ) {

  需要重复执行的语句

}

下面给出一个repeat 语句示例: 

先设计一个Karel走台阶的世界,用单击“编辑世界”(Edit World)按钮,在世界查看器区域设计,参见上图。

然后,在“程序编辑器”编写程序代码:

/* Karel takes the steps */import "turns";
function Move01(){move();repeat(3){Move02(); /* Calling custom functions */} 
}/* custom functions */
function Move02(){turnLeft();move();turnRight();move();
}

现在,你可以运行试试。

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

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

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

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

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

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

function SolveMaze() {while (noBeepersPresent()) {turnRight();while (frontIsBlocked()) {turnLeft();}move();}
}

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

OK!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/161840.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

限频差分探头N2060Apro

N2060Apro 差分探头提供一个安全的仪器给所有的示波器使用,它可以转换由高输入的差动电压进入一个低电压(≤7V),并且显示波形在示波器上,使用频宽高达 200MHz,非常适合大电力测试、研发、维修使用。差分探头输出标示是设计在操作示…

【六、docker中hyperf项目怎么进行跨域设置】

1、第一步就是新建跨域文件,即跨域中间件 跨域中间件的代码如下 <?phpdeclare(strict_types=1);namespace App\Middleware; namespace App\Middleware; namespace App\Middleware;use Hyperf\Context\Context; use Psr\Http\Message\ResponseInterface;

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

python代码调用文件或数据库中保存的脚本

这里采用的读取excel 1、先写一个测试方法 def demo5():import xlrdimport randomwb xlrd.open_workbook("code.xls")st wb.sheet_by_index(0)code st.cell_value(0, 0)list ["6666", asd, 1ad23, 1f23, 12g3, 1b3, 12r3]code2 st.cell_value(0, 1)…

ubuntu20.04安装FTP服务

安装 sudo apt-get install vsftpd# 设置开机启动并启动ftp服务 systemctl enable vsftpd systemctl start vsftpd#查看其运行状态 systemctl status vsftpd #重启服务 systemctl restart vsftpdftp用户 sudo useradd -d /home/ftp/ftptest -m ftptest sudo passwd ftptest…

蓝桥杯双周赛算法心得——三带一(暴力枚举)

大家好&#xff0c;我是晴天学长&#xff0c;枚举思想&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .三带一 2) .算法思路 1.通过Scanner读取输入的整数n&#xff0c;表示接下来有n个字符串需要处理。 2.使用循环遍历每个字符串&#xff1a;…

面试算法29:排序的循环链表

问题 在一个循环链表中节点的值递增排序&#xff0c;请设计一个算法在该循环链表中插入节点&#xff0c;并保证插入节点之后的循环链表仍然是排序的。 分析 首先分析在排序的循环链表中插入节点的规律。当在图4.15&#xff08;a&#xff09;的链表中插入值为4的节点时&…

【精选】目前我国网络安全人才市场状况

网络安全人才市场状况 本章以智联招聘多年来形成的丰富的招聘、求职信息大数据为基础&#xff0c;结合了奇安信集团 在网络安全领域多年来的专业研究经验&#xff0c;相关研究成果具有很强的代表性。对涉及安全人才 的全平台招聘需求与求职简历进行分析&#xff08;注&#xf…

c# xml 参数配置表的使用

使用简介 实际使用界面 配置表管理界面 进入 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

【Spring Cloud】网关Gateway的请求过滤工厂RequestRateLimiterGatewayFilterFactory

概念 关于微服务网关Gateway中有几十种过滤工厂&#xff0c;这一篇博文记录的是关于请求限流过滤工厂&#xff0c;也就是标题中的RequestRateLimiterGatewayFilterFactory。这个路由过滤工厂是用来判断当前请求是否应该被处理&#xff0c;如果不会被处理就会返回HTTP状态码为42…

linux部署gitlab

1. 配置yum源&#xff1a; vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabled1 2. 更新本地缓存 sudo yum install -y gitlab-ce 3. 安装相关依赖 yum …

从理论到实践,实时湖仓功能架构设计与落地实战

在上篇文章中&#xff0c;我们向大家解释了为什么实时湖仓是当前企业数字化转型过程中的解决之道&#xff0c;介绍了实时计算和数据湖结合的应用场景。&#xff08;“数据驱动”时代&#xff0c;企业为什么需要实时湖仓&#xff1f;&#xff09; 在这篇文章中&#xff0c;我们…

Java模拟双向链表,增删操作

public static void main(String[] args) {ArrayList arrayList new ArrayList();Node zhangsan new Node("张三");Node lisi new Node("李四");Node wanger new Node("王二");//模拟双向链表&#xff0c;将表中元素依次连接起来zhangsan.ne…

米哈游、复旦发布,具备感知、大脑、行动的大语言模型“智能体”

ChatGPT等大语言模型展示了前所未有的创造能力&#xff0c;但距AGI&#xff08;通用人工智能&#xff09;还有很大的距离&#xff0c;缺少自主决策、记忆存储、规划等拟人化能力。 为了探索大语言模型向AGI演变&#xff0c;进化成超越人类的超级人工智能&#xff0c;米哈游与复…

汽车上的A/C按键是做什么用的?

汽车上的A/C按键是做什么用的? 汽车上的a/c 键是空调制冷开关。A/C是空调的缩写&#xff0c;它的全称是air condition&#xff0c;理解为空气调节。它通过空调压缩机的不同运转方式来达到制冷或制暖的目的。 打开a/c 按键之后&#xff0c;因为空调压缩机是靠发动机工作的&…

Linux上Docker的安装以及作为非运维人员应当掌握哪些Docker命令

目录 前言 1、安装步骤 2、理解镜像和容器究竟是什么意思 2.1、为什么我们要知道什么是镜像&#xff0c;什么是容器&#xff1f; 2.2、什么是镜像&#xff1f; 2.3、什么是容器&#xff1f; 2.4、Docker在做什么&#xff1f; 2.5、什么是镜像仓库&#xff1f; 2、Dock…

求臻医学:实体肿瘤FDA/NMPA新获批抗癌药物/适应症盘点

肿瘤分子靶向治疗发展迅速&#xff0c;随着研究的深入开展&#xff0c;多款靶向药物及免疫药物获批。求臻医学根据美国食品药品监督管理局&#xff08;FDA&#xff09;公布信息、中国国家药品监督管理局&#xff08;NMPA&#xff09;发布的药品批准证明文件&#xff0c;以及各公…

尚硅谷Flink(二)DStream API

目录 &#x1f320;不会点 &#x1fa90;DataStream API ​编辑 &#x1f320; 执行环境 创建执行环境 执行模式 触发程序执行 &#x1f320;源算子 准备基础类型 从集合中读取数据 从文件读取数据 从 Socket 读取数据 从 Kafka 读取数据 &#xff08;没学过&#xff09; …

2.2 如何使用FlinkSQL读取写入到文件系统(HDFS\Local\Hive)

目录 1、文件系统 SQL 连接器 2、如何指定文件系统类型 3、如何指定文件格式 4、读取文件系统 4.1 开启 目录监控 4.2 可用的 Metadata 5、写出文件系统 5.1 创建分区表 5.2 滚动策略、文件合并、分区提交 5.3 指定 Sink Parallelism 6、示例_通过FlinkSQL读取kafk…

【Python从入门到进阶】39、使用Selenium自动验证滑块登录

接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能&#xff0c;首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…