您所写内容的直接转换是使用BitSet
. 它允许您获取位的交集/或、与、和非。你可以做:
BitSet move = new BitSet(9);
move.set(1); // going up
move.set(2); // also going down?
toByteArray()
您可以通过流式传输并在接收端重建它来发送这个相对打包的(EG通过网络)new BitSet(inputByteArray)
这些布尔值中有多少会或应该在有效的状态表达式中设置为真?
如果我们猜一个,我们可以做一些更简单的事情。EG 当 continue 为真时,所有其他值都将被忽略,并且(对我来说)上下或左右都为真是没有意义的。尽管在其他状态下同时按下一个或两个鼠标按钮可能是有意义的,并且类似地同时具有向上和向左和 turnQ 之类的功能,如果我们只允许一个状态,则可以简化问题。
IE 如果你代表状态,我会定义一个状态枚举并认为已经完成,有效地将布尔数组等效为单个数字,即枚举的基数。
public enum SingleAiMoves {
NONE, STOP,
LEFT, RIGHT,
UP, DOWN,
TURN_Q, TURN_E,
MOUSE1, MOUSE2
}
这一次只允许一个状态。
如果您需要组合多个状态,但只有有效的状态,您可以定义一组逻辑状态,例如:
public enum AiMove {
// u/d l/r q/e m1 m2 stop
STOP (null, null, null, false, false, true),
NONE (null, null, null, false, false, false),
UP (true, null, null, false, false, false),
DOWN (false, null, null, false, false, false),
LEFT (null, true, null, false, false, false),
RIGHT (null, false, null, false, false, false),
TURN_Q (null, null, true, false, false, false),
TURN_E (null, null, false, false, false, false),
MOUSE_1 (null, null, null, true, false, false),
MOUSE_2 (null, null, null, false, true, false),
MOUSE_1_2 (null, null, null, true, true, false),
UP_LEFT (true, true, null, false, false, false),
DOWN_LEFT (false, true, null, false, false, false),
... // some 108(?) combinations listed here.... ;
private final Boolean upDown;
private final Boolean leftRight;
private final Boolean turnQE;
private final boolean mouse1;
private final boolean mouse2;
private final boolean stop;
AiMove(Boolean upDown, Boolean leftRight, Boolean turnQE,
boolean mouse1, boolean mouse2, boolean stop) {
this.upDown = upDown;
this.leftRight = leftRight;
this.turnQE = turnQE;
this.mouse1 = mouse1;
this.mouse2 = mouse2;
this.stop = stop;
}
public boolean isStopped() { return stop; }
public boolean hasUp() { return Boolean.TRUE.equals(upDown); }
public boolean hasDown() { return Boolean.FALSE.equals(upDown); }
public boolean hasLeft() { return Boolean.TRUE.equals(leftRight); }
public boolean hasRight() { return Boolean.FALSE.equals(leftRight); }
public boolean hasTurnQ() { return Boolean.TRUE.equals(turnQE); }
public boolean hasTurnE() { return Boolean.FALSE.equals(turnQE); }
public boolean hasMouse1() { return mouse1; }
public boolean hasMouse2() { return mouse2; }
}
我个人认为,如果您走这条路,您可能会考虑表示比某些内部控制器输入更详细的状态。
此外,您还可以使用位标志或掩码,或者看起来更简洁,不花哨,EnumSet<SingleAiMoves>
但与上面的枚举不同,并且像您的数组和BitSet
,这将允许上下和/或左右的状态存在。
最后,因为我发现在上面的示例中编写所谓的有效组合的枚举乏味且相对不可读,您可以在枚举中使用 BitSet 并阐明枚举的构造。它可能以这种方式使用更多的内存。
public enum AiMove {
NONE (),
UP (0),
DOWN (1),
LEFT (2),
RIGHT (3),
TURN_Q (4),
TURN_E (5),
MOUSE_1 (6),
MOUSE_2 (7),
STOP (8),
MOUSE_1_2 (MOUSE_1, MOUSE_2),
UP_LEFT (UP, LEFT),
DOWN_LEFT (DOWN, LEFT),
... // some 108(?) combinations listed here.... ;
private final BitSet bitsUDLRQE12S = new BitSet(9);
AiMove(int index) {
bitsUDLRQE12S.set(index);
}
AiMove(AiMove... moves) {
for (AiMove move : moves) {
bitsUDLRQE12S.or(move.getBitSet());
}
}
private BitSet getBitSet() { return bitsUDLRQE12S; }
public boolean hasUp() { return bitsUDLRQE12S.get(0); }
public boolean hasDown() { return bitsUDLRQE12S.get(1); }
public boolean hasLeft() { return bitsUDLRQE12S.get(2); }
public boolean hasRight() { return bitsUDLRQE12S.get(3); }
public boolean hasTurnQ() { return bitsUDLRQE12S.get(4); }
public boolean hasTurnE() { return bitsUDLRQE12S.get(5); }
public boolean hasMouse1() { return bitsUDLRQE12S.get(6); }
public boolean hasMouse2() { return bitsUDLRQE12S.get(7); }
public boolean isStopped() { return bitsUDLRQE12S.get(8); }
}