Part4
set 7
-
在GridWorldCode/framework/info/gridworld/actor路径下:
实现了Act()、getActors()、processActors(ArrayList actors)、getMoveLocations()、selectMoveLocation(ArrayList locs)、makeMove(Location loc)
-
下面五种方法:
getActors();//返回周围相邻的所有对象 processActors(ArrayList<Actor> actors);//代替不是rock和critter的对象 getMoveLocations();//返回一个正确的位置 selectMoveLocation(ArrayList<Location> locs);//随机选择参数中的某个位置 makeMove(Location loc);//向loc位置移动
-
在class CrabCritter中,继承了getActors()方法,所以可以重写该方法,当需要获取其它位置的actor。
-
在ArrayList actors中的所有对象中选出一个不是rock、critter的对象然后调用removeSelfFromGrid()方法将选中的对象移出Grid。
-
//按照顺序调用 getMoveLocations();//返回相邻的八个格子上的所有空位置。 selectMoveLocation(ArrayList<Location> locs);//随机选择loc中的某个位置 makeMove(Location loc);//向loc位置移动
-
Critter类继承了Actor类,Actor类中提供了一个默认构造函数,一次当创建一个Critter对象时,可以通过super()方法调用Actor的默认构造函数,创建一个方向向北的蓝色的Critter。
Set8
-
ChameleonCritter类重写了processActors()、makeMove()方法,因此当一个ChameleonCritter对象调用父类的Act()方法时,被重写的两个方法会代替父类相同的两个方法,因此ChameleonCritter对象与Critter对象有所不同。
-
为了在子类的方法中调用父类的方法,通过super()方法来完成。
-
修改makeMove()方法,让ChameleonCritter对象在移动到新的位置之后在原来的位置放一朵花。
//修改如下,在旧位置放一朵红色的花 public void makeMove(Location loc) { Location old = getLocation();//记录旧位置 setDirection(getLocation().getDirectionToward(loc)); super.makeMove(loc); if(!old.equals(loc)){ //create red flower Flower flower = new setColor(Color.RED); flower.putSelfInGrid(getGrid(), old); } }
-
因为ChameleonCritter子类的getActors的行为与父类相同,当需要重新定义子类的行为模式时,只需要在子类重写该方法,当调用Act方法时会默认使用子类重写的方法。
-
Actor.java定义了该方法,其所有的子类都可以调用该方法。
-
对象调用getGrid()方法
Set 9
-
CrabCritter本来有吃掉前方对象的属性,而processActor()方法已经实现了部分功能,该方法会让参数中所有非rock和Critter类型的对象消失,只需要重写getActions()方法就可以实现该功能。当需要改变CrabCritter类型对象的功能时,可以在子类中重写该方法。
-
因为CrabCritter类中重写了getActions()方法,只返回其当前位置的正前方,左前方、右前方存在的所有对象,并且父类的processActor()方法规定其不能“吃掉”rock和critter对象。因此CrabCritter只会吃掉左前方、正前方、右前方的所有非rock和critter类型的对象。
public void processActors(ArrayList<Actor> actors) { for (Actor a : actors) { if (!(a instanceof Rock) && !(a instanceof Critter)) a.removeSelfFromGrid(); } }
-
getLocationsInDirections(int[] directions)方法以一个存储方向的数组作为参数,该数组规定了CrabCritter可以移动的可能的方向,如果在该方向的格子存在并且为空,则可以移动。方法的返回值为给定directions方向上可以移动的所有location。该方法实现了CrabCritter向左或向右方向前进属性。
for (int d : directions) { Location neighborLoc = loc.getAdjacentLocation(getDirection() + d); if (gr.isValid(neighborLoc)) locs.add(neighborLoc); }
-
左(4,3)、改变方向(4,4)、右(4,5)
-
相同:在移动过程中不会改变方向,都会在loc列表中随机选择一个位置并移动到对应位置。
不同:CrabCritter对象只会向左或向右移动,当不能移动时会随机向左或向右转动方向。Critter会随机向八个方向移动,当不能移动时会原地不动。
-
左右位置都有其它的Actor或者将要越过Grid边界。
-
一个CrabCritter不能吃掉其它Critter,也不能吃掉Rock。