如果我在 C 中保留一个表示棋盘的数组,我可能会用大致如下所示的枚举项填充它:
enum CHESSPIECE {
none = 0,
pawn, knight, bishop, rook, queen, king,
type_mask = 7,
white = 8,
white_pawn, white_knight, white_bishop, white_rook, white_queen, white_king,
black = 16,
black_pawn, black_kight, black_bishop, black_rook, black_queen, black_king,
color_mask = 24
} chessPiece;
因此允许看起来像这样的逻辑:
if (board[i][j] & color_mask == currentColor)
{
impossibleMove = true; // or some-such
}
在 Java 中,我只是发现不支持对枚举的按位 & 操作,此外,相当棒的 EnumSet 并不容易应用,因为一块不能是黑白的,车不能是国王的。
所以我的想法是这样的:
public enum ChessPieceId {
None (null, null),
Pawn (null, null),
Knight (null, null),
Bishop (null, null),
Rook (null, null),
Queen (null, null),
King (null, null),
Type_Mask (null, null),
White (null, null),
White_Pawn (ChessPieceId.White, ChessPieceId.Pawn),
White_Knight (ChessPieceId.White, ChessPieceId.Knight),
White_Bishop (ChessPieceId.White, ChessPieceId.Bishop),
White_Rook (ChessPieceId.White, ChessPieceId.Rook),
White_Queen (ChessPieceId.White, ChessPieceId.Queen),
White_King (ChessPieceId.White, ChessPieceId.King),
SkipA (null, null),
Black (null, null),
Black_Pawn (ChessPieceId.Black, ChessPieceId.Pawn),
Black_Knight (ChessPieceId.Black, ChessPieceId.Knight),
Black_Bishop (ChessPieceId.Black, ChessPieceId.Bishop),
Black_Rook (ChessPieceId.Black, ChessPieceId.Rook),
Black_Queen (ChessPieceId.Black, ChessPieceId.Queen),
Black_King (ChessPieceId.Black, ChessPieceId.King),
SkipB (null, null),
Color_Mask (null, null);
private final ChessPieceId color;
private final ChessPieceId type;
ChessPieceId(ChessPieceId pColor, ChessPieceId pType){
this.color = pColor;
this.type = pType;
}
ChessPieceId color() { return color; }
ChessPieceId type() { return type; }
// & operator should be built in. I considered an EnumSet but...
ChessPieceId and(ChessPieceId pSecond) {
switch(ChessPieceId.this.ordinal() & pSecond.ordinal()) {
case 0: //None.ordinal() etc. [if only Java were smarter]
return None;
case 1: return Pawn;
case 2: return Knight;
case 3: return Bishop;
case 4: return Rook;
case 5: return Queen;
case 6: return King;
case 7: return Type_Mask;
case 8: return White;
case 9: return White_Pawn;
case 10: return White_Knight;
case 11: return White_Rook;
case 12: return White_Bishop;
case 13: return White_Queen;
case 14: return White_King;
//case 15: return SkipA;
case 16: return Black;
case 17: return Black_Pawn;
case 18: return Black_Knight;
case 19: return Black_Rook;
case 20: return Black_Bishop;
case 21: return Black_Queen;
case 22: return Black_King;
//case 23: return SkipB;
case 24: return Color_Mask;
default:
return None;
}
}
}
显然我只需要一个或另一个(and 操作,或初始化值)。如果我可以在它自己的定义中使用枚举类型,那肯定会很棒,但我不能。所以像这样的行:
Bishop (null, ChessPieceId.Bishop),
...
White (ChessPieceId.White, null),
出局。
我的问题是什么?有没有更好的方法,我错过了。我也可以将序数的 int 解析为枚举定义的值,避免整个 case 语句吗?