tangled
alpha
login
or
join now
nove.dev
/
outsider
0
fork
atom
cleanroom implementation of a chess engine. doesn't work :)
0
fork
atom
overview
issues
pulls
pipelines
Change how move parsing works
nove.dev
8 months ago
53059657
0ce191f5
+30
-40
1 changed file
expand all
collapse all
unified
split
src
lib.rs
+30
-40
src/lib.rs
···
9
9
}
10
10
11
11
impl Piece {
12
12
+
fn from_char(ch: char) -> Option<Self> {
13
13
+
Some(match ch {
14
14
+
'N' => Self::Knight,
15
15
+
'B' => Self::Bishop,
16
16
+
'R' => Self::Rook,
17
17
+
'Q' => Self::Queen,
18
18
+
'K' => Self::King,
19
19
+
'P' => Self::Pawn,
20
20
+
_ => return None,
21
21
+
})
22
22
+
}
12
23
fn value(self) -> i32 {
13
24
match self {
14
25
Piece::Pawn => 1,
···
90
101
white_value - black_value
91
102
}
92
103
fn make_move(&mut self, algebra: &str) {
93
93
-
let mover = if self.white_to_move {
94
94
-
&mut self.white
95
95
-
} else {
96
96
-
&mut self.black
97
97
-
};
98
98
-
let nonmover = if self.white_to_move {
99
99
-
&mut self.black
104
104
+
let (mover, non_mover) = if self.white_to_move {
105
105
+
(&mut self.white, &mut self.black)
100
106
} else {
101
101
-
&mut self.white
107
107
+
(&mut self.black, &mut self.white)
102
108
};
103
103
-
104
109
if algebra == "O-O" || algebra == "0-0" {
105
110
mover
106
111
.iter_mut()
···
124
129
.unwrap()
125
130
.file = 3;
126
131
} else {
127
127
-
let first_char = algebra.chars().next().unwrap();
128
128
-
let piece = if first_char.is_ascii_uppercase() {
129
129
-
match first_char {
130
130
-
'R' => Piece::Rook,
131
131
-
'N' => Piece::Knight,
132
132
-
'B' => Piece::Bishop,
133
133
-
'K' => Piece::King,
134
134
-
'Q' => Piece::Queen,
135
135
-
_ => unreachable!(),
136
136
-
}
137
137
-
} else {
138
138
-
Piece::Pawn
139
139
-
};
140
140
-
141
141
-
if (piece == Piece::Pawn) {
142
142
-
let file = first_char as usize;
143
143
-
let rank = algebra.chars().nth(1).unwrap() as usize - 'a' as usize;
144
144
-
if algebra.len() == 2 {
145
145
-
nonmover.retain(|lp| lp.rank != rank && lp.file != file);
146
146
-
mover
147
147
-
.iter_mut()
148
148
-
.find(|lp| {
149
149
-
lp.file == file
150
150
-
&& lp.piece == Piece::Pawn
151
151
-
&& self.valid_moves(lp).includes((rank, file))
152
152
-
})
153
153
-
.unwrap()
154
154
-
.rank = rank;
132
132
+
let mut move_segments = vec![];
133
133
+
let mut iter = algebra.chars();
134
134
+
while let Some(ch) = iter.next() {
135
135
+
if let Some(piece) = Piece::from_char(ch) {
136
136
+
move_segments.push(MoveSegment::Piece(piece));
137
137
+
} else if let Some(file) = ch.to_digit(10) {
138
138
+
move_segments.push(MoveSegment::File(file as usize));
139
139
+
} else if ch >= 'a' && ch <= 'h' {
140
140
+
move_segments.push(MoveSegment::Rank(ch as usize));
141
141
+
} else if ch == 'x' {
142
142
+
move_segments.push(MoveSegment::Captures)
143
143
+
} else if ch == '='
144
144
+
&& let Some(next) = iter.next() // if given bad notation this breaks, but the notation was unparseable anyway
145
145
+
&& let Some(piece) = Piece::from_char(next)
146
146
+
{
147
147
+
move_segments.push(MoveSegment::Promotion(piece));
155
148
}
156
149
}
157
157
-
158
158
-
let destination_square = todo!();
159
159
-
todo!()
160
150
}
161
151
}
162
152
}