パート4

セット7

  • Critterにはどのようなメソッドが実装されていますか?
    act、getActors、processActors、getMoveLocations、selectionMoveLocation、makeMove

  • 彼らが行動するとき、すべての生き物に共通する5つの基本的な行動は何ですか?
    getActors、processActors、getMoveLocations、selectionMoveLocation、makeMove

  • CritterのサブクラスはgetActorsメソッドをオーバーライドする必要がありますか?説明する。
    はい、新しい生き物サブクラスが異なる場所からアクターを選択する場合、このメソッドをオーバーライドする必要があります

  • 生き物が俳優を処理する方法を説明してください。
    1つは、リスト内のすべての俳優の色を変更すること、2つはすべてを食べること、3つは移動するように依頼することです。

  • 生き物を動かすには、どの3つのメソッドを呼び出す必要がありますか?これらの各方法を説明してください。
    getMoveLocations、selectMoveLocation、makeMove生き物の

    移動は3段階のプロセスです。まず、actメソッドがgetMoveLocationsメソッドを呼び出します。基本的な生き物の場合、このメソッドは、生き物の周りのすべての空の隣接する場所のリストを返します。空の可能性のある場所のリストを受け取った後、selectMoveLocationは場所の1つをランダムに選択し、その場所を返します。選択できる空の場所がない場合、selectMoveLocationは生き物の現在の場所を返します。返された場所はmakeMoveメソッドに渡され、生き物は新しい場所に移動されます

      //@file: info/gridworld/actor/Critter.java
      //@line: 38~47
       public void act()
      {
      if (getGrid() == null)
          return;
      ArrayList<Actor> actors = getActors();
      processActors(actors);
      ArrayList<Location> moveLocs = getMoveLocations();
      Location loc = selectMoveLocation(moveLocs);
      makeMove(loc);
      }
    
  • Critterコンストラクターがないのはなぜですか?
    CritterはActorを拡張します。Actorクラスにはデフォルトのコンストラクターがあります。クラスにコンストラクターを作成しない場合、Javaはデフォルトのコンストラクターを作成します。Javaが提供するCritterのデフォルトコンストラクターはsuper()を呼び出し、これはActorのデフォルトコンストラクターを呼び出します。Actorのデフォルトコンストラクターは、北向きの青い生き物を作成します。

      //@file: info/gridworld/actor/Actor.java
      //@line: 38~47
      public Actor()
      {
      color = Color.BLUE;
      direction = Location.NORTH;
      grid = null;
      location = null;
       }
    

セット8

  • ChameleonCritterがactをオーバーライドしないのに、actによってChameleonCritterがCritterとは異なる動作をするのはなぜですか?
    actメソッドは、getActors、processActors、getMoveLocations、selectMoveLocation、およびmakeMoveを呼び出します。ChameleonCritterクラスは、processActorsメソッドとmakeMoveメソッドをオーバーライドします。したがって、ChameleonCritterの呼び出し行為は、Critterの呼び出し行為とは異なる動作を生成します。

      //@file: info/gridworld/actor/Critter.java
      //@line: 38~47
       public void act()
      {
      if (getGrid() == null)
          return;
      ArrayList<Actor> actors = getActors();
      processActors(actors);
      ArrayList<Location> moveLocs = getMoveLocations();
      Location loc = selectMoveLocation(moveLocs);
      makeMove(loc);
      }
    
  • ChameleonCritterのmakeMoveメソッドがsuper.makeMoveを呼び出すのはなぜですか?
    ChameleonCritterのmakeMoveメソッドは、最初に、新しい場所に向くように生き物の方向を変更します。次に、Critterクラスのsuper.makeMoveを呼び出して、実際に新しい場所に移動します。方向を変えた後は、Critterのように動作します(makeMoveのように)。

      //@file:info/gridworld/actor/Critter.java
      //@line: 125~131
        public void makeMove(Location loc)
       {
    	  if (loc == null)
         	 removeSelfFromGrid();
      	else
         	 moveTo(loc);
       }
    
  • ChameleonCritterが移動したときに、古い場所に花を落とすにはどうすればよいですか?
    makeMoveメソッドを変更して、古い場所に花をドロップします。ChameleonCritterの現在の場所を追跡するには、変数が必要です。生き物が移動した後、生き物が実際に新しい場所に移動した場合にのみ、古い場所に花を置きます。以下の変更されたmakeMoveメソッドを参照してください。

      public void makeMove(Location loc)
      {
      	Location oldLoc = getLocation();
      	setDirection(getLocation().getDirectionToward(loc));
      	super.makeMove(loc);
      	if(!oldLoc.equals(loc)) //don't replace yourself if you did not move
       	{
      	Flower flo = new Flower(getColor());
      	flo.putSelfInGrid(getGrid(), oldLoc);
      	}
      }
    

* ChameleonCritterがgetActorsメソッドをオーバーライドしないのはなぜですか?

基本クラスのCritterが処理するのと同じアクターのリストを処理するためです。ChameleonCritterはgetActorsの新しい動作を定義していないため、このメソッドをオーバーライドする必要はありません。

  • getLocationメソッドを含むクラスはどれですか?
    Actorクラスには、getLocationメソッドが含まれています。すべてのActorサブクラスはこのメソッドを継承します

      //@file:info/gridworld/actor/Actor.java
      //@line: 102~105
       public Location getLocation()
      {
      	 return location;
       }
    
  • クリッターはどのようにして独自のグリッドにアクセスできますか?
    生き物は、Actorクラスから継承するgetGridメソッドを呼び出すことにより、グリッドにアクセスできます。

      //@file:info/gridworld/actor/Actor.java
      //@line: 92~95
       public Grid<Actor> getGrid()
       {
     	 return grid;
      }
    

セット9

  • CrabCritterがprocessActorsメソッドをオーバーライドしないのはなぜですか?
    CrabCritterは、getActorsが呼び出されたときに返されるすべてのネイバーを食べることによってアクターを処理します。これは、基本クラスのCritterから継承する動作と同じです。このメソッドをオーバーライドする必要はありません。

  • CrabCritterが他の俳優を見つけて食べるために使用するプロセスを説明してください。それは常にすべての近隣の俳優を食べますか?説明する。
    CrabCritterのgetActorsメソッドは、カニの生き物のすぐ前、およびその右前と左前の場所にある隣人のみを検索します。これらの場所で見つかったネイバーは、processActorsメソッドが呼び出されたときに「食べられ」ます。他の近隣の場所の俳優は邪魔されません

      //@file:GridWorldCode/projects/critters/CrabCritter.java
      //@line: 44~57
      public ArrayList<Actor> getActors()
       {
      ArrayList<Actor> actors = new ArrayList<Actor>();
      int[] dirs =
          { Location.AHEAD, Location.HALF_LEFT, Location.HALF_RIGHT };
      for (Location loc : getLocationsInDirections(dirs))
      {
          Actor a = getGrid().get(loc);
          if (a != null)
              actors.add(a);
      }
    
      return actors;
       }
    
  • getLocationsInDirectionsメソッドがCrabCritterで使用されるのはなぜですか?
    このメソッドのパラメーターは、方向の配列をもたらします。カニの生き物の場合、この配列には、このカニが食べることができる可能性のある隣人の方向が含まれています。getLocationsInDirectionsメソッドは、この配列を使用して、配列パラメーターで指定された方向で、この生き物の有効な隣接位置を判別して返します。

      //@file:GridWorldCode/projects/critters/CrabCritter.java
      //@line: 101~114
       public ArrayList<Location> getLocationsInDirections(int[] directions)
    {
      ArrayList<Location> locs = new ArrayList<Location>();
      Grid gr = getGrid();
      Location loc = getLocation();
    
      for (int d : directions)
      {
          Location neighborLoc = loc.getAdjacentLocation(getDirection() + d);
          if (gr.isValid(neighborLoc))
              locs.add(neighborLoc);
      }
      return locs;
    }   
    
  • CrabCritterに場所(3、4)があり、南を向いている場合、getActorsメソッドの呼び出しによって返されるアクターの可能な場所は何ですか?
    (4,3)、(4,4)、および(4,5)

    //@file:GridWorldCode/projects/critters/CrabCritter.java
    //@line: 44~57
    public ArrayList<Actor> getActors()
     {
    ArrayList<Actor> actors = new ArrayList<Actor>();
    int[] dirs =
        { Location.AHEAD, Location.HALF_LEFT, Location.HALF_RIGHT };
    for (Location loc : getLocationsInDirections(dirs))
    {
        Actor a = getGrid().get(loc);
        if (a != null)
            actors.add(a);
    }
    
    return actors;
     }
    
  • CrabCritterとCritterの動きの類似点と相違点は何ですか?
    類似点:生き物とカニの生き物が動くとき、彼らは彼らが動いている方向に向きを変えません。彼らは両方とも、可能な移動場所のリストから次の場所をランダムに選択します。

    違い:カニの生き物は、その左または右にのみ移動します。生き物の可能な移動場所は、隣接する8つの隣接する場所のいずれかです。カニの生き物が動かないときは、ランダムに右または左に曲がります。生き物が動けないときは回らない。

      //@file:GridWorldCode/projects/critters/CrabCritter.java
      //@line: 77~91
      public void makeMove(Location loc)
    {
      if (loc.equals(getLocation()))
      {
          double r = Math.random();
          int angle;
          if (r < 0.5)
              angle = Location.LEFT;
          else
              angle = Location.RIGHT;
          setDirection(getDirection() + angle);
      }
      else
          super.makeMove(loc);
       }
    
      //@file:info/gridworld/actor/Critter.java
      //@line: 102~105
        public void makeMove(Location loc)
       {
      if (loc == null)
          removeSelfFromGrid();
      else
          moveTo(loc);
    }
    
  • CrabCritterは、移動する代わりにいつ回転するかをどのように判断しますか?
    makeMoveのパラメータlocがカニの生き物の現在の場所と等しい場合、移動する代わりに回転します

  • CrabCritterオブジェクトがお互いを食べないのはなぜですか?
    カニの生き物は、CritterクラスからprocessActorsメソッドを継承します。このメソッドは、岩でも生き物でもないアクターのみを削除します。CrabCritterはCritterであるため、CrabCritterは他の生き物を食べません。

おすすめ

転載: blog.csdn.net/winding125/article/details/109142561