斯坦福编程方法学作业讲解2---身残志坚的Karel

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机器人的三大定律。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2398237/blog/865373

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值