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
|
use std::str::Chars;
use crate::bitboard::Bitboard;
/// Aliases to board square indexes
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, num_enum::FromPrimitive)]
#[repr(u8)]
pub enum Square {
#[default]
A1, B1, C1, D1, E1, F1, G1, H1,
A2, B2, C2, D2, E2, F2, G2, H2,
A3, B3, C3, D3, E3, F3, G3, H3,
A4, B4, C4, D4, E4, F4, G4, H4,
A5, B5, C5, D5, E5, F5, G5, H5,
A6, B6, C6, D6, E6, F6, G6, H6,
A7, B7, C7, D7, E7, F7, G7, H7,
A8, B8, C8, D8, E8, F8, G8, H8,
}
impl Square {
pub fn from_coords(rank: u8, file: u8) -> Self {
Self::from(rank * 8 + file)
}
pub fn to_bitboard(&self) -> Bitboard {
1u64 << *self as u8
}
/// 0-based rank
pub fn rank(&self) -> u8 {
*self as u8 / 8
}
/// 0-based file
pub fn file(&self) -> u8 {
*self as u8 % 8
}
pub fn nort_one(&self) -> Self {
Self::from(*self as u8 + 8)
}
pub fn sout_one(&self) -> Self {
Self::from(*self as u8 - 8)
}
/// Warning: this wraps which is not what you might expect!
pub fn west_one(&self) -> Self {
Self::from(*self as u8 - 1)
}
/// Warning: this wraps which is not what you might expect!
pub fn east_one(&self) -> Self {
Self::from(*self as u8 + 1)
}
pub fn from_notation(chars: &mut Chars) -> Result<Self, String> {
let file = match chars.next() {
Some(ch) => {
match ch {
'a' => 0,
'b' => 1,
'c' => 2,
'd' => 3,
'e' => 4,
'f' => 5,
'g' => 6,
'h' => 7,
_ => return Err(String::from("Incorrect file!"))
}
},
None => return Err(String::from("Missing file"))
};
let rank = match chars.next() {
Some(ch) => {
match ch.to_digit(10) {
Some(digit) => digit - 1,
None => return Err(String::from("Incorrect rank"))
}
}
None => return Err(String::from("Missing rank"))
};
Ok(Self::from_coords(rank as u8, file))
}
}
|