我正在做一个简单的游戏,在这个游戏中,我需要追踪物体的基本方向。我尝试使用枚举的序数值,以及使用开关旋转,但两者似乎都错了。这就是我最后的下场。以下是一个适当的解决办法吗?
// Defines cardinal direction
public enum Direction {
NORTH(0) {
@Override
public String getMessage() {
return getDegrees() + " degrees due north";
}
},
EAST(90) {
@Override
public String getMessage() {
return getDegrees() + " degrees due east";
}
},
SOUTH(180) {
@Override
public String getMessage() {
return getDegrees() + " degrees due south";
}
},
WEST(270) {
@Override
public String getMessage() {
return getDegrees() + " degrees due west";
}
};
private final int degrees;
public abstract String getMessage();
private Direction(final int degrees) {
this.degrees = degrees;
}
public int getDegrees() {
return degrees;
}
private static final Map<Integer, Direction> lookup = new HashMap<Integer, Direction>();
static {
for (Direction d : EnumSet.allOf(Direction.class))
lookup.put(d.getDegrees(), d);
}
public static Direction get(int degrees) {
return lookup.get(degrees);
}
public Direction rotateRight() {
return Direction.get((degrees + 90) % 360);
}
public Direction rotateLeft() {
return Direction.get((degrees + 270) % 360);
}
}发布于 2014-01-03 06:22:44
从概念上讲,这是一个很好的解决方案。我可以建议一些改变,但实际上它们是小的。它也将是‘乐趣’调整它abit,但在更大的图景,变化将是微小的.还是..。
我最大的观察是,构造函数可以简化很多。与其让每个Enum成员创建一个唯一的方法实现(而且该方法每次构建一个字符串--尽管编译器可能会修复它),不如使用以下方法来简化它:
private final int degrees;
private final String message;
private Direction(final int degrees, final String name) {
this.degrees = degrees;
this.message = degrees + " degrees due " + name;
}
public int getDegrees() {
return degrees;
}
public String getMessage() {
return message;
}通过对构造函数的更改,您可以:
getMessage()时重新创建它。除此之外,代码相当不错,但是,有一种方法可以“玩”查找系统,只使用序数.考虑一下下面的代码(我让你来找出.);-):
public static Direction get(final int degrees) {
int ordinal = ((degrees % 360) / 90) - ( 4 * (degrees % 90));
return ordinal < 0 ? null : values()[ordinal];
} https://codereview.stackexchange.com/questions/38473
复制相似问题