1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
pub type Figure = usize;
pub const NO_FIGURE: Figure = 0;
pub const PAWN: Figure = 1;
pub const KNIGHT: Figure = 2;
pub const BISHOP: Figure = 3;
pub const ROOK: Figure = 4;
pub const QUEEN: Figure = 5;
pub const KING: Figure = 6;
pub const LANCER: Figure = 7;
pub const LANCERN: Figure = 8;
pub const LANCERNE: Figure = 9;
pub const LANCERE: Figure = 10;
pub const LANCERSE: Figure = 11;
pub const LANCERS: Figure = 12;
pub const LANCERSW: Figure = 13;
pub const LANCERW: Figure = 14;
pub const LANCERNW: Figure = 15;
pub const SENTRY: Figure = 16;
pub const JAILER: Figure = 17;
pub const FIGURE_FEN_SYMBOLS: [&str; 18] = [
".", "p", "n", "p", "r", "q", "k", "l", "ln", "lne", "le", "lse", "ls", "lsw", "lw", "lnw",
"s", "j",
];
pub trait FigureTrait {
fn symbol(self) -> &'static str;
}
impl FigureTrait for Figure {
fn symbol(self) -> &'static str {
FIGURE_FEN_SYMBOLS[self]
}
}
pub type Color = usize;
pub const BLACK: Color = 0;
pub const WHITE: Color = 1;
pub type Piece = usize;
pub const PIECE_FEN_SYMBOLS: [&str; 36] = [
".", ".", "p", "P", "n", "N", "p", "P", "r", "R", "q", "Q", "k", "K", "l", "L", "ln", "Ln",
"lne", "Lne", "le", "Le", "lse", "Lse", "ls", "Ls", "lsw", "Lsw", "lw", "Lw", "lnw", "Lnw",
"s", "S", "j", "J",
];
pub fn color_figure(col: Color, fig: Figure) -> Piece {
(2 * fig) + col
}
pub trait PieceTrait {
fn color(self) -> Color;
fn figure(self) -> Figure;
fn fen_symbol(self) -> &'static str;
fn san_symbol(self) -> &'static str;
fn uci_symbol(self) -> &'static str;
}
impl PieceTrait for Piece {
fn color(self) -> Color {
return if self & 1 == 0 { BLACK } else { WHITE };
}
fn figure(self) -> Figure {
self >> 1
}
fn fen_symbol(self) -> &'static str {
PIECE_FEN_SYMBOLS[self]
}
fn san_symbol(self) -> &'static str {
return color_figure(WHITE, self.figure()).fen_symbol();
}
fn uci_symbol(self) -> &'static str {
return self.figure().symbol();
}
}