Part4

Part4
set 7
  1. 在GridWorldCode/framework/info/gridworld/actor路径下:

    实现了Act()、getActors()、processActors(ArrayList actors)、getMoveLocations()、selectMoveLocation(ArrayList locs)、makeMove(Location loc)

  2. 下面五种方法:

    getActors();//返回周围相邻的所有对象
    processActors(ArrayList<Actor> actors);//代替不是rock和critter的对象
    getMoveLocations();//返回一个正确的位置
    selectMoveLocation(ArrayList<Location> locs);//随机选择参数中的某个位置
    makeMove(Location loc);//向loc位置移动
  3. 在class CrabCritter中,继承了getActors()方法,所以可以重写该方法,当需要获取其它位置的actor。

  4. 在ArrayList actors中的所有对象中选出一个不是rock、critter的对象然后调用removeSelfFromGrid()方法将选中的对象移出Grid。

  5. //按照顺序调用
    getMoveLocations();//返回相邻的八个格子上的所有空位置。
    selectMoveLocation(ArrayList<Location> locs);//随机选择loc中的某个位置
    makeMove(Location loc);//向loc位置移动
  6. Critter类继承了Actor类,Actor类中提供了一个默认构造函数,一次当创建一个Critter对象时,可以通过super()方法调用Actor的默认构造函数,创建一个方向向北的蓝色的Critter。

Set8
  1. ChameleonCritter类重写了processActors()、makeMove()方法,因此当一个ChameleonCritter对象调用父类的Act()方法时,被重写的两个方法会代替父类相同的两个方法,因此ChameleonCritter对象与Critter对象有所不同。

  2. 为了在子类的方法中调用父类的方法,通过super()方法来完成。

  3. 修改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); 
        }
    }
  4. 因为ChameleonCritter子类的getActors的行为与父类相同,当需要重新定义子类的行为模式时,只需要在子类重写该方法,当调用Act方法时会默认使用子类重写的方法。

  5. Actor.java定义了该方法,其所有的子类都可以调用该方法。

  6. 对象调用getGrid()方法

Set 9
  1. CrabCritter本来有吃掉前方对象的属性,而processActor()方法已经实现了部分功能,该方法会让参数中所有非rock和Critter类型的对象消失,只需要重写getActions()方法就可以实现该功能。当需要改变CrabCritter类型对象的功能时,可以在子类中重写该方法。

  2. 因为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();
            }
        }
  3. 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. 左(4,3)、改变方向(4,4)、右(4,5)

  5. 相同:在移动过程中不会改变方向,都会在loc列表中随机选择一个位置并移动到对应位置。

    不同:CrabCritter对象只会向左或向右移动,当不能移动时会随机向左或向右转动方向。Critter会随机向八个方向移动,当不能移动时会原地不动。

  6. 左右位置都有其它的Actor或者将要越过Grid边界。

  7. 一个CrabCritter不能吃掉其它Critter,也不能吃掉Rock。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值