part4

Conjunto 7

  • ¿Qué métodos se implementan en Critter?
    act 、 getActors 、 processActors 、 getMoveLocations 、 selectionMoveLocation 、 makeMove

  • ¿Cuáles son las cinco acciones básicas comunes a todas las criaturas cuando actúan?
    getActors 、 processActors 、 getMoveLocations 、 selectionMoveLocation 、 makeMove

  • ¿Deberían las subclases de Critter anular el método getActors? Explique.
    Sí, si la nueva subclase de criaturas selecciona a sus actores de diferentes ubicaciones, deberá anular este método.

  • Describe la forma en que una criatura podría procesar a los actores.
    uno es hacer que todos los actores en su lista cambien de color, dos es comerlos a todos, tres es pedirles que se muevan

  • ¿Qué tres métodos deben invocarse para hacer que una criatura se mueva? Explique cada uno de estos métodos.
    getMoveLocations, selectMoveLocation, makeMove

    Mover una criatura es un proceso de tres pasos. Primero, el método act llama al método getMoveLocations. Para una criatura básica, este método devuelve una lista de todas las ubicaciones adyacentes vacías alrededor de la criatura. Después de recibir la lista de posibles ubicaciones vacías, selectMoveLocation elige aleatoriamente una de las ubicaciones y devuelve esa ubicación. Si no hay ubicaciones vacías para elegir, selectMoveLocation devuelve la ubicación actual de la criatura. La ubicación devuelta luego se pasa al método makeMove y la criatura se mueve a la nueva ubicación

      //@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);
      }
    
  • ¿Por qué no hay un constructor de Critter?
    Critter extiende Actor. La clase Actor tiene un constructor predeterminado. Si no crea un constructor en una clase, Java escribirá un constructor predeterminado para usted. El constructor predeterminado de Critter que proporciona Java llamará a super (), que llama al constructor predeterminado de Actor. El constructor predeterminado de Actor creará una criatura azul que mira hacia el norte.

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

Conjunto 8

  • ¿Por qué actuar hace que un ChameleonCritter actúe de manera diferente a un Critter aunque ChameleonCritter no anula el acto?
    El método act llama a getActors, processActors, getMoveLocations, selectMoveLocation y makeMove. La clase ChameleonCritter anula los métodos processActors y makeMove. Por lo tanto, llamar a actuar para un ChameleonCritter producirá un comportamiento diferente al de llamar a actuar para un 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);
      }
    
  • ¿Por qué el método makeMove de ChameleonCritter llama a super.makeMove?
    El método makeMove del ChameleonCritter primero cambia la dirección de la criatura para enfrentar su nueva ubicación. Luego llama a super.makeMove de la clase Critter para moverse realmente a la nueva ubicación. Después de que cambia su dirección, se comporta como (makeMove like) un Critter.

      //@file:info/gridworld/actor/Critter.java
      //@line: 125~131
        public void makeMove(Location loc)
       {
    	  if (loc == null)
         	 removeSelfFromGrid();
      	else
         	 moveTo(loc);
       }
    
  • ¿Cómo haría que ChameleonCritter dejara caer flores en su ubicación anterior cuando se mueve?
    Modifique el método makeMove para colocar flores en la ubicación anterior. Se necesita una variable para realizar un seguimiento de la ubicación actual de ChameleonCritter. Después de que la criatura se mueva, coloque una flor en su ubicación anterior solo si la criatura realmente se mudó a una nueva ubicación. Vea el método makeMove modificado a continuación.

      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);
      	}
      }
    

* ¿Por qué ChameleonCritter no anula el método getActors?

Porque procesa la misma lista de actores que su clase base Critter. Dado que ChameleonCritter no define un nuevo comportamiento para getActors, no es necesario anular este método.

  • ¿Qué clase contiene el método getLocation?
    La clase Actor contiene el método getLocation. Todas las subclases de Actor heredan este método

      //@file:info/gridworld/actor/Actor.java
      //@line: 102~105
       public Location getLocation()
      {
      	 return location;
       }
    
  • ¿Cómo puede un bicho acceder a su propia red?
    Una criatura puede acceder a su cuadrícula llamando al método getGrid que hereda de la clase Actor.

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

Conjunto 9

  • ¿Por qué CrabCritter no anula el método processActors?
    Un CrabCritter procesa sus actores comiendo todos los vecinos devueltos cuando se llama a getActors. Este es el mismo comportamiento que hereda de su clase básica Critter. No es necesario anular este método.

  • Describe el proceso que utiliza un CrabCritter para encontrar y comerse a otros actores. ¿Se come siempre a todos los actores vecinos? Explique.
    El método getActors de CrabCritter solo busca vecinos que estén inmediatamente delante de la criatura cangrejo y en sus ubicaciones frontal derecha e izquierda. Cualquier vecino que se encuentre en estas ubicaciones será "devorado" cuando se llame al método processActors. Los actores en las otras ubicaciones vecinas no serán molestados.

      //@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;
       }
    
  • ¿Por qué se utiliza el método getLocationsInDirections en CrabCritter?
    El parámetro de este método trae una serie de direcciones. Para la criatura cangrejo, esta matriz contiene las direcciones de los posibles vecinos que este cangrejo puede comer. El método getLocationsInDirections usa esta matriz para determinar y devolver ubicaciones adyacentes válidas de esta criatura en las direcciones dadas por el parámetro de matriz

      //@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;
    }   
    
  • Si un CrabCritter tiene la ubicación (3, 4) y mira hacia el sur, ¿cuáles son las posibles ubicaciones para los actores que son devueltos por una llamada al método getActors?
    (4,3), (4,4) y (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;
     }
    
  • ¿Cuáles son las similitudes y diferencias entre los movimientos de un CrabCritter y un Critter?
    Similitudes: cuando las criaturas y los cangrejos se mueven, no giran en la dirección en la que se mueven. Ambos eligen al azar su próxima ubicación de su lista de posibles ubicaciones de movimiento.

    Diferencias: una criatura cangrejo solo se moverá a su izquierda o derecha. Las posibles ubicaciones de movimiento de una criatura son cualquiera de sus ocho ubicaciones vecinas adyacentes. Cuando una criatura cangrejo no puede moverse, girará aleatoriamente hacia la derecha o hacia la izquierda. Cuando una criatura no puede moverse, no gira.

      //@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);
    }
    
  • ¿Cómo determina un CrabCritter cuándo gira en lugar de moverse?
    Si el parámetro loc en makeMove es igual a la ubicación actual de la criatura cangrejo, gira en lugar de moverse

  • ¿Por qué los objetos CrabCritter no se comen entre sí?
    Una criatura cangrejo hereda el método processActors de la clase Critter. Este método solo elimina actores que no son rocas ni criaturas. Dado que un CrabCritter es un Critter, un cangrejo no se comerá a ningún otro bicho.

Supongo que te gusta

Origin blog.csdn.net/winding125/article/details/109142561
Recomendado
Clasificación