Karel机器人学Java_第1页
Karel机器人学Java_第2页
Karel机器人学Java_第3页
Karel机器人学Java_第4页
Karel机器人学Java_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、卡雷尔机器指令集2013年3月10日12:51卡雷尔机器人指导文档:卡雷尔基本动作指令:move() 要求卡雷尔向前推进一步。当一堵墙挡在卡雷尔面前的时候,卡雷尔不能响应 move()这个命令。turnLeft() 要求卡雷尔向左转90度(逆时针转动)。pickBeeper() 要求卡雷尔捡起街角上的蜂鸣器,把这个蜂鸣器放到它的蜂鸣器收藏包里,这个包可容纳无限多的蜂鸣器。除非这个蜂鸣器恰好在卡雷尔所在的街角上,卡雷尔不能响应这个pickBeeper()命令。putBeeper() 要求卡雷尔从蜂鸣器收藏包里拿出一个蜂鸣器,放在卡雷尔所在的街角上。除非卡雷尔的蜂鸣器收藏包里有蜂鸣器,卡雷尔不能响

2、应这个putBeeper()命令。卡雷尔的这些命令,不能自己自动执行。在卡雷尔可以执行这些命令之前,你需要先把它们写在一个卡雷尔程序里。需要特别注意的是,这几个命令对卡雷尔的行为进行了限制。如果卡雷尔试图做些非法的举动,像穿墙或者捡起一个不存在的蜂鸣器,一个错误就发生了。在这时,卡雷尔会显示一条错误的信息,同时拒绝执行剩余的命令。卡雷尔控制语句:1. 条件语句。条件语句是指在程序里这样一些语句,只有当特定的条件成立了,才会被执行。在卡雷尔编程里,你可以使用 “if”来指定条件语句。a. “if的条件形式If(条件检测)只有当条件满足时才会执行的语句 b. if的扩展形式If(条件检测)只有当条

3、件满足时才会执行的语句 else 只有当条件不满足时才会执行2. 迭代语句。迭代语句是指在一个程序里,某些语句需要被反复执行,程序员称这个为“循环”。卡雷尔支持两种不同的迭代语句。“for”语句用于当你想按预定的次数重复执行一组命令的时候,“while”语句用于当你想在某些条件满足时,重复执行一组命令的时候a. ”for的语法for(int i=0;icount;i+)重复执行的语句这里的count是一个整数,指需要重复的次数。b. While的语法While(条件检测)重复执行的语句3. 卡雷尔可以判断的环境条件(一共九组十八个判断方法,两两相对)测试条件相反的测试条件判断的内容frontI

4、sClear() 前面无墙返回肯定值frontIsBlocked() 面前被档返回肯定值面前是否有墙leftIsClear() 左面无墙返回肯定值leftIsBlocked() 左面被档返回肯定值左面是否有墙rightIsClear() 右面无墙返回肯定值rightIsBlocked() 右面被档返回肯定值右面是否有墙beepersPresent() 所在位置有方块返回肯定值noBeepersPresent() 所在位置无方块返回肯定值所在位置是否有方块beepersInBag() 包里目前有方块返回肯定值noBeepersInBag() 包里目前无方块返回肯定值包里是否有方块facingNo

5、rth() 面朝北返回肯定值notFacingNorth() 没有面朝北返回肯定值是否面朝北facingEast() 面朝东返回肯定值notFacingEast() 没有面朝东返回肯定值是否面朝东facing South 面朝南返回肯定值notFacingSouth 没有面朝南返回肯定值是否面朝南facingWest 面朝西返回肯定值notFacingWest 没有面朝西返回肯定值是否面朝西基本动作指令编程演进2013年3月27日16:28卡雷尔基本动作指令:import stanford.karel.*;public class StoneMasonKarel extends SuperKa

6、rel / You fill in this part/* * 检起正上方的方块并返回起点 * * 首先卡雷尔机器人左转(turnLeft)并向正前方移动(move)到方块的位置捡起方块(pickBeeper) * 卡雷尔机器人捡完方块后返回原点:2次右转(turnRight),移动了4步回到原点后左转1次 */public void run() turnLeft();move();move();move();pickBeeper();move();pickBeeper();turnRight();turnRight();move();move();move();move();turnLeft

7、();卡雷尔控制语句条件语句的引用:import stanford.karel.*;public class StoneMasonKarel extends SuperKarel / You fill in this part/* * 检起正上方的方块并返回起点 * */public void run() /卡雷尔机器人左转turnLeft();/条件设定:执行PickBeepersAndMove指令4次for (int i=0;i4;i+)PickBeepersAndMove();/卡雷尔机器人右转2次turnRight();turnRight();/条件设定:向正前方移动4次,以返回起点f

8、or (int i=0;i4;i+)move();/卡雷尔机器左转还原成初如状态turnLeft();/* * 设定PickBeepersAndMove指令集 * 判断当前位置是否有方块,如果有捡起方块然后前移1步,如果没有就直接前移1步 */public void PickBeepersAndMove()if(beepersPresent()pickBeeper();move();elsemove();if(beepersPresent()pickBeeper();习题一 基本指令2013年4月2日13:24任务要求:本任务主要练习基本动作指令的使用。1. 移动到方块所在位置2. 捡起方块3

9、. 回到初始位置任务代码:使用基本的动作指完成任务。需要确定卡雷尔机器人到达方块位置的走法、方向及卡雷尔机器人回到原点的走法、方向。以下为代码正文:import stanford.karel.*;public class CollectNewspaperKarel extends SuperKarel / You fill in this partpublic void run() /移动到方块所在位置move();move();turnRight();move();turnLeft();move();/捡起方块pickBeeper();/返回到原点turnLeft();turnLeft();

10、move();move();move();turnRight();move();turnRight();习题二 修复拱门2013年4月2日13:42任务要求:卡雷尔被雇去修复1989 年大地震对斯坦福大方院造成的损坏。补全支撑拱门石头(当然还是用菱形方块表示),如左图所示。规则: 卡雷尔的初始位置位于第一列、第一行,面向东,携带无限的支撑石(灰色方块); 每隔三列有一个支撑柱,分别位于第一、五、九和十三列,依此类推; 最后一个支撑柱右侧紧贴一堵墙,本题中,墙壁紧贴第十三列右侧,但无论有多少组支撑柱,你的程序都应该能正确运行; 每组支撑柱顶端为墙体,但卡雷尔不知道每个支撑住是否只有5 块石头,也

11、不知道是否所有的支撑柱都等高。 有些支撑柱中的石头并未完全缺损,你的程序不能在已有石头的位置再次置放。任务代码:import stanford.karel.*;public class StoneMasonKarel extends SuperKarel /* * 逐个检查柱子,没有方块的补齐,检查完成后返回到原点。 */public void run() while (notFacingWest() CheckStoneMason();NextStoneMason();Return();/* * CheckStoneMason开始 * 从下往上检查StoneMason,如果没有方块的补全,完

12、成后回到StoneMason底部 */private void CheckStoneMason() if (facingEast() turnLeft();if (noBeepersPresent() putBeeper();while (facingNorth() if (noBeepersPresent() putBeeper(); else if (frontIsClear() move();if (noBeepersPresent() putBeeper();if (frontIsBlocked() turnAround();while (frontIsClear() move();/

13、CheckStoneMason结束/* * NextStoneMason开始 * 到达下一个柱子 * (如果左边无阻碍,即为还有下一个柱子需要Check;如果左边有阻碍,则说明当前柱子为最后一个柱子,右转,准备返回) */private void NextStoneMason() if (leftIsClear() turnLeft();for (int i=0;i4;i+) move();turnLeft(); else turnRight();/NextStoneMason结束/* * Return开始 * Rteurn到原点 */private void Return() while (

14、facingWest() if (frontIsBlocked() turnAround(); else while (frontIsClear() move();turnAround();/Return结束执行结果:思路:过程:Karel检查柱子完成后到达下一个柱子所有柱子检查完成返回原点1. CheckStoneMason:由于本任务中需要检查和放置的方块为直线摆放,柱子的高度不固定,每Check完成一个柱子都返回到柱子的底部。2. 柱子位置的定位规则:本任务中,每隔三列有一个支撑柱,分别位于第一、五、九和十三列,依此类推。“for (int i=0;i4;i+)”的使用就是为了匹配这一规

15、则。3. 控制方向:a. 根据柱子位置的定位规则,要到达下一个柱子,就需要保证向东前进4步;b. CheckStoneMason返回到柱子底部后,为面向南,NextStoneMason通过判断左侧是否存在阻碍,来确定是否需要继续检查下一个柱子;c. 左侧存在阻碍,则NetStoneMason判断当前位置为最后一个柱子。这时向右转,CheckStoneMason完成;if (leftIsClear() turnLeft();for (int i=0;i4;i+) move();turnLeft(); else turnRight();d. Return判断面向西则为CheckStoneMason

16、完成,这时Return回到原点。习题三 将空白矩形变成跳棋板2013年4月3日13:46任务参考信息: 需要保证卡雷尔能在各种规格的棋盘上正确执行操作; 界面在初始状态下没有任何内墙或灰色方块; 界面不一定是正方形,但你可以假设它的长宽相等; 另外一个需要考虑的特殊情况是长或宽为1执行结果:import stanford.karel.SuperKarel;public class Chessboard extends SuperKarel public void run() if (frontIsBlocked() OneRank(); else while (frontIsClear() C

17、heckChessboard();private void CheckChessboard() while (frontIsClear() if (noBeepersPresent() move();putBeeper(); else if (frontIsClear() move();if (noBeepersPresent() if (frontIsClear() move();putBeeper(); else if (frontIsClear() move();NextLine();private void OneRank() if (frontIsBlocked() if (righ

18、tIsBlocked() turnLeft(); else turnRight();while (frontIsClear() if (noBeepersPresent() move();putBeeper(); else if (frontIsClear() move();if (noBeepersPresent() if (frontIsClear() move();putBeeper(); else if (frontIsClear() move();private void NextLine() if (frontIsBlocked() if (facingEast() turnLef

19、t(); else turnRight();if (frontIsClear() if (beepersPresent() move();if (rightIsBlocked() turnLeft(); else turnRight(); else move();putBeeper();if (rightIsBlocked() turnLeft(); else turnRight();import stanford.karel.SuperKarel;public class Chessboard extends SuperKarel / You fill in this partpublic

20、void run() if (frontIsBlocked() OneRank(); else while (frontIsClear() CheckChessboard();private void CheckChessboard() while (frontIsClear() if (noBeepersPresent() putBeeper();move(); else if (frontIsClear() move();if (noBeepersPresent() if (frontIsClear() move();putBeeper(); else if (frontIsClear()

21、 move();NextLine();private void OneRank() if (frontIsBlocked() if (rightIsBlocked() turnLeft(); else turnRight();while (frontIsClear() if (noBeepersPresent() move();putBeeper(); else if (frontIsClear() move();if (noBeepersPresent() if (frontIsClear() move();putBeeper(); else if (frontIsClear() move(

22、);private void NextLine() if (frontIsBlocked() if (facingEast() turnLeft(); else turnRight();if (frontIsClear() if (beepersPresent() move();if (rightIsBlocked() turnLeft();move(); else turnRight();move(); else move();putBeeper();if (rightIsBlocked() turnLeft(); else turnRight();习题四 在第一行的中央放置一个方块2013

23、年4月4日15:30任务参考信息: 卡雷尔的起始位置是第一列第一行,面朝东,携带了无限的灰色方块; 界面在初始状态下没有任何内墙或灰色方块; 界面不一定是正方形,但你可以假设它的长宽相等。你还可以参考如下信息简化过程: 如果界面的宽是奇数,卡雷尔必须把灰色方块放置在中间的位置;如果是偶数,卡雷尔可以把灰色方块放在中间的两个位置中的任意一个。 程序运行结束时卡雷尔的朝向不作要求。执行结果:import stanford.karel.SuperKarel;public class A1 extends SuperKarel / You fill in this partpublic void ru

24、n() while (frontIsClear() move();putBeeper();pickBeeper();turnAround();move();while (beepersPresent() KeralPickBeepers();if (noBeepersPresent() putBeeper();while (notFacingEast() turnRight();/private void KeralPickBeepers() if (beepersPresent() pickBeeper();move();while (beepersPresent() & frontIsCl

25、ear() move();turnAround();move();/思路:要找到中央位置可以采用结绳对折取中点的方法,即是在直线方向上布满方块,然后从两端向中间各取一个方块向中间汇聚,最后停留的位置即为中间点。习题五 在任意矩形的正中央放置一个方块2013年4月14日17:36任务参考信息: 卡雷尔的起始位置是不确定,方向不确定,携带了无限的灰色方块; 界面在初始状态下没有任何内墙,卡雷尔起始位置没有方块,但是不确定其他位置是否存在方块及存在的数量; 界面不一定是正方形,但你可以假设它的长宽相等。你还可以参考如下信息简化过程: 如果界面的宽是奇数,卡雷尔必须把灰色方块放置在中间的位置;如果是偶

26、数,卡雷尔可以把灰色方块放在中间的两个位置中的任意一个。 程序运行结束时卡雷尔的朝向不作要求。执行结果:import stanford.karel.*;public class CenterPutBeepers extends SuperKarel public void run() /先通过转动方向来确定前方没有阻碍while (frontIsBlocked() turnLeft();/* * 判断左、右是否有阻碍(如果有阻碍则为单行或单列): * 左、右同时有阻碍则执行PutBeepers和CheckBeepers,执行完成后,Karel停留的位置为中央点,放置一个方块; * 左或者右没有

27、阻碍则判断是否向东,不是则转向东。向东无阻碍则执行PutBeepers和CheckBeepers,执行完成后,Karel停留的位置为中央点,放置一个方块; * 接下来判断左或右的阻碍,如果没有则向该方转,然后执行PutBeepers和CheckBeepers,执行完成后,Karel停留的位置为中央点,放置一个方块。 */if (leftIsBlocked() & rightIsBlocked() PutBeepers();CheckBeepers();putBeeper(); else while (noBeepersPresent() if (facingEast() if (frontIs

28、Clear() PutBeepers();CheckBeepers();putBeeper(); else turnAround();PutBeepers();CheckBeepers();putBeeper(); else turnLeft();if (beepersPresent() if (leftIsClear() turnLeft(); else if (rightIsClear() turnRight();if (beepersPresent() if (frontIsClear() PutBeepers();CheckBeepers();putBeeper();/完成后Karel转向东while (notFacingEast() turnLeft();/* * PubBeepers开始 * 首先移动到尽头,然后开向

温馨提示

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

评论

0/150

提交评论