5.1 让我们开始吧
让我们从这个AP计算机科学案例程序“GridWorld”开始学习吧。首先请下载安装“GridWorld”程序,你可以从如下链接下载:http://www.collegeboard.com/student/testing/ap/compsci_a/case.html。下载完成后解压缩,你会看到一个名叫“GridWorldCode”的文件夹,接着打开子文件夹projects/firstProject,里面包含一个名为BugRunner.java的源文件。接下来要做的就是拷贝这个源文件至你的项目下,并导入你的开发环境。这里也有一些相关帮助文档:http://www.collegeboard.com/prod_downloads/student/testing/ap/compsci_a/ap07_gridworld-installation_guide.pdf。当你运行BugRunner.java后,可以从这里下载GridWorld学生手册:http://www.collegeboard.com/prod_downloads/student/testing/ap/compsci_a/ap07_girdworld_studmanual_appends_v3.pdf。学生手册中使用了一些我还没有提到过的单词,为了开始学习,这里有一个快速预览:
在GridWorld世界中,包含了Bugs,Rocks和Grid自己,他们都属于对象(objects)。
构造函数(constructor)是一个可以创建新对象(new objects)的特殊的方法。
类(class)是一系列对象的集合;每一个对象都隶属于一个类。
一个对象也可以称作一个实例(instance),因为它是一个类的成员或者实例。
每一个属性(attribute)是一条关于对象的信息,比如颜色或者位置。
每一个accessor method是一个可以返回一个对象属性值的方法。
每一个modifier method是一个可以更改一个对象属性值的方法。
5.2 BugRunner
BugRunner.java 代码片段:
import info.gridworld.actor.ActorWorld;
import info.gridworld.actor.Bug;
import info.gridworld.actor.Rock;
public class BugRunner
{
public static void main(String[] args)
{
ActorWorld world = new ActorWorld();
world.add(new Bug());
world.add(new Rock());
world.show();
}
}
前三行是import声明,它们列出了在GridWorld这个程序中使用到的类(classes)。你可以找到有关这些类的相关文档: http://www.greenteapress.com/thinkapjava/javadoc/gridworld 。和之前我们看到的其他程序一样,BugRunner定义了一个类(class),这个类包含了一个main方法。在main方法的第一行我们创建了一个ActorWorld对象。new是Java中用来创建新对象的关键字。接下来的一行创建了一个Bug对象和一个Rock对象,并将它们加入了world对象(一个ActorWorld对象)中。最后一行用来将world展示到了我们的屏幕。
现在打开BugRunner.java让我们进行一些编辑,我们将
world.add(new Bug());
替换成如下两行
Bug redBug = new Bug();
world.add(redBug);
替换的这两行中,第一行我们声明了一个Bug类型的变量redBug,并将它指向我们创建的新Bug对象。我们可以用redBug来调用Bug对象的方法。试试如下代码:
System.out.println(redBug.getLocation());
注意:如果你在将Bug加入world中之前运行了此行代码,打印出的结果为空(null),这表明Bug还没有一个location。
调用另一些accessor method并打印Bug对象的一些属性试试。调用canMove,move和turn并确保你明白他们在做什么。现在让我们做些练习:
练习5.1
写一个名为moveBug的方法,将Bug对象作为方法的一个参数并在方法中调用该对象的move方法。完成后在main方法中调用这个方法。
修改moveBug方法,在其中调用canMove方法,使Bug只有在能够移动时移动。
修改moveBug方法,使它包含一个integer类型的参数n,并让它移动Bug对象n次(如果可以的话)。
修改moveBug方法,使其当Bug不能移动时调用turn方法。
练习5.2
Math类提供了一个名为random的方法,这个方法可以返回一个大小在0.0和1.0(不包括1.0)之间的double类型的数。
写一个名为randomBug的方法,将Bug对象作为一个参数并等概率地决定Bug的移动方向是0度,90度,180度还是270度,然后移动Bug对象(如果可以的话)。
修改randomBug方法来接收一个integer类型的n参数并重复n次。结果将是一个random walk,你可以阅读相关文档 http://en.wikipedia.org/wiki/Random_walk 。
想要看一个更长的random walk,你可以给ActorWorld一个更大的舞台。在源程序BugRunner.java的最顶层,添加以下声明:
import info.gridworld.grid.UnboundedGrid;
然后替换创建ActorWorld的语句为
ActorWorld world = new ActorWorld(new UnboundedGrid());
你应该可以运行程序进行上千步random walk(也许你需要使用滚动条搜寻你的Bug,哈哈)。
练习5.3
GridWorld使用了Java函数库中定义的Color对象。你可以阅读相关文档 http://download.oracle.com/javase/6/docs/api/java/awt/Color.html 。
想要创建不同颜色的Bug,我们可以引入Color:
import java.awt.Color;
然后你可以访问之前定义的颜色,比如Color.blue,或者创建一个新的颜色:
Color purple = new Color(148, 0, 211);
创建一些不同颜色的Bug对象,然后编写一个名为colorBug的方法,将Bug对象作为参数,读取它的location,sets和color等。
你通过getLocation方法取得的Location对象中包含getRow方法和getCol方法,这两个方法返回Interger类型数值。所以你可以这样取得bug对象的x坐标:
int x = bug.getLocation().getCol();
编写一个名为makeBugs的方法,传入一个ActorWorld对象和一个integer类型的n,然后创建n个Bug对象,通过每个创建的Bug对象的location来决定它的color。使用row数值来控制red比例,使用column来控制blue比例。