karel能力拓展训练_第1页
karel能力拓展训练_第2页
karel能力拓展训练_第3页
karel能力拓展训练_第4页
karel能力拓展训练_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言卡雷尔是一个牛.活在非常简单的世界中的非常简单的机器人。在它的世界中,你可以通 过给卡雷尔-组命令,直接让卡雷尔执行某些任务。卡雷尔的世界被定义为水的街(东西方向),垂直的道(南北方向),街和道的交点被 称为街角。卡雷尔只能定位在街角,而jj.只能面对卩l|个标准罗盘方向(北,南,东,西)。 一个简单的卡茁尔世界显示如下,卡茁尔h前位于第一人街和第一人道相交的街角,而朝东 边。在上图屮,我们还可以看到卡雷尔世界中其他的几件尔丙。卡雷尔前面的物体是个蜂鸣 器,只有当卡雷尔和蜂鸣器位于m个街角上的吋候,卡雷尔冰能感知这个蜂鸣器。图中的 实线足墙襖,墙足卡雷尔世界的屏障,卡雷尔不能穿过墙娥,而以

2、能在墙的周边行走。卡雷 尔的世界总足被作为边界的墙包围起来,似足,随着卡雷尔需要解决不同的具体问题,卡雷 尔的世界也有不的尺寸。2概述2.1背景介绍2.1.1karel 介绍在二十世纪七十年代,一位名字叫rich pattis的斯坦福研究生觉得,在编程基础的教学中,如果学生町以在某种简单的环境中,摆脱大多数编程语言杂的特性,学习木的 编程思想,可以取得更好的效果。麻省理工seymour paperf s logo计划的成功,启发了 灵感,rich设计了一个入门编程环境,(这个编程环境)让学生教一个机器人来解决简单的 问题。这个机器人名字叫卡雷尔。因为捷兑剧作家karelcapek在1923年公

3、演了 r. u. r (rossum s universal robots)后,为萊语带来广机器人这个英语单同robot。机器人卡雷 尔相当成功。卡雷尔被用于全国的计算机科学入门课程,到丫 rich的教科15畅销超过10 万份的地步。许多学习cs106a的学生,通过没计卡雷尔的行为,学会了如何让程序工作在 20世纪90年代中期,我们曾经使川的机器人卡雷尔校拟器停止工作了。似是,我们很快就 得到了一个thetis编译的卡雷尔升级版供那时使川。似是,一年以前,cs106a课稅转向到 java,卡雷尔再次从课堂上消失了。虽然在过去的三个季度,巾于卡雷尔的离去产生的空白, 已经完全被nick pari

4、 ante的binky world填但现在是带卡雷尔回來的时候了。新完工 的卡雷氺设计得完全兼容java和eclipse编程环境,这就意味着,你将在这门课程的开始, 就可以练习使用eclipse的编辑器和调试器。卡雷尔是一个生活在非常简单的世界中的非常简单的机器人。在它的世界中,你可以通 过给卡雷尔一组命令,直接让卡雷尔执行某些任务。指定这些命令的过程称为编程。初, 卡雷尔只明內极少数预定义的命令,但编程(学习)过程的一个重要内容,就是教卡雷尔可 以扩展它的能力的新命令。当你谋划让卡雷尔执行某项任务的时候,你必耑川非常精确的方 式写出这些必需的命令,以便这个机器人能够正确的理解你交待它做的事情

5、。(另外)特别(注意的)足,你写的柷序 必须遵守语法规则,仑规定了什么样的命令和语言形式是合法的。二者合在一起,预定义的 命令和语法规则(一起)定义了卡雷尔编程语言。卡雷尔编程语言被设计的尽可能类似于 java语言,这样便于顺利过渡到(java)这门你将时刻使用的语言上。卡雷尔程序具冇和 java程序相同的结构,也涉及到相同的®木元素。敁关键的区别是,卡雷尔的编程语言非 常的小,从这个意义fc讲,只具冇非常少的命令和规则。它非常容芴,例如,教授卡雷尔语 言只需要几个小时,这也正是我们在cs106a中做的。在(课程)结束的时候,你将知道卡 雷尔能做的一切事情,以及如何在一个程序中实现它

6、。这些细节是容易掌握的。即便此,你 会发现,(耑要)解决的闷题可能是极其具挑战性的。解决问题是编程的木质;在这一学习 过程中,对规则的关注是次要的。在s杂的语言里,如java,有许多的细节,这些细节往 往成为学习的课程的重点。当这种情况发屯吋,对解决问题的更关键的东西,往往会在得到 一片混乱中失去。通过从卡雷尔入手开始学习,你可以在一开始的吋候,就把精力集中在解 决问题上面。2.1.2karel 语言当卡雷v出厂的时候,它只能响应非常小的命令集:moveo要求卡雷尔向前推进一步。当一堵墙挡在卡雷尔而前的时候,卡雷尔不能响应 move ()这个命令。turnleft ()要求卡雷尔向左转90度(

7、逆时针转动)。pickbeepero要求卡雷尔捡起街角上的蜂鸣器,把这个蜂鸣器放到它的蜂鸣器收藏包 里,这个包可容纳无限多的蜂鸣器。除非这个蜂鸣器恰好在卡雷尔所在的街角上,卡雷尔不 能响应这个pickbeepero命令。putbeeper ()要求卡雷从蜂鸣器收藏包里拿出一个蜂鸣器,放在卡w尔所在的街角 上。除非卡雷尔的蜂鸣器收藏包麗冇蜂鸣器,卡雷尔不能响应这个putbeeper()命令。出现 在这些命令dflf的一对空括兮,是卡雷尔和java相同语法的一部分,通过这个(一对空折 号),來指定命令的调川。最终的吋候,在你写的(java)积序里,空拈号之间会包含一些 额外的内矜,似足,这些额外的

8、内界并不是卡雷尔原始世界的一部分。将这些拈号之间留空, 才是标准的卡雷尔程序,虽然拈号里什么也没奋,似你一定要记着把它们写在命令里。耑要 特别注意的是,这儿个命令对卡雷尔的行为进行了限制。如果卡雷尔试图做些非法的举动, 像穿墙或者捡起一个不存在的蜂鸣器,一个错误就发生了。在这时,卡雷尔会显示一条错误 的信息,同时拒绝执行剩余的命令。2.1.3karel与面向对象模式在卡雷尔被引入的二十世纪七十年代,采用的计算机编程方法是过程模式。在很大程度 上,过程编程足把一个大规模的程序问题分解为小的过程,这些吏易于管理的,定义r必要 操作的单元称为过程。这种把程序分割成小单元的谋划,是编程风格的重要组成部

9、分,而现 代语言例如java,强调了不同的编程模式,叫面向对象模式。在面向对象模式下,程序员的 注意力被从关注特定操作的过程单元中转移ill来,侧重到:为被称为对象的单元,杣象建模 的行为上。在编程语言中,“对象”冇时和真实世界的物理对象相对应,但更多的时候是抽 象的概念。足真实对象的核心特性或代表(事物)整体的一种抽象。面向对象模式的主要优 势之一足,它鼓励程序员认识到一个对象的状态和其行为的基本关系。一个对象的状态,涉 及到一组和该对象相关,并可能随时间而改变的特性。一个对象可以被它在空间的位置,它 的颜色,它的名字,k它一些主要特性来特别指定出来。一个对象的行为是指它在它的世界 中响应事

10、件或响应来自其它对象的命令的方法。在刖向对象编程的语言中,触发指定对象的 行为的通用词叫消息一message (也然从卡雷尔的上下文上看,命令一command这个词at能 更让人明白点)。对一个消息的响应,通常需要改变一个对象的状态。例如,如果定义一个 对象状态的特性的之一是它的颜色,它就可以通过响应setcolor (blue)这条消息把它的颜 色改变成蓝色。在许多方面,卡雷v代表丫讲述“側向对象方法”的理想环境。也然实际上 没冇人建立一个机器来执行卡雷汆,但却非常容易把卡雷水想象为一个真实世界的对象。卡 雷尔毕竟是一个机器人,机器人是真实世界存在的实体。定义卡雷尔状态的特性是它在它的 世界

11、屮的位置,它面对的a向,在它蜂鸣器收藏包里的蜂鸣器数0。定义卡雷尔行为的是它 响应的 move(), turnlefto, pickbeepero,和 putbeeper()这些命令。move()命令可以 改变卡的位置,turnlefto命w以改变它面朝的方向,剩下的两个命令,会同时影响 到收藏包里的蜂鸣器数s和当前街炻上的蜂鸣器数s。卡雷尔的环境还提供了而向对象编程 的核心概念之一一一个冇用的框架。无论卡雷尔还是java, 一个对象和一个类之间概念的区 分是很冇必要的。鉍容易理解这种分别的方法足把类认为是一些对象(井同)的模式或模板,这些对象都冇一个井同的行为和状态属性的集合。在你将看到的下

12、一章中,在卡雷尔程序里出现的“karel"这个同,代表一个完整的机器人的类,这个类知道怎么去响应move(), turnleft (), pickbeepero,和putbeeper()这些命令。但只要 你在卡雷尔的世界里有了一个实际的机器人,那么,这个机器人就是一个对象,这个机器人 它代表y卡雷尔这个类的特定实例。尽管在cs106a课程麗,你将不会冇机会去做这样一个 类,但冇一个以上的卡雷尔类的实例,运行在同一个世界里,还是有可能的。即使只有一个 单独机器人的吋候,在你的脑海里,深刻记得类和对象足不同的概念,还足很重要的。2.2课程设计题目karel机器人程序设计2.3课程设计目的

13、在卡雷尔简单的世界中,我们川'以通过给卡雷尔一组命令,直接让卡雷尔执行某些任务。 指定这些命令的过程称为编程。最初,卡雷尔只明白极少数预定义的命令,但编程(学习) 过程的一个重要内界,就是教卡雷尔可以扩展它的能力的新命令。当我们谋划让卡雷尔执行某项任务的吋候,我们必须川非常精确的方式写出这些必耑的 命令,以便这个机器人能够正确的理解我们交待它做的事情。另外,我们写的柷序必耑遵守 语法规则,它规定了什么样的命令和语言形式是合法的。预定义的命令和语法规则合在一起 定义了卡雷尔编程语言。在复杂的语言甩,如java,细节往往成为学习课程的重点。当这种情况发生时,对解 决问题更关键的尔西,往往会

14、在我们忽略。从卡雷尔入手学习编程,讨以让我们迕一开始的 时候,就把精力集中在解决问题上而。而且,卡雷尔的学习鼓励想象力和创造力,在学习过 程中,我们会收获不少乐趣。2.4开发环境斯坦禍提供eclipse jre-6u2-windows-i586-p. zip 卡雷尔机器人开发包2.5设计目标2.5.1地图寻宝在地图的某个位置上放置一个蜂鸣器,也就是karel的宝藏。karel从起始位置出发, 叫处寻找宝藏。找到宝藏后跳出显示“我找到宝藏啦!哦也! k面我要把宝藏带回家。”的 对-话框,然后karel捡起宝藏,回到家,放下宝藏。2.5.2排序如图所示足卡雷尔机器人初始运行环境图:c.m-;/.!

15、 ssiorstart proam |load worldnew worldedit worldslow 丄j2j fast 參 *參#參<><> f口2?234se7teio由阁可知卡雷尔机器人刚开始时处于右下角的地方(1,1),在它的前方讨以看到有5 个由鸣蜂器的组成的塔,卡雷尔机器人所耍做的是,以此将所有的塔的鸣蜂器捡起,在每个 塔的鸣蜂器被捡起的是偶耍记录每个塔所有的呜蜂器的数s:, 4:捡起所有的塔后就耍对搭的 高度进行排序。然后卡雷尔机器人耍做的就是根据排序然后将搭再重新绘制出来,从左至a 从低到高依次绘制岀来,绘制搭的过程其实就是耍根据塔的高度来放贾蜂呜器

16、的数量。最后 返回原点(l,l)绘制程序结柬的标志,一个绘制一个黑色的方格。3. 概要设计3.1相关知识3.1.1 karel基础指令karel®础指令有卩4个:1) move()耍求卞雷尔向前推进一步。当一堵墙挡在卡雷尔面前的吋候,卡雷尔不能响 应move()这个命令;2) tumleft()要求卞雷尔向左转90度(逆吋针转动);3) pickbeeper()要求卡雷尔捡起街角上的蜂鸣器,把这个蜂鸣器放到它的蜂鸣器收藏 包里,这个包可料纳无限多的蜂鸣器。除非这个蜂鸣器恰好在卡霜尔所在的街角上,否则卡 雷尔不能响应pickbeeper()命令;4) 耍求卞雷尔从蜂鸣器收藏包里拿出一个

17、蜂鸣器,放在卞雷乂所在的街角上。除非卞 雷尔的蜂鸣器收藏也里有蜂鸣器,否则卞雷尔不明响应putbeeper()命令。3.1.2 karel可判断的环境条件测试条件相反的测试条件判断的内容fronti$clcar()面前无墙返回肯定值frontisblockcd()面前被挡返回肯定值前是否育墙leftisclear()左面无墙返卜1肯定位leftlsblockedo左面被挡返m肯定位左面是否奋墙rightisclcar()右面无墙返回肯定值righti$blocked()右面被挡返回肯定值彳f面是杏有墙beeperspresent()所a位置有方块返回肯 定值nobeeperspresent()

18、所迕位置无方块返回肯定 值所在位a是否有方块beepersinbago 包里h前存方块返m肯定值nobeepersinbago 包里h前无方块返回肯定值包里足否奋方块facingnorth()而朝北返回肯定值nofacingnorth()没有而朝北返m肯定伉是否面朝北facingeast()面朝东返回肯定值nofacingeast()没有面朝东返冋肯定值是否而朝东facingsouth()面朝南返回肯定值nofacingsouth()没有面朝南返回肯定值是否面朝南facingwest()面朝西返回肯定值nofacingwest()没冇面朝西返回肯定值是否而朝两3.2地图寻宝设计3.2.1kar

19、el寻宝算法对于寻宝,可以使川一个被称为“右手规则”的简单策略,在入口处把右手放在旁边的 墙上,通过保持右手始终在墙上,就能找到宝藏。这个策略的另外一种表达就是在寻宝过程 中,每走一步,总是靠最右侧的路走。右手规则:先判断karel右边是否有障碍物,没有,则右转,前行;若右边有障碍物, 则判断前方是否有障碍物,如果没有,则前行;若前方有障碍物,则判断左边是否有障碍物, 如果没有,则左转前行;否则,转身前行,继续重复此右手规则,直到找到宝藏。3.2.2地图寻宝主程序流程3.3排序设计排序设计大致已经在设计目标中进行过阐述,这里就不再赘述。4. 详细设计4.1地图寻宝设计藏宝karel所在的地图如

20、下:mymdzefilestart prooram |load worldnew worldedit worldslow> 1 fast4.2地寻宝算法4.2.1地图寻宝流程10111213 h id 101718 iq 204.2.2地图寻宝算法实现/寻宝算法public void search()while(nobeeperspresent() ) turnright();while(frontlsblocked() turnleft();move();4.3排序算法4.3.1捡起塔要捡起塔苁实你就是要将处于一排的所有蜂鸣器都捡起來,并且在每次的捡起的时候还 要记录已捡的蜂鸣器的数量

21、,在塔被捡完后所记朵的蜂鸣器数量即为塔的高度。根据设计的 目标中共有5个要捡起的塔,因此我们首先要初始化一个数组來存储塔的数量:nt collect= new int5;凼于每个塔都要被捡起所以我们可以定义一个函数int collectonetowno用于捡起每 个塔,并且以捡起的鸣蜂器的数量作为返回值,具体定义如下:public int col 1ectonetown() int sum=0; turnkeft ();while(beeperspresent ()pickbeeper (); sum+十;if(fronttsclear() move ();return sum;在每一个塔都被

22、后捡起后,机器人会停留在每个塔的最高的地方,然后卡雷尔机器人必 须要回到塔的底端,山于每个塔的返回塔的底端的过程是一样的所以我们可以将这个过程封 装成两个函数来解决w题,一个转向函数turnaround()以及捡起过程中的退回底端的函数 fronttospaceo,两个函数的月、体定义过程如卜:public void turnaround() turnkeft (); turnkeft ();public void fronttospaceo whi 1 e(fronttsclear () move ();turnkeft ();可以从函数的定义看出转向函数其实就是让机器人连续的转向左两次,而

23、 fronttospaceo函数就是要转向后的机器人一直前进直到碰到墙壁p停止前进,然后转向左 与开始的方向一样。在所有的塔都被捡起p就是要对塔的高度进行排序。4.3.2按序重新绘塔在前面的过程都完成盾,现在卡雷水机器人就在图的右下角的地方,方向与初始方向一 样,那么现在我们就要机器人要向左转向进行绘塔的部分同样可以按照进行过程来知将 过程分为两个过程,一个就是按照排序绘制塔,艽实就是设置蜂鸣器,在设置完蜂鸣器后就 要回到塔底端来。我们将绘制塔卨的过程封裝成带参数的void putsumbecper (int sum)函数, 具体的定义过程如下:public void putsumbecper

24、(int sum)while(sum>0)put beeper (); moveo ; sum;然后就足回到塔底的函数backtospaceo,不过在完成之前要先调用前而我们已经定义 /的一个函数turnaround(),具体的backtospace ()定义如下: public void backtospace() while (front isclearo) move ();turnright();可以看出与fronttospaceo很相似不过不同的地方就是在机器人冉碰到墙壁沿要向;/f 转向而不是向左,即方向与初始方向相反。这就是重新绘制每个塔的具体过程,但程序还没 冇结束我们还要

25、做一点事就是要布置塔的摆放地方,我们可以让塔一个挨一个的摆放但是这 样的摆放不够美观,所以我选着要让每个塔冇一个格了的间距,这样就是让塔重新绘制在它 们原来所在的地方,所有在每个塔绘制后我们并没奋及吋绘制另一个塔而足让机器人前进一 步让后再绘制。所以还要在程序里加以下的部分:if (front! sclear ()i f(fronttsclear ()move ();4.3.3显示完毕的标志为了机器人能显示所冇的工序都完成了,我们让机器人显示一个完毕的标志,而如何设 计这个标志,让程序宫冇动感呢?我们可以利用卡雷尔的绘图功能,让机器人不停的绘制不 同的颜色的方格,如同一个闪烁的桁示灯,因此我们

26、定义了一个函数stopsign ();具体的 定义过程如下:public void stopsigno while(true) paintcorner(blue); paintcorner(cyan); paintcorner(black);paintcorner(white); paintcorner(yellow): paintcorner(green);5. 运行结果5.1地图寻宝运行结果file研*:!: :丄:丨:|: :12345$780 w 1112131416 w 1?181020单击 start program 按钮, 跳出对话框:单击确定.l单击确定:单击确定:单击确定关闭

27、对诘框。5.2排序运行结果单击start program按钮,跳出对话框单击确定滴sq)和karel机器人一起来iujpg!丨:<><< 10捡起第一个塔f截阁: #秦#. 費蠡.费sr106. 小结与体会这次课程设计过程中,我利用课堂上学到的知识和斯坦福大学编程方法公开课上的知识 完成了能力拓展训练的设计任务。此次课程设计我们接触到一个新的编程方法,并认识了可 爱的机器人卡雷尔。卡雷尔是一个非常有趣的机器人,生活在非常简单的世界中,我非常喜 欢它。在刚开始接触到卡茁尔机器人时,感觉是一个完全一个陌生的环境,让我产生畏惧的想 法,但是在这家一步一步的动手过程屮发现这是一

28、个非常有趣的过程,丼没有原来想的那么 的复杂。也许这就和卡雷尔机器人的设计的初衷有关,即让刚开始学习编程的人,将所有的 精力放在解决w题上,避免具体的实现的过程。这可以通过卡雷尔简短的一些指令可以看出, 不过虽然是很少的指令促是却可以设计出很多让人满意的程序出來。7. 参考文献iljava核心技术卷i:基础知识cay s.horstmann著机械i:业出版社2 .算法设计与分析王红梅编著清肀大学出版社3 .数据结构(c语言版)严蔚敏编著清华大学川版社14j.java语言的科学与艺术罗们茨著付勇译清华大学出版社 5j.卡雷尔机器人学java罗们茨著淸华人学出版社8. 源代碍8.1地图寻宝pack

29、age liuxin.karel;import javax.swing.zjoptionpane; import stanford.karel.*;public class mymaze extends superkarelpublic void run()doptionpane.shommessagedialog(wll,"和karel机器人起寻找宝藏吧!"); j0ptiorp3rq. shomessagedia log (null,"个人信忠:"+"n"+"姓名: +"班级:"+nn"+&

30、quot;学号:);joptionpane. shomessagedia log (null,"我从家门口 出发啦! s沓 1:寻宝之路");search();pickbeeper();optionpane.s/?ouzmessagediglog(null,"我找到宝藏啦!哦也! n"+"下而我要把宝藏带回家。");0ptionpane.s/?owmessc7gedialog(null,"啊!我好像迷路啦,只记得家门门冇棵 巨大的松树! n"+"背着宝藏寻家咯turnaround();search();p

31、utbeeper();0ptionpane.showmessc7gedialog(null,"我把宝藏讲回家啦!哦也!");/寻宝算法public void search()while(nobeeperspresent()turnright();while(frontisblocked() turnleft();move();8.2排序package liuxin>karel;import javax.swing.zjoptionpane;import stanford.karel.superkarel;public class carrymission extend

32、s superkarel int collect= new int5; int i=0;static int mid; public void run()joptionpane .shoia/messagedia log (null,"和karel 机器人一起來排序吧! joptionpane .showmessagedia log (null,"个人信息:"+"n"+"姓名:"班级:"+"n"+"学号; while(frontisclear()while(!beeperspresent() move();colle

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论