Если бы я хранил массив в 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;
}
}
}
Ясно, что мне нужно только одно или другое (операция и или инициализированные значения). Также было бы здорово, если бы я мог использовать тип enum в его собственном определении, но я не могу. Так что строки вроде:
Bishop (null, ChessPieceId.Bishop),
...
White (ChessPieceId.White, null),
Нет.
Какой у меня был вопрос? Есть ли лучший способ, который я скучаю. Также я могу разобрать int порядкового числа в определенное значение перечисления, избегая всего этого оператора case?