Karel哪里身残志坚?
赵本山和范伟老师合作的相声“卖拐”里面有一个经典的一句台词:“没事出来,走两步。”走着,走着,忽忽悠悠就瘸了。Karel究竟有什么问题了?我们也先来走两步。接下来我们开始第一个任务:
Karel被放在一间房子里,方块在房子的西北方向的中心位置,Karel需要去捡起那个方块,然后回到最初的位置。如下图:
我们如何进入到这个界面了,还记得我们上一次课讲到如何运行这个工程:点击Assignment1节点,然后右键点击“Run As->Java Application”按键,双击鼠标选择CollectNewspaperKarel.java,然后点击“ok”按钮,出现了上图的界面。
在思考如何完成任务之前,我们先了解一下如何让Karel动起来,也就是让那些move(),turnLeft()等命令运行起来。我们点击“Start Program”按钮,一点反应也没有。
我们双击CollectNewspaperKarel.java这个节点,在Eclipse工具右边出现如下编辑区域:
其中以/*开始,*/结束的部分,还有//后面的语句都是注释语言,也就是上图中天绿色字体部分。注释是给人看的,对于程序阅读者来说是一个解释,能够让读者清楚了解程序和设计者的思路,在大型程序中,注释能帮助程序员及时有效的对代码进行维护,修改。初学者刚开始写的程序都比较简单,觉得写注释是比较浪费时间的事,但是从一开始养成良好的写注释的习惯,会让以后的工作事半功倍。
除了注释以外的部分,就是Java语法结构的一部分,在这里,我们暂时可以忽略它们,等我们熟练地完成任务之后,再回过头来看,它们变得很简单。我们现在最重要的目标就是快速让Karel跑起来,然后在不断完成任务的过程中学习基本语法知识。为了让Karel运行起来,我们必须创建run命令,run命令是在Karel机器人世界扮演一个特殊的角色,就是Karel的大脑,没有run命令,Karel就无法运行起来。run命令的格式如下:
public void run(){
方法体;
}
在这个方法头部的前两个单词,public void是JAVA语法结构的一部分,在这里暂时可以忽略一下他们,在以后的课程里会详细讲到这些内容。而在这个方法体里我们可以执行move(),turnLeft()这样的命令。完成后的代码如下:
红色部分就是新增加的代码,然后我们检验一下效果,步骤如下:
我们重新点击Assignment1节点,然后右键点击Run As->Java Application,双击鼠标选择CollectNewspaperKarel.java,然后点击“ok”按钮,出现了下图的界面。
对比原始图,可以明显体会到Karel往前走了一步。
我们知道了如何运行Karel,现在可以我们考虑如何找到钻石,并把它带回家。我们该如何命令它去执行任务,我们是不是可以这样告诉Karel:
1) Karel,移动到方块的位置。
2) 捡起它。
3) 回到最开始的位置。
如果Karel是你家训练有素的狗,它估计能完美地完成任务。那么我们开始完成第一个步骤移动到方块的位置。
我们可以有很多种方法,我们选择其中的一种:
1) 往前走两步,走到了墙边。
2) 如果继续往前走,就撞墙了,这个时候需要右转。
3) 往前走一步。
4) 左转。
5) 往前走一步。
这个时候就走到了方块那里了。
我们根据刚才分析编写相应的代码,也就是相应的命令。
1) 往前走两步,走到了墙边。对应的代码就是
move();
move();
2) 如果继续往前走,就撞墙了,这个时候需要右转。
turnRight();
3) 往前走一步。
move();
4) 左转。
turnLeft();
5) 往前走一步。
move();
我们把相应的代码写上去,怀着激动的心情等待运行结果,看机器人是否能够来到小方块所在的地方。
大家是不是发现,这个世界总是充满恶意,大家是不是发现Karel没有像预期一样到达指定位置,而是有错误。我们可以清晰地看到turnRight()旁边出现了红色的叉,下面还有一条红色的线,如下图:
我们看看出了什么问题,我们可以看到下面有提示:
大家可以根据提示,发现问题之所在:turnRight()这个方法没有定义。我们记起来了,在Karel的命令集里只有turnLeft()像左转,没有像右转的功能。
大家明白了为什么karel有缺陷了吧,就是它没有办法直接右转,只能左转。没有向右转Karel好像连这么简单的任务都完成不了,好伤心啊。
大家觉得有没有机会弥补遗憾,不能直接右转,只能左转,左转,左转,左转,好像找到解决问题的方法了,我们是不是发现左转三次,就是右转。好像有办法解决了。我们把turnRight();用三次turnLeft()代替。是不是红色的叉叉消除了。我们现在检验一下是否能完成任务,我们重新点击Assignment1节点,然后右键点击Run As->Java Application,双击鼠标选择CollectNewspaperKarel.java,然后点击“ok”按钮,出现了下图的界面:
点击“Start Program”按钮,我们是不是看到如下的界面:
好像真的起了作用,karel终于来到了钻石所在的地方,接着就执行了捡起钻石的命令,pickBeeper(),试一下。捡起了钻石,现在该高高兴兴地满载而归了。
如果你是一个追求安稳的人,就选择原路返回。如果你是一个好奇宝宝,不妨用另外一条路返回。这里留给大家尝试一下。
大家是不是感觉虽然karel虽然先天有点缺陷,只能左转,不能直接右转,但是丝毫不影响他的精彩人生,只是比别人稍微费点劲。
为Karel做个拐杖
大家是不是都顺利的完成了第一个任务,挺高兴的吧。但是大家仔细看看自己的代码,是不是总觉得有个地方有点不对劲,就是Karel的右转,每次都要写下三遍turnLeft(),不仅浪费时间,而且阅读起来比较费劲,那我们有没有办法替karel做个拐杖,自己创建一个turnRight()的命令,在JAVA里我们称之为方法,在C语言里称之为函数。
方法的概念来源于数学上的函数,在数学中,当数据具有一定的规律时,就是用一个函数来表示该数字的规律,例如f(n)=n 则代表1、2、3、……这样的一个数列。方法是一组为了实现特定功能的代码块的集合。方法在语法上的功能主要有以下两个:
1) 结构化代码
将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护性强。
2) 减少代码重复
一个固定的功能,可能会在程序中多次使用,在使用时只需要调用写好的方法,而不用重复书写对应的功能代码。
比如move(),turnLeft()都是方法,只不过他们定义被封装起来,我们看不到而已,我们还能回忆起run方法的格式吗?
方法的定义由可以分开考虑的两部分组成:第一行构成方法的头部,两个括号之间的部分构成了这个方法的本体。如果先忽略本体,方法的定义看起来是这样的:
public void run(){
方法体;
}
public void是JAVA语法结构的一部分,在这里暂时我们可以忽略一下他们,在以后的课程里会详细讲到这些内容,我们暂时定义方法都可以按照这样的模式进行。下一个单词就是我们方法的名字,我们要实现turnRight,那么这个方法的名字就是turnRight,当我们完成turnRight()的定义之后,我们以后可以直接调用turnRight()这个命令替代三次左转的行为。而turnRight方法的主体就是turnLeft();我们可以看具体的代码:
public void turnRight(){
turnLeft();
turnLeft();
turnLeft();
}
同样我们如果需要向后转的时候,是不是也可以定义一个方法turnAround,具体的代码是
public void turnAround(){
turnLeft();
turnLeft();
}
我们现在回过头把之前右转的地方,由turnRight替代,是不是发现效果一样,但是代码变得清晰了。我们之后还会反复体会到这种方法的妙用。
Karel的新任务
我们现在来完成一个新的小任务,巩固一下我们刚才所学的东西:Karel要把这个方块从它的初始位置,第一大街第二道的交点,移到第二大街和第五大道的交点。如下图:
在完成任务之前,我们怎样找到这幅地图了。我们可以根据需要自己制作相应的地图:
在Karel的控制面板的左侧是不是有这样三个按钮:
“Load World” 按钮是用来下载已经存在的地图,这跟我们玩魔兽的游戏一样。
“New World” 按钮是用来创造一张新地图,并且设定相应的大小。
“Edit World” 按钮是用来改变当前地图的组成部分。
点击“Edit World”按钮,控制面板会出现,如下图一样的工具栏:
我们分别讲一下工具栏里各个部分的作用。
分别是创造墙和移除墙的工具。左边的黑色方框选中的工具是造墙工具,选择街角之间的地方,墙就会在相应的地方被创建。如果你想移除这些墙,就点击移除墙的工具。你反复尝试几下,就能很快掌握其中技巧。
接着就是五个beeper工具
这些Beeper工具可以帮助改变任何街角的Beeper配置。如果想改变某一个街角的Beeper数量,先选择合适的Beeper工具,然后点击相应的街角。如果选择相应的Beeper,然后点击Beeper袋图标(如钱袋子),就可以改变Karel包里Beeper的数量。
如果你想将Karel移动到相应的位置,点击Karel图标,然后一直拖拽到相应的位置,放开鼠标。如果想改变Karel的方向,点击四个Karel方向图标中的一个即可。
现在可以按照上面的说明制作出你想要的地图,制作完成之后点击“Save World”按钮保存地图,或者点击“Don't Save”放弃保存地图。
制作完地图后,我们开始完成相应的任务了。我们如何完成这个任务,同样我们稍微分解一下任务,就能自己完成相应的任务了。
这次课我们体验了一下身残志坚的Karel,虽然Karel只能往左转,但是勤能补拙,天生比别人差一点点,但是一点也不耽误精彩的人生。我们的Karel还能完成更多精彩的任务。欢迎收看下一期的课程Karel机器人的三大定律。