开发者

Homework assignment related to inheritance

Greetings. I've completed a project for school with all but one requirement.

The requirement is:

Notice that the SeaCreature class defines four constants for the various directions. Make sure to use them.Your code should not depend upon the specific values assigned to these constants, although you may assume they will always be of type int.

I don't see the value in this. The constant values assigned are logical and allow for easy use of Random to return a direction. If the values assigned were four non consecutive numbers that would really complicate the code.

Below is the original SeaCreature class mentioned in the assignment, and then the code for one of my creatures that makes use of Random. Other than assigning new values to NORTH, SOUTH, EAST, WEST in each class that involves random movement, is there a cleaner way to return the cardinal directions as opposed to their values of 0-3?

Thank you in advance for your advice, and please ask if any clarification is needed.

import java.util.*;
/**
 * Defines the attributes and behaviors common to all SeaCreatures in order to participate
 * in the SeaCreature simulation.
 * 
 * Each SeaCreature is represented by a char.
 * Each SeaCreature can answer back its char when asked.
 * Each SeaCreature can answer its next move, NORTH, SOUTH, EAST, WEST.
 * 
 */

public abstract class SeaCreature {
    private char ch;

    /** defined constant to facilitate random movement*/
    public static final Random rand = new Random();

    /** defined constant to move one unit NORTH */
    public static final int NORTH = 0;

     /** defined constant to move one unit SOUTH */
    public static final int SOUTH = 1;

     /** defined constant to move one unit EAST */
    public static final int EAST = 2;

     /** defined constant to move one unit WEST */
    public static final int WEST = 3;


    /**
     * Construct a SeaCreature object with the given character representation
     * @param c  the character for this SeaCreature
     */
    public SeaCreature (char c){
        ch = c;
    }

    /** 
     * Answers back the character representation for this SeaCreature
     * @return this SeaCreature's initial
     */
    public char getChar(){
        return ch;
    }

    /** Answers back the next move for this SeaCreature.
     *  Must be overridden by subclasses
     * @return NORTH, SOUTH, EAST, or WEST
     */
    public abstract int getMove(); 
}

My SeaLion class:

/**
 * Defines the attributes and behaviors specific to SeaLions in order to participate 
 * in the SeaCreature simulation.
 * 
 * @author Justin Ashburn
 * @version 6/5/2011
 */
public class SeaLion extends SeaCreature {

    /** defined char to represent a SeaLion*/
    private static final char SEALION = 'L';

    /** defined steps before SeaLion cycle repeats*/    
    private static final int CYCLE_LENGTH = 3;

    /** defined steps before SeaLion's first direction*/
    private static final int DIRECTION_ONE_LENGTH = 2;

    private int directionOne;

    private int count;

    /**
     * Construct a SeaLion object with the given character representation
     */
    public SeaLion(){
        super(SEALION);
        // establishes an initial direction
        directionOne = rand.nextInt(4);
        count = 0;        

    }

    /** Moves like the 'Knight' chess piece. ie. Picks a random direction, moves 2 times
     * in that direction, and then randomly chooses a direction perpendicular to the first
     * and moves in that direction once.
     * 
     * @return 0, 1, 2, or 3
     */
    public int getMove() {
        int direction;
        int directionTwo;
        // continues with direction one for the appropriate length
        if (count < DIRECTION_ONE_LENGTH) {
            count ++;
            direct开发者_如何学编程ion = directionOne;
        }
        // if directionOne was east or west chooses a new north or south direction for last move
        else if (count < CYCLE_LENGTH && directionOne > 1) {
            directionTwo = rand.nextInt(2);
            direction = directionTwo;
            // resets count and establishes new direction in next cycle
            count = 0;
            directionOne = rand.nextInt(4);
        }
        // if directionOne was north or south chooses a new east or west direction for last move        
        else { 
            directionTwo = rand.nextInt(2) + 2;
            direction = directionTwo;            
            // resets count and establishes new direction in next cycle
            count = 0;           
            directionOne = rand.nextInt(4);
        }
        return direction;
    }
}


What you need is a simple mapping from integers between 0 and 3 to the values of the 4 named constants ... without making any assumptions about what those values are.

How could you implement that?

Hint: What simple Java data structure maps from (zero to length - 1) to something else?


I think I would do something like this:

private static final int AXES[][] = {
    {NORTH,SOUTH},
    {EAST,WEST}
};

...

private int directionOne;
private int directionTwo;
private int count;

...

public SeaLion(){
    super(SEALION);
    // establishes an initial direction
    nextCycle();
}

...

public int getMove() {
    int direction;
    if (count < DIRECTION_ONE_LENGTH) {
        direction = directionOne;
    } else {
        direction = directionTwo;
    }
    ++count;
    if (count == CYCLE_LENGTH) {
        nextCycle();
    }
    return direction;
}

...

private void nextCycle() {
    int axis1 = random.nextInt(2);
    int axis2 = 1 - axis1;
    directionOne = AXES[axis1][random.nextInt(2)];
    directionTwo = AXES[axis2][random.nextInt(2)];
    count = 0;        
}


You could let NORTH, SOUTH, WEST, and EAST be either direction or heading, as following:

Heading:

public static final int NORTH = 0;
public static final int SOUTH = 180;
public static final int EAST = 90;
public static final int WEST = 270; // Or -90

Direction:

public static final int NORTH = 90;
public static final int SOUTH = 270; // Or -90
public static final int EAST = 0;
public static final int WEST = 180;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜